// 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 aaa { 
struct  AA1  {
  int pa;
  virtual void  foo(); // _ZN3aaa3AA13fooEv
  ~AA1(); // tgen
  AA1(); // tgen
};
//SIG(-1 _ZN3aaa3AA1E) C1{ v1 Fi}
}
namespace aaa { 
void  aaa::AA1 ::foo(){vfunc_called(this, "_ZN3aaa3AA13fooEv");}
aaa::AA1 ::~AA1(){ note_dtor("_ZN3aaa3AA1E", this);} // tgen
aaa::AA1 ::AA1(){ note_ctor("_ZN3aaa3AA1E", this);} // tgen
}
static void Test__ZN3aaa3AA1E()
{
  extern Class_Descriptor cd__ZN3aaa3AA1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3AA1E, buf);
    ::aaa::AA1 *dp, &lv = *(dp=new (buf) ::aaa::AA1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3AA1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3AA1E)");
    check_field_offset(lv, pa, ABISELECT(8,4), "_ZN3aaa3AA1E.pa");
    test_class_info(&lv, &cd__ZN3aaa3AA1E);
    dp->::aaa::AA1::~AA1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3AA1E(Test__ZN3aaa3AA1E, "_ZN3aaa3AA1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3AA1C1Ev();
extern void _ZN3aaa3AA1D1Ev();
Name_Map name_map__ZN3aaa3AA1E[] = {
  NSPAIR(_ZN3aaa3AA1C1Ev),
  NSPAIR(_ZN3aaa3AA1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern void _ZN3aaa3AA13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa3AA1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3AA1E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
Class_Descriptor cd__ZN3aaa3AA1E = {  "_ZN3aaa3AA1E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3AA1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3AA1E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3AA1E),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 aaa { 
struct  BB1  {
  int pb;
  virtual void  foo(); // _ZN3aaa3BB13fooEv
  ~BB1(); // tgen
  BB1(); // tgen
};
//SIG(-1 _ZN3aaa3BB1E) C1{ v1 Fi}
}
namespace aaa { 
void  aaa::BB1 ::foo(){vfunc_called(this, "_ZN3aaa3BB13fooEv");}
aaa::BB1 ::~BB1(){ note_dtor("_ZN3aaa3BB1E", this);} // tgen
aaa::BB1 ::BB1(){ note_ctor("_ZN3aaa3BB1E", this);} // tgen
}
static void Test__ZN3aaa3BB1E()
{
  extern Class_Descriptor cd__ZN3aaa3BB1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3BB1E, buf);
    ::aaa::BB1 *dp, &lv = *(dp=new (buf) ::aaa::BB1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3BB1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3BB1E)");
    check_field_offset(lv, pb, ABISELECT(8,4), "_ZN3aaa3BB1E.pb");
    test_class_info(&lv, &cd__ZN3aaa3BB1E);
    dp->::aaa::BB1::~BB1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3BB1E(Test__ZN3aaa3BB1E, "_ZN3aaa3BB1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3BB1C1Ev();
extern void _ZN3aaa3BB1D1Ev();
Name_Map name_map__ZN3aaa3BB1E[] = {
  NSPAIR(_ZN3aaa3BB1C1Ev),
  NSPAIR(_ZN3aaa3BB1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa3BB1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3BB1E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
Class_Descriptor cd__ZN3aaa3BB1E = {  "_ZN3aaa3BB1E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3BB1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3BB1E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3BB1E),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 aaa { 
struct  CC1  {
  int pc;
  virtual void  foo(); // _ZN3aaa3CC13fooEv
  ~CC1(); // tgen
  CC1(); // tgen
};
//SIG(1 _ZN3aaa3CC1E) C1{ v1 Fi}
}
namespace aaa { 
void  aaa::CC1 ::foo(){vfunc_called(this, "_ZN3aaa3CC13fooEv");}
aaa::CC1 ::~CC1(){ note_dtor("_ZN3aaa3CC1E", this);} // tgen
aaa::CC1 ::CC1(){ note_ctor("_ZN3aaa3CC1E", this);} // tgen
}
static void Test__ZN3aaa3CC1E()
{
  extern Class_Descriptor cd__ZN3aaa3CC1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3CC1E, buf);
    ::aaa::CC1 *dp, &lv = *(dp=new (buf) ::aaa::CC1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3CC1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3CC1E)");
    check_field_offset(lv, pc, ABISELECT(8,4), "_ZN3aaa3CC1E.pc");
    test_class_info(&lv, &cd__ZN3aaa3CC1E);
    dp->::aaa::CC1::~CC1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3CC1E(Test__ZN3aaa3CC1E, "_ZN3aaa3CC1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3CC1C1Ev();
extern void _ZN3aaa3CC1D1Ev();
Name_Map name_map__ZN3aaa3CC1E[] = {
  NSPAIR(_ZN3aaa3CC1C1Ev),
  NSPAIR(_ZN3aaa3CC1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3CC1E[];
extern void _ZN3aaa3CC13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa3CC1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3CC1E[0]),
  (VTBL_ENTRY)&_ZN3aaa3CC13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa3CC1E[];
extern  VTBL_ENTRY _ZTVN3aaa3CC1E[];
Class_Descriptor cd__ZN3aaa3CC1E = {  "_ZN3aaa3CC1E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3CC1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3CC1E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3CC1E),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 aaa { 
struct  DD1  {
  int pd;
  virtual void  foo(); // _ZN3aaa3DD13fooEv
  ~DD1(); // tgen
  DD1(); // tgen
};
//SIG(1 _ZN3aaa3DD1E) C1{ v1 Fi}
}
namespace aaa { 
void  aaa::DD1 ::foo(){vfunc_called(this, "_ZN3aaa3DD13fooEv");}
aaa::DD1 ::~DD1(){ note_dtor("_ZN3aaa3DD1E", this);} // tgen
aaa::DD1 ::DD1(){ note_ctor("_ZN3aaa3DD1E", this);} // tgen
}
static void Test__ZN3aaa3DD1E()
{
  extern Class_Descriptor cd__ZN3aaa3DD1E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3DD1E, buf);
    ::aaa::DD1 *dp, &lv = *(dp=new (buf) ::aaa::DD1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3DD1E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3DD1E)");
    check_field_offset(lv, pd, ABISELECT(8,4), "_ZN3aaa3DD1E.pd");
    test_class_info(&lv, &cd__ZN3aaa3DD1E);
    dp->::aaa::DD1::~DD1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3DD1E(Test__ZN3aaa3DD1E, "_ZN3aaa3DD1E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3DD1C1Ev();
extern void _ZN3aaa3DD1D1Ev();
Name_Map name_map__ZN3aaa3DD1E[] = {
  NSPAIR(_ZN3aaa3DD1C1Ev),
  NSPAIR(_ZN3aaa3DD1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3DD1E[];
extern void _ZN3aaa3DD13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa3DD1E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3DD1E[0]),
  (VTBL_ENTRY)&_ZN3aaa3DD13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa3DD1E[];
extern  VTBL_ENTRY _ZTVN3aaa3DD1E[];
Class_Descriptor cd__ZN3aaa3DD1E = {  "_ZN3aaa3DD1E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3DD1E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3DD1E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3DD1E),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 aaa { 
struct  AA2  {
  int pa;
  virtual void  bar(); // _ZN3aaa3AA23barEv
  ~AA2(); // tgen
  AA2(); // tgen
};
//SIG(-1 _ZN3aaa3AA2E) C1{ v1 Fi}
}
namespace aaa { 
void  aaa::AA2 ::bar(){vfunc_called(this, "_ZN3aaa3AA23barEv");}
aaa::AA2 ::~AA2(){ note_dtor("_ZN3aaa3AA2E", this);} // tgen
aaa::AA2 ::AA2(){ note_ctor("_ZN3aaa3AA2E", this);} // tgen
}
static void Test__ZN3aaa3AA2E()
{
  extern Class_Descriptor cd__ZN3aaa3AA2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3AA2E, buf);
    ::aaa::AA2 *dp, &lv = *(dp=new (buf) ::aaa::AA2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3AA2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3AA2E)");
    check_field_offset(lv, pa, ABISELECT(8,4), "_ZN3aaa3AA2E.pa");
    test_class_info(&lv, &cd__ZN3aaa3AA2E);
    dp->::aaa::AA2::~AA2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3AA2E(Test__ZN3aaa3AA2E, "_ZN3aaa3AA2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3AA2C1Ev();
extern void _ZN3aaa3AA2D1Ev();
Name_Map name_map__ZN3aaa3AA2E[] = {
  NSPAIR(_ZN3aaa3AA2C1Ev),
  NSPAIR(_ZN3aaa3AA2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern void _ZN3aaa3AA23barEv();
static  VTBL_ENTRY vtc__ZN3aaa3AA2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3AA2E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
Class_Descriptor cd__ZN3aaa3AA2E = {  "_ZN3aaa3AA2E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3AA2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3AA2E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3AA2E),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 aaa { 
struct  BB2  {
  int pb;
  virtual void  bar(); // _ZN3aaa3BB23barEv
  ~BB2(); // tgen
  BB2(); // tgen
};
//SIG(-1 _ZN3aaa3BB2E) C1{ v1 Fi}
}
namespace aaa { 
void  aaa::BB2 ::bar(){vfunc_called(this, "_ZN3aaa3BB23barEv");}
aaa::BB2 ::~BB2(){ note_dtor("_ZN3aaa3BB2E", this);} // tgen
aaa::BB2 ::BB2(){ note_ctor("_ZN3aaa3BB2E", this);} // tgen
}
static void Test__ZN3aaa3BB2E()
{
  extern Class_Descriptor cd__ZN3aaa3BB2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3BB2E, buf);
    ::aaa::BB2 *dp, &lv = *(dp=new (buf) ::aaa::BB2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3BB2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3BB2E)");
    check_field_offset(lv, pb, ABISELECT(8,4), "_ZN3aaa3BB2E.pb");
    test_class_info(&lv, &cd__ZN3aaa3BB2E);
    dp->::aaa::BB2::~BB2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3BB2E(Test__ZN3aaa3BB2E, "_ZN3aaa3BB2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3BB2C1Ev();
extern void _ZN3aaa3BB2D1Ev();
Name_Map name_map__ZN3aaa3BB2E[] = {
  NSPAIR(_ZN3aaa3BB2C1Ev),
  NSPAIR(_ZN3aaa3BB2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa3BB2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3BB2E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
Class_Descriptor cd__ZN3aaa3BB2E = {  "_ZN3aaa3BB2E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3BB2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3BB2E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3BB2E),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 aaa { 
struct  CC2  {
  int pc;
  virtual void  bar(); // _ZN3aaa3CC23barEv
  ~CC2(); // tgen
  CC2(); // tgen
};
//SIG(1 _ZN3aaa3CC2E) C1{ v1 Fi}
}
namespace aaa { 
void  aaa::CC2 ::bar(){vfunc_called(this, "_ZN3aaa3CC23barEv");}
aaa::CC2 ::~CC2(){ note_dtor("_ZN3aaa3CC2E", this);} // tgen
aaa::CC2 ::CC2(){ note_ctor("_ZN3aaa3CC2E", this);} // tgen
}
static void Test__ZN3aaa3CC2E()
{
  extern Class_Descriptor cd__ZN3aaa3CC2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3CC2E, buf);
    ::aaa::CC2 *dp, &lv = *(dp=new (buf) ::aaa::CC2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3CC2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3CC2E)");
    check_field_offset(lv, pc, ABISELECT(8,4), "_ZN3aaa3CC2E.pc");
    test_class_info(&lv, &cd__ZN3aaa3CC2E);
    dp->::aaa::CC2::~CC2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3CC2E(Test__ZN3aaa3CC2E, "_ZN3aaa3CC2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3CC2C1Ev();
extern void _ZN3aaa3CC2D1Ev();
Name_Map name_map__ZN3aaa3CC2E[] = {
  NSPAIR(_ZN3aaa3CC2C1Ev),
  NSPAIR(_ZN3aaa3CC2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3CC2E[];
extern void _ZN3aaa3CC23barEv();
static  VTBL_ENTRY vtc__ZN3aaa3CC2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3CC2E[0]),
  (VTBL_ENTRY)&_ZN3aaa3CC23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa3CC2E[];
extern  VTBL_ENTRY _ZTVN3aaa3CC2E[];
Class_Descriptor cd__ZN3aaa3CC2E = {  "_ZN3aaa3CC2E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3CC2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3CC2E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3CC2E),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 aaa { 
struct  DD2  {
  int pd;
  virtual void  bar(); // _ZN3aaa3DD23barEv
  ~DD2(); // tgen
  DD2(); // tgen
};
//SIG(1 _ZN3aaa3DD2E) C1{ v1 Fi}
}
namespace aaa { 
void  aaa::DD2 ::bar(){vfunc_called(this, "_ZN3aaa3DD23barEv");}
aaa::DD2 ::~DD2(){ note_dtor("_ZN3aaa3DD2E", this);} // tgen
aaa::DD2 ::DD2(){ note_ctor("_ZN3aaa3DD2E", this);} // tgen
}
static void Test__ZN3aaa3DD2E()
{
  extern Class_Descriptor cd__ZN3aaa3DD2E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3DD2E, buf);
    ::aaa::DD2 *dp, &lv = *(dp=new (buf) ::aaa::DD2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3DD2E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3DD2E)");
    check_field_offset(lv, pd, ABISELECT(8,4), "_ZN3aaa3DD2E.pd");
    test_class_info(&lv, &cd__ZN3aaa3DD2E);
    dp->::aaa::DD2::~DD2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3DD2E(Test__ZN3aaa3DD2E, "_ZN3aaa3DD2E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3DD2C1Ev();
extern void _ZN3aaa3DD2D1Ev();
Name_Map name_map__ZN3aaa3DD2E[] = {
  NSPAIR(_ZN3aaa3DD2C1Ev),
  NSPAIR(_ZN3aaa3DD2D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3DD2E[];
extern void _ZN3aaa3DD23barEv();
static  VTBL_ENTRY vtc__ZN3aaa3DD2E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3DD2E[0]),
  (VTBL_ENTRY)&_ZN3aaa3DD23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa3DD2E[];
extern  VTBL_ENTRY _ZTVN3aaa3DD2E[];
Class_Descriptor cd__ZN3aaa3DD2E = {  "_ZN3aaa3DD2E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3DD2E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3DD2E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3DD2E),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 aaa { 
struct  AA3  {
  int pa;
  virtual void  foo(); // _ZN3aaa3AA33fooEv
  virtual void  bar(); // _ZN3aaa3AA33barEv
  ~AA3(); // tgen
  AA3(); // tgen
};
//SIG(-1 _ZN3aaa3AA3E) C1{ v1 v2 Fi}
}
namespace aaa { 
void  aaa::AA3 ::foo(){vfunc_called(this, "_ZN3aaa3AA33fooEv");}
void  aaa::AA3 ::bar(){vfunc_called(this, "_ZN3aaa3AA33barEv");}
aaa::AA3 ::~AA3(){ note_dtor("_ZN3aaa3AA3E", this);} // tgen
aaa::AA3 ::AA3(){ note_ctor("_ZN3aaa3AA3E", this);} // tgen
}
static void Test__ZN3aaa3AA3E()
{
  extern Class_Descriptor cd__ZN3aaa3AA3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3AA3E, buf);
    ::aaa::AA3 *dp, &lv = *(dp=new (buf) ::aaa::AA3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3AA3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3AA3E)");
    check_field_offset(lv, pa, ABISELECT(8,4), "_ZN3aaa3AA3E.pa");
    test_class_info(&lv, &cd__ZN3aaa3AA3E);
    dp->::aaa::AA3::~AA3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3AA3E(Test__ZN3aaa3AA3E, "_ZN3aaa3AA3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3AA3C1Ev();
extern void _ZN3aaa3AA3D1Ev();
Name_Map name_map__ZN3aaa3AA3E[] = {
  NSPAIR(_ZN3aaa3AA3C1Ev),
  NSPAIR(_ZN3aaa3AA3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa3AA33barEv();
static  VTBL_ENTRY vtc__ZN3aaa3AA3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3AA3E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
Class_Descriptor cd__ZN3aaa3AA3E = {  "_ZN3aaa3AA3E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3AA3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3AA3E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3AA3E),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 aaa { 
struct  BB3  {
  int pb;
  virtual void  foo(); // _ZN3aaa3BB33fooEv
  virtual void  bar(); // _ZN3aaa3BB33barEv
  ~BB3(); // tgen
  BB3(); // tgen
};
//SIG(-1 _ZN3aaa3BB3E) C1{ v1 v2 Fi}
}
namespace aaa { 
void  aaa::BB3 ::foo(){vfunc_called(this, "_ZN3aaa3BB33fooEv");}
void  aaa::BB3 ::bar(){vfunc_called(this, "_ZN3aaa3BB33barEv");}
aaa::BB3 ::~BB3(){ note_dtor("_ZN3aaa3BB3E", this);} // tgen
aaa::BB3 ::BB3(){ note_ctor("_ZN3aaa3BB3E", this);} // tgen
}
static void Test__ZN3aaa3BB3E()
{
  extern Class_Descriptor cd__ZN3aaa3BB3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3BB3E, buf);
    ::aaa::BB3 *dp, &lv = *(dp=new (buf) ::aaa::BB3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3BB3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3BB3E)");
    check_field_offset(lv, pb, ABISELECT(8,4), "_ZN3aaa3BB3E.pb");
    test_class_info(&lv, &cd__ZN3aaa3BB3E);
    dp->::aaa::BB3::~BB3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3BB3E(Test__ZN3aaa3BB3E, "_ZN3aaa3BB3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3BB3C1Ev();
extern void _ZN3aaa3BB3D1Ev();
Name_Map name_map__ZN3aaa3BB3E[] = {
  NSPAIR(_ZN3aaa3BB3C1Ev),
  NSPAIR(_ZN3aaa3BB3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern void _ZN3aaa3BB33fooEv();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa3BB3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3BB3E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
Class_Descriptor cd__ZN3aaa3BB3E = {  "_ZN3aaa3BB3E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3BB3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3BB3E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3BB3E),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 aaa { 
struct  CC3  {
  int pc;
  virtual void  foo(); // _ZN3aaa3CC33fooEv
  virtual void  bar(); // _ZN3aaa3CC33barEv
  ~CC3(); // tgen
  CC3(); // tgen
};
//SIG(1 _ZN3aaa3CC3E) C1{ v1 v2 Fi}
}
namespace aaa { 
void  aaa::CC3 ::foo(){vfunc_called(this, "_ZN3aaa3CC33fooEv");}
void  aaa::CC3 ::bar(){vfunc_called(this, "_ZN3aaa3CC33barEv");}
aaa::CC3 ::~CC3(){ note_dtor("_ZN3aaa3CC3E", this);} // tgen
aaa::CC3 ::CC3(){ note_ctor("_ZN3aaa3CC3E", this);} // tgen
}
static void Test__ZN3aaa3CC3E()
{
  extern Class_Descriptor cd__ZN3aaa3CC3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3CC3E, buf);
    ::aaa::CC3 *dp, &lv = *(dp=new (buf) ::aaa::CC3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3CC3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3CC3E)");
    check_field_offset(lv, pc, ABISELECT(8,4), "_ZN3aaa3CC3E.pc");
    test_class_info(&lv, &cd__ZN3aaa3CC3E);
    dp->::aaa::CC3::~CC3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3CC3E(Test__ZN3aaa3CC3E, "_ZN3aaa3CC3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3CC3C1Ev();
extern void _ZN3aaa3CC3D1Ev();
Name_Map name_map__ZN3aaa3CC3E[] = {
  NSPAIR(_ZN3aaa3CC3C1Ev),
  NSPAIR(_ZN3aaa3CC3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3CC3E[];
extern void _ZN3aaa3CC33fooEv();
extern void _ZN3aaa3CC33barEv();
static  VTBL_ENTRY vtc__ZN3aaa3CC3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3CC3E[0]),
  (VTBL_ENTRY)&_ZN3aaa3CC33fooEv,
  (VTBL_ENTRY)&_ZN3aaa3CC33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa3CC3E[];
extern  VTBL_ENTRY _ZTVN3aaa3CC3E[];
Class_Descriptor cd__ZN3aaa3CC3E = {  "_ZN3aaa3CC3E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3CC3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3CC3E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3CC3E),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 aaa { 
struct  DD3  {
  int pd;
  virtual void  foo(); // _ZN3aaa3DD33fooEv
  virtual void  bar(); // _ZN3aaa3DD33barEv
  ~DD3(); // tgen
  DD3(); // tgen
};
//SIG(1 _ZN3aaa3DD3E) C1{ v1 v2 Fi}
}
namespace aaa { 
void  aaa::DD3 ::foo(){vfunc_called(this, "_ZN3aaa3DD33fooEv");}
void  aaa::DD3 ::bar(){vfunc_called(this, "_ZN3aaa3DD33barEv");}
aaa::DD3 ::~DD3(){ note_dtor("_ZN3aaa3DD3E", this);} // tgen
aaa::DD3 ::DD3(){ note_ctor("_ZN3aaa3DD3E", this);} // tgen
}
static void Test__ZN3aaa3DD3E()
{
  extern Class_Descriptor cd__ZN3aaa3DD3E;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd__ZN3aaa3DD3E, buf);
    ::aaa::DD3 *dp, &lv = *(dp=new (buf) ::aaa::DD3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(_ZN3aaa3DD3E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa3DD3E)");
    check_field_offset(lv, pd, ABISELECT(8,4), "_ZN3aaa3DD3E.pd");
    test_class_info(&lv, &cd__ZN3aaa3DD3E);
    dp->::aaa::DD3::~DD3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa3DD3E(Test__ZN3aaa3DD3E, "_ZN3aaa3DD3E", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN3aaa3DD3C1Ev();
extern void _ZN3aaa3DD3D1Ev();
Name_Map name_map__ZN3aaa3DD3E[] = {
  NSPAIR(_ZN3aaa3DD3C1Ev),
  NSPAIR(_ZN3aaa3DD3D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTIN3aaa3DD3E[];
extern void _ZN3aaa3DD33fooEv();
extern void _ZN3aaa3DD33barEv();
static  VTBL_ENTRY vtc__ZN3aaa3DD3E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa3DD3E[0]),
  (VTBL_ENTRY)&_ZN3aaa3DD33fooEv,
  (VTBL_ENTRY)&_ZN3aaa3DD33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa3DD3E[];
extern  VTBL_ENTRY _ZTVN3aaa3DD3E[];
Class_Descriptor cd__ZN3aaa3DD3E = {  "_ZN3aaa3DD3E", // class name
  0,0,//no base classes
  &(vtc__ZN3aaa3DD3E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTIN3aaa3DD3E),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTVN3aaa3DD3E),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 aaa { 
struct  EE111  : ::aaa::AA1 , ::aaa::BB1 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE1113fooEv
  ~EE111(); // tgen
  EE111(); // tgen
};
//SIG(-1 _ZN3aaa5EE111E) C1{ BC2{ v1 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE111 ::foo(){vfunc_called(this, "_ZN3aaa5EE1113fooEv");}
aaa::EE111 ::~EE111(){ note_dtor("_ZN3aaa5EE111E", this);} // tgen
aaa::EE111 ::EE111(){ note_ctor("_ZN3aaa5EE111E", this);} // tgen
}
static void Test__ZN3aaa5EE111E()
{
  extern Class_Descriptor cd__ZN3aaa5EE111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE111E, buf);
    ::aaa::EE111 *dp, &lv = *(dp=new (buf) ::aaa::EE111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE111E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE111E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE111E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE111E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE111E);
    dp->::aaa::EE111::~EE111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE111E(Test__ZN3aaa5EE111E, "_ZN3aaa5EE111E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE111C1Ev();
extern void _ZN3aaa5EE111D1Ev();
Name_Map name_map__ZN3aaa5EE111E[] = {
  NSPAIR(_ZN3aaa5EE111C1Ev),
  NSPAIR(_ZN3aaa5EE111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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 _ZTIN3aaa5EE111E[];
extern void _ZN3aaa5EE1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
Class_Descriptor cd__ZN3aaa5EE111E = {  "_ZN3aaa5EE111E", // class name
  bases__ZN3aaa5EE111E, 2,
  &(vtc__ZN3aaa5EE111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE111E),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 aaa { 
struct  FF111  : ::aaa::AA1 , ::aaa::BB1 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF1113fooEv
  ~FF111(); // tgen
  FF111(); // tgen
};
//SIG(-1 _ZN3aaa5FF111E) C1{ BC2{ v1 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF111 ::foo(){vfunc_called(this, "_ZN3aaa5FF1113fooEv");}
aaa::FF111 ::~FF111(){ note_dtor("_ZN3aaa5FF111E", this);} // tgen
aaa::FF111 ::FF111(){ note_ctor("_ZN3aaa5FF111E", this);} // tgen
}
static void Test__ZN3aaa5FF111E()
{
  extern Class_Descriptor cd__ZN3aaa5FF111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF111E, buf);
    ::aaa::FF111 *dp, &lv = *(dp=new (buf) ::aaa::FF111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF111E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF111E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF111E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF111E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF111E);
    dp->::aaa::FF111::~FF111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF111E(Test__ZN3aaa5FF111E, "_ZN3aaa5FF111E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF111C1Ev();
extern void _ZN3aaa5FF111D1Ev();
Name_Map name_map__ZN3aaa5FF111E[] = {
  NSPAIR(_ZN3aaa5FF111C1Ev),
  NSPAIR(_ZN3aaa5FF111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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 _ZTIN3aaa5FF111E[];
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
Class_Descriptor cd__ZN3aaa5FF111E = {  "_ZN3aaa5FF111E", // class name
  bases__ZN3aaa5FF111E, 2,
  &(vtc__ZN3aaa5FF111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF111E),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 aaa { 
struct  EE112  : ::aaa::AA1 , ::aaa::BB1 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE1123barEv
  ~EE112(); // tgen
  EE112(); // tgen
};
//SIG(-1 _ZN3aaa5EE112E) C1{ BC2{ v2 Fi} BC3{ v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE112 ::bar(){vfunc_called(this, "_ZN3aaa5EE1123barEv");}
aaa::EE112 ::~EE112(){ note_dtor("_ZN3aaa5EE112E", this);} // tgen
aaa::EE112 ::EE112(){ note_ctor("_ZN3aaa5EE112E", this);} // tgen
}
static void Test__ZN3aaa5EE112E()
{
  extern Class_Descriptor cd__ZN3aaa5EE112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE112E, buf);
    ::aaa::EE112 *dp, &lv = *(dp=new (buf) ::aaa::EE112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE112E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE112E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE112E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE112E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE112E);
    dp->::aaa::EE112::~EE112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE112E(Test__ZN3aaa5EE112E, "_ZN3aaa5EE112E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE112C1Ev();
extern void _ZN3aaa5EE112D1Ev();
Name_Map name_map__ZN3aaa5EE112E[] = {
  NSPAIR(_ZN3aaa5EE112C1Ev),
  NSPAIR(_ZN3aaa5EE112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
Class_Descriptor cd__ZN3aaa5EE112E = {  "_ZN3aaa5EE112E", // class name
  bases__ZN3aaa5EE112E, 2,
  &(vtc__ZN3aaa5EE112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE112E),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 aaa { 
struct  FF112  : ::aaa::AA1 , ::aaa::BB1 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF1123barEv
  ~FF112(); // tgen
  FF112(); // tgen
};
//SIG(-1 _ZN3aaa5FF112E) C1{ BC2{ v2 Fi} BC3{ v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF112 ::bar(){vfunc_called(this, "_ZN3aaa5FF1123barEv");}
aaa::FF112 ::~FF112(){ note_dtor("_ZN3aaa5FF112E", this);} // tgen
aaa::FF112 ::FF112(){ note_ctor("_ZN3aaa5FF112E", this);} // tgen
}
static void Test__ZN3aaa5FF112E()
{
  extern Class_Descriptor cd__ZN3aaa5FF112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF112E, buf);
    ::aaa::FF112 *dp, &lv = *(dp=new (buf) ::aaa::FF112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF112E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF112E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF112E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF112E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF112E);
    dp->::aaa::FF112::~FF112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF112E(Test__ZN3aaa5FF112E, "_ZN3aaa5FF112E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF112C1Ev();
extern void _ZN3aaa5FF112D1Ev();
Name_Map name_map__ZN3aaa5FF112E[] = {
  NSPAIR(_ZN3aaa5FF112C1Ev),
  NSPAIR(_ZN3aaa5FF112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa5FF1123barEv();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
Class_Descriptor cd__ZN3aaa5FF112E = {  "_ZN3aaa5FF112E", // class name
  bases__ZN3aaa5FF112E, 2,
  &(vtc__ZN3aaa5FF112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF112E),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 aaa { 
struct  EE113  : ::aaa::AA1 , ::aaa::BB1 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE1133fooEv
  virtual void  bar(); // _ZN3aaa5EE1133barEv
  ~EE113(); // tgen
  EE113(); // tgen
};
//SIG(-1 _ZN3aaa5EE113E) C1{ BC2{ v1 Fi} BC3{ v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE113 ::foo(){vfunc_called(this, "_ZN3aaa5EE1133fooEv");}
void  aaa::EE113 ::bar(){vfunc_called(this, "_ZN3aaa5EE1133barEv");}
aaa::EE113 ::~EE113(){ note_dtor("_ZN3aaa5EE113E", this);} // tgen
aaa::EE113 ::EE113(){ note_ctor("_ZN3aaa5EE113E", this);} // tgen
}
static void Test__ZN3aaa5EE113E()
{
  extern Class_Descriptor cd__ZN3aaa5EE113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE113E, buf);
    ::aaa::EE113 *dp, &lv = *(dp=new (buf) ::aaa::EE113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE113E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE113E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE113E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE113E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE113E);
    dp->::aaa::EE113::~EE113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE113E(Test__ZN3aaa5EE113E, "_ZN3aaa5EE113E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE113C1Ev();
extern void _ZN3aaa5EE113D1Ev();
Name_Map name_map__ZN3aaa5EE113E[] = {
  NSPAIR(_ZN3aaa5EE113C1Ev),
  NSPAIR(_ZN3aaa5EE113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE113E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
Class_Descriptor cd__ZN3aaa5EE113E = {  "_ZN3aaa5EE113E", // class name
  bases__ZN3aaa5EE113E, 2,
  &(vtc__ZN3aaa5EE113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE113E),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 aaa { 
struct  FF113  : ::aaa::AA1 , ::aaa::BB1 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF1133fooEv
  virtual void  bar(); // _ZN3aaa5FF1133barEv
  ~FF113(); // tgen
  FF113(); // tgen
};
//SIG(-1 _ZN3aaa5FF113E) C1{ BC2{ v1 Fi} BC3{ v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF113 ::foo(){vfunc_called(this, "_ZN3aaa5FF1133fooEv");}
void  aaa::FF113 ::bar(){vfunc_called(this, "_ZN3aaa5FF1133barEv");}
aaa::FF113 ::~FF113(){ note_dtor("_ZN3aaa5FF113E", this);} // tgen
aaa::FF113 ::FF113(){ note_ctor("_ZN3aaa5FF113E", this);} // tgen
}
static void Test__ZN3aaa5FF113E()
{
  extern Class_Descriptor cd__ZN3aaa5FF113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF113E, buf);
    ::aaa::FF113 *dp, &lv = *(dp=new (buf) ::aaa::FF113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF113E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF113E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF113E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF113E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF113E);
    dp->::aaa::FF113::~FF113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF113E(Test__ZN3aaa5FF113E, "_ZN3aaa5FF113E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF113C1Ev();
extern void _ZN3aaa5FF113D1Ev();
Name_Map name_map__ZN3aaa5FF113E[] = {
  NSPAIR(_ZN3aaa5FF113C1Ev),
  NSPAIR(_ZN3aaa5FF113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern void _ZN3aaa5FF1133fooEv();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF113E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
Class_Descriptor cd__ZN3aaa5FF113E = {  "_ZN3aaa5FF113E", // class name
  bases__ZN3aaa5FF113E, 2,
  &(vtc__ZN3aaa5FF113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF113E),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 aaa { 
struct  EE121  : ::aaa::AA1 , ::aaa::BB2 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE1213fooEv
  ~EE121(); // tgen
  EE121(); // tgen
};
//SIG(-1 _ZN3aaa5EE121E) C1{ BC2{ v1 Fi} BC3{ v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE121 ::foo(){vfunc_called(this, "_ZN3aaa5EE1213fooEv");}
aaa::EE121 ::~EE121(){ note_dtor("_ZN3aaa5EE121E", this);} // tgen
aaa::EE121 ::EE121(){ note_ctor("_ZN3aaa5EE121E", this);} // tgen
}
static void Test__ZN3aaa5EE121E()
{
  extern Class_Descriptor cd__ZN3aaa5EE121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE121E, buf);
    ::aaa::EE121 *dp, &lv = *(dp=new (buf) ::aaa::EE121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE121E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE121E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE121E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE121E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE121E);
    dp->::aaa::EE121::~EE121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE121E(Test__ZN3aaa5EE121E, "_ZN3aaa5EE121E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE121C1Ev();
extern void _ZN3aaa5EE121D1Ev();
Name_Map name_map__ZN3aaa5EE121E[] = {
  NSPAIR(_ZN3aaa5EE121C1Ev),
  NSPAIR(_ZN3aaa5EE121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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 _ZTIN3aaa5EE121E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
Class_Descriptor cd__ZN3aaa5EE121E = {  "_ZN3aaa5EE121E", // class name
  bases__ZN3aaa5EE121E, 2,
  &(vtc__ZN3aaa5EE121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE121E),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 aaa { 
struct  FF121  : ::aaa::AA1 , ::aaa::BB2 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF1213fooEv
  ~FF121(); // tgen
  FF121(); // tgen
};
//SIG(-1 _ZN3aaa5FF121E) C1{ BC2{ v1 Fi} BC3{ v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF121 ::foo(){vfunc_called(this, "_ZN3aaa5FF1213fooEv");}
aaa::FF121 ::~FF121(){ note_dtor("_ZN3aaa5FF121E", this);} // tgen
aaa::FF121 ::FF121(){ note_ctor("_ZN3aaa5FF121E", this);} // tgen
}
static void Test__ZN3aaa5FF121E()
{
  extern Class_Descriptor cd__ZN3aaa5FF121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF121E, buf);
    ::aaa::FF121 *dp, &lv = *(dp=new (buf) ::aaa::FF121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF121E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF121E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF121E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF121E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF121E);
    dp->::aaa::FF121::~FF121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF121E(Test__ZN3aaa5FF121E, "_ZN3aaa5FF121E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF121C1Ev();
extern void _ZN3aaa5FF121D1Ev();
Name_Map name_map__ZN3aaa5FF121E[] = {
  NSPAIR(_ZN3aaa5FF121C1Ev),
  NSPAIR(_ZN3aaa5FF121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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 _ZTIN3aaa5FF121E[];
extern void _ZN3aaa5FF1213fooEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
Class_Descriptor cd__ZN3aaa5FF121E = {  "_ZN3aaa5FF121E", // class name
  bases__ZN3aaa5FF121E, 2,
  &(vtc__ZN3aaa5FF121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF121E),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 aaa { 
struct  EE122  : ::aaa::AA1 , ::aaa::BB2 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE1223barEv
  ~EE122(); // tgen
  EE122(); // tgen
};
//SIG(-1 _ZN3aaa5EE122E) C1{ BC2{ v2 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE122 ::bar(){vfunc_called(this, "_ZN3aaa5EE1223barEv");}
aaa::EE122 ::~EE122(){ note_dtor("_ZN3aaa5EE122E", this);} // tgen
aaa::EE122 ::EE122(){ note_ctor("_ZN3aaa5EE122E", this);} // tgen
}
static void Test__ZN3aaa5EE122E()
{
  extern Class_Descriptor cd__ZN3aaa5EE122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE122E, buf);
    ::aaa::EE122 *dp, &lv = *(dp=new (buf) ::aaa::EE122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE122E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE122E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE122E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE122E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE122E);
    dp->::aaa::EE122::~EE122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE122E(Test__ZN3aaa5EE122E, "_ZN3aaa5EE122E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE122C1Ev();
extern void _ZN3aaa5EE122D1Ev();
Name_Map name_map__ZN3aaa5EE122E[] = {
  NSPAIR(_ZN3aaa5EE122C1Ev),
  NSPAIR(_ZN3aaa5EE122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
Class_Descriptor cd__ZN3aaa5EE122E = {  "_ZN3aaa5EE122E", // class name
  bases__ZN3aaa5EE122E, 2,
  &(vtc__ZN3aaa5EE122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE122E),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 aaa { 
struct  FF122  : ::aaa::AA1 , ::aaa::BB2 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF1223barEv
  ~FF122(); // tgen
  FF122(); // tgen
};
//SIG(-1 _ZN3aaa5FF122E) C1{ BC2{ v2 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF122 ::bar(){vfunc_called(this, "_ZN3aaa5FF1223barEv");}
aaa::FF122 ::~FF122(){ note_dtor("_ZN3aaa5FF122E", this);} // tgen
aaa::FF122 ::FF122(){ note_ctor("_ZN3aaa5FF122E", this);} // tgen
}
static void Test__ZN3aaa5FF122E()
{
  extern Class_Descriptor cd__ZN3aaa5FF122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF122E, buf);
    ::aaa::FF122 *dp, &lv = *(dp=new (buf) ::aaa::FF122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF122E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF122E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF122E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF122E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF122E);
    dp->::aaa::FF122::~FF122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF122E(Test__ZN3aaa5FF122E, "_ZN3aaa5FF122E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF122C1Ev();
extern void _ZN3aaa5FF122D1Ev();
Name_Map name_map__ZN3aaa5FF122E[] = {
  NSPAIR(_ZN3aaa5FF122C1Ev),
  NSPAIR(_ZN3aaa5FF122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
Class_Descriptor cd__ZN3aaa5FF122E = {  "_ZN3aaa5FF122E", // class name
  bases__ZN3aaa5FF122E, 2,
  &(vtc__ZN3aaa5FF122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF122E),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 aaa { 
struct  EE123  : ::aaa::AA1 , ::aaa::BB2 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE1233fooEv
  virtual void  bar(); // _ZN3aaa5EE1233barEv
  ~EE123(); // tgen
  EE123(); // tgen
};
//SIG(-1 _ZN3aaa5EE123E) C1{ BC2{ v1 Fi} BC3{ v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE123 ::foo(){vfunc_called(this, "_ZN3aaa5EE1233fooEv");}
void  aaa::EE123 ::bar(){vfunc_called(this, "_ZN3aaa5EE1233barEv");}
aaa::EE123 ::~EE123(){ note_dtor("_ZN3aaa5EE123E", this);} // tgen
aaa::EE123 ::EE123(){ note_ctor("_ZN3aaa5EE123E", this);} // tgen
}
static void Test__ZN3aaa5EE123E()
{
  extern Class_Descriptor cd__ZN3aaa5EE123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE123E, buf);
    ::aaa::EE123 *dp, &lv = *(dp=new (buf) ::aaa::EE123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE123E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE123E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE123E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE123E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE123E);
    dp->::aaa::EE123::~EE123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE123E(Test__ZN3aaa5EE123E, "_ZN3aaa5EE123E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE123C1Ev();
extern void _ZN3aaa5EE123D1Ev();
Name_Map name_map__ZN3aaa5EE123E[] = {
  NSPAIR(_ZN3aaa5EE123C1Ev),
  NSPAIR(_ZN3aaa5EE123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE123E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
Class_Descriptor cd__ZN3aaa5EE123E = {  "_ZN3aaa5EE123E", // class name
  bases__ZN3aaa5EE123E, 2,
  &(vtc__ZN3aaa5EE123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE123E),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 aaa { 
struct  FF123  : ::aaa::AA1 , ::aaa::BB2 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF1233fooEv
  virtual void  bar(); // _ZN3aaa5FF1233barEv
  ~FF123(); // tgen
  FF123(); // tgen
};
//SIG(-1 _ZN3aaa5FF123E) C1{ BC2{ v1 Fi} BC3{ v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF123 ::foo(){vfunc_called(this, "_ZN3aaa5FF1233fooEv");}
void  aaa::FF123 ::bar(){vfunc_called(this, "_ZN3aaa5FF1233barEv");}
aaa::FF123 ::~FF123(){ note_dtor("_ZN3aaa5FF123E", this);} // tgen
aaa::FF123 ::FF123(){ note_ctor("_ZN3aaa5FF123E", this);} // tgen
}
static void Test__ZN3aaa5FF123E()
{
  extern Class_Descriptor cd__ZN3aaa5FF123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF123E, buf);
    ::aaa::FF123 *dp, &lv = *(dp=new (buf) ::aaa::FF123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF123E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF123E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF123E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF123E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF123E);
    dp->::aaa::FF123::~FF123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF123E(Test__ZN3aaa5FF123E, "_ZN3aaa5FF123E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF123C1Ev();
extern void _ZN3aaa5FF123D1Ev();
Name_Map name_map__ZN3aaa5FF123E[] = {
  NSPAIR(_ZN3aaa5FF123C1Ev),
  NSPAIR(_ZN3aaa5FF123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern void _ZN3aaa5FF1233fooEv();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF123E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
Class_Descriptor cd__ZN3aaa5FF123E = {  "_ZN3aaa5FF123E", // class name
  bases__ZN3aaa5FF123E, 2,
  &(vtc__ZN3aaa5FF123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF123E),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 aaa { 
struct  EE131  : ::aaa::AA1 , ::aaa::BB3 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE1313fooEv
  ~EE131(); // tgen
  EE131(); // tgen
};
//SIG(-1 _ZN3aaa5EE131E) C1{ BC2{ v1 Fi} BC3{ v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE131 ::foo(){vfunc_called(this, "_ZN3aaa5EE1313fooEv");}
aaa::EE131 ::~EE131(){ note_dtor("_ZN3aaa5EE131E", this);} // tgen
aaa::EE131 ::EE131(){ note_ctor("_ZN3aaa5EE131E", this);} // tgen
}
static void Test__ZN3aaa5EE131E()
{
  extern Class_Descriptor cd__ZN3aaa5EE131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE131E, buf);
    ::aaa::EE131 *dp, &lv = *(dp=new (buf) ::aaa::EE131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE131E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE131E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE131E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE131E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE131E);
    dp->::aaa::EE131::~EE131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE131E(Test__ZN3aaa5EE131E, "_ZN3aaa5EE131E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE131C1Ev();
extern void _ZN3aaa5EE131D1Ev();
Name_Map name_map__ZN3aaa5EE131E[] = {
  NSPAIR(_ZN3aaa5EE131C1Ev),
  NSPAIR(_ZN3aaa5EE131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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 _ZTIN3aaa5EE131E[];
extern void _ZN3aaa5EE1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
Class_Descriptor cd__ZN3aaa5EE131E = {  "_ZN3aaa5EE131E", // class name
  bases__ZN3aaa5EE131E, 2,
  &(vtc__ZN3aaa5EE131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE131E),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 aaa { 
struct  FF131  : ::aaa::AA1 , ::aaa::BB3 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF1313fooEv
  ~FF131(); // tgen
  FF131(); // tgen
};
//SIG(-1 _ZN3aaa5FF131E) C1{ BC2{ v1 Fi} BC3{ v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF131 ::foo(){vfunc_called(this, "_ZN3aaa5FF1313fooEv");}
aaa::FF131 ::~FF131(){ note_dtor("_ZN3aaa5FF131E", this);} // tgen
aaa::FF131 ::FF131(){ note_ctor("_ZN3aaa5FF131E", this);} // tgen
}
static void Test__ZN3aaa5FF131E()
{
  extern Class_Descriptor cd__ZN3aaa5FF131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF131E, buf);
    ::aaa::FF131 *dp, &lv = *(dp=new (buf) ::aaa::FF131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF131E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF131E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF131E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF131E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF131E);
    dp->::aaa::FF131::~FF131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF131E(Test__ZN3aaa5FF131E, "_ZN3aaa5FF131E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF131C1Ev();
extern void _ZN3aaa5FF131D1Ev();
Name_Map name_map__ZN3aaa5FF131E[] = {
  NSPAIR(_ZN3aaa5FF131C1Ev),
  NSPAIR(_ZN3aaa5FF131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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 _ZTIN3aaa5FF131E[];
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
Class_Descriptor cd__ZN3aaa5FF131E = {  "_ZN3aaa5FF131E", // class name
  bases__ZN3aaa5FF131E, 2,
  &(vtc__ZN3aaa5FF131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF131E),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 aaa { 
struct  EE132  : ::aaa::AA1 , ::aaa::BB3 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE1323barEv
  ~EE132(); // tgen
  EE132(); // tgen
};
//SIG(-1 _ZN3aaa5EE132E) C1{ BC2{ v2 Fi} BC3{ v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE132 ::bar(){vfunc_called(this, "_ZN3aaa5EE1323barEv");}
aaa::EE132 ::~EE132(){ note_dtor("_ZN3aaa5EE132E", this);} // tgen
aaa::EE132 ::EE132(){ note_ctor("_ZN3aaa5EE132E", this);} // tgen
}
static void Test__ZN3aaa5EE132E()
{
  extern Class_Descriptor cd__ZN3aaa5EE132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE132E, buf);
    ::aaa::EE132 *dp, &lv = *(dp=new (buf) ::aaa::EE132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE132E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE132E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE132E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE132E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE132E);
    dp->::aaa::EE132::~EE132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE132E(Test__ZN3aaa5EE132E, "_ZN3aaa5EE132E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE132C1Ev();
extern void _ZN3aaa5EE132D1Ev();
Name_Map name_map__ZN3aaa5EE132E[] = {
  NSPAIR(_ZN3aaa5EE132C1Ev),
  NSPAIR(_ZN3aaa5EE132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
Class_Descriptor cd__ZN3aaa5EE132E = {  "_ZN3aaa5EE132E", // class name
  bases__ZN3aaa5EE132E, 2,
  &(vtc__ZN3aaa5EE132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE132E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  FF132  : ::aaa::AA1 , ::aaa::BB3 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF1323barEv
  ~FF132(); // tgen
  FF132(); // tgen
};
//SIG(-1 _ZN3aaa5FF132E) C1{ BC2{ v2 Fi} BC3{ v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF132 ::bar(){vfunc_called(this, "_ZN3aaa5FF1323barEv");}
aaa::FF132 ::~FF132(){ note_dtor("_ZN3aaa5FF132E", this);} // tgen
aaa::FF132 ::FF132(){ note_ctor("_ZN3aaa5FF132E", this);} // tgen
}
static void Test__ZN3aaa5FF132E()
{
  extern Class_Descriptor cd__ZN3aaa5FF132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF132E, buf);
    ::aaa::FF132 *dp, &lv = *(dp=new (buf) ::aaa::FF132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF132E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF132E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF132E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF132E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF132E);
    dp->::aaa::FF132::~FF132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF132E(Test__ZN3aaa5FF132E, "_ZN3aaa5FF132E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF132C1Ev();
extern void _ZN3aaa5FF132D1Ev();
Name_Map name_map__ZN3aaa5FF132E[] = {
  NSPAIR(_ZN3aaa5FF132C1Ev),
  NSPAIR(_ZN3aaa5FF132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa5FF1323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
Class_Descriptor cd__ZN3aaa5FF132E = {  "_ZN3aaa5FF132E", // class name
  bases__ZN3aaa5FF132E, 2,
  &(vtc__ZN3aaa5FF132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF132E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  EE133  : ::aaa::AA1 , ::aaa::BB3 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE1333fooEv
  virtual void  bar(); // _ZN3aaa5EE1333barEv
  ~EE133(); // tgen
  EE133(); // tgen
};
//SIG(-1 _ZN3aaa5EE133E) C1{ BC2{ v1 Fi} BC3{ v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE133 ::foo(){vfunc_called(this, "_ZN3aaa5EE1333fooEv");}
void  aaa::EE133 ::bar(){vfunc_called(this, "_ZN3aaa5EE1333barEv");}
aaa::EE133 ::~EE133(){ note_dtor("_ZN3aaa5EE133E", this);} // tgen
aaa::EE133 ::EE133(){ note_ctor("_ZN3aaa5EE133E", this);} // tgen
}
static void Test__ZN3aaa5EE133E()
{
  extern Class_Descriptor cd__ZN3aaa5EE133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE133E, buf);
    ::aaa::EE133 *dp, &lv = *(dp=new (buf) ::aaa::EE133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE133E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5EE133E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE133E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE133E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE133E);
    dp->::aaa::EE133::~EE133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE133E(Test__ZN3aaa5EE133E, "_ZN3aaa5EE133E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE133C1Ev();
extern void _ZN3aaa5EE133D1Ev();
Name_Map name_map__ZN3aaa5EE133E[] = {
  NSPAIR(_ZN3aaa5EE133C1Ev),
  NSPAIR(_ZN3aaa5EE133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE133E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
Class_Descriptor cd__ZN3aaa5EE133E = {  "_ZN3aaa5EE133E", // class name
  bases__ZN3aaa5EE133E, 2,
  &(vtc__ZN3aaa5EE133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE133E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  FF133  : ::aaa::AA1 , ::aaa::BB3 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF1333fooEv
  virtual void  bar(); // _ZN3aaa5FF1333barEv
  ~FF133(); // tgen
  FF133(); // tgen
};
//SIG(-1 _ZN3aaa5FF133E) C1{ BC2{ v1 Fi} BC3{ v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF133 ::foo(){vfunc_called(this, "_ZN3aaa5FF1333fooEv");}
void  aaa::FF133 ::bar(){vfunc_called(this, "_ZN3aaa5FF1333barEv");}
aaa::FF133 ::~FF133(){ note_dtor("_ZN3aaa5FF133E", this);} // tgen
aaa::FF133 ::FF133(){ note_ctor("_ZN3aaa5FF133E", this);} // tgen
}
static void Test__ZN3aaa5FF133E()
{
  extern Class_Descriptor cd__ZN3aaa5FF133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF133E, buf);
    ::aaa::FF133 *dp, &lv = *(dp=new (buf) ::aaa::FF133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF133E)");
    check_base_class_offset(lv, (::aaa::AA1*), 0, "_ZN3aaa5FF133E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF133E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF133E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF133E);
    dp->::aaa::FF133::~FF133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF133E(Test__ZN3aaa5FF133E, "_ZN3aaa5FF133E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF133C1Ev();
extern void _ZN3aaa5FF133D1Ev();
Name_Map name_map__ZN3aaa5FF133E[] = {
  NSPAIR(_ZN3aaa5FF133C1Ev),
  NSPAIR(_ZN3aaa5FF133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern void _ZN3aaa5FF1333fooEv();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF133E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
Class_Descriptor cd__ZN3aaa5FF133E = {  "_ZN3aaa5FF133E", // class name
  bases__ZN3aaa5FF133E, 2,
  &(vtc__ZN3aaa5FF133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF133E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  EE211  : ::aaa::AA2 , ::aaa::BB1 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE2113fooEv
  ~EE211(); // tgen
  EE211(); // tgen
};
//SIG(-1 _ZN3aaa5EE211E) C1{ BC2{ v2 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE211 ::foo(){vfunc_called(this, "_ZN3aaa5EE2113fooEv");}
aaa::EE211 ::~EE211(){ note_dtor("_ZN3aaa5EE211E", this);} // tgen
aaa::EE211 ::EE211(){ note_ctor("_ZN3aaa5EE211E", this);} // tgen
}
static void Test__ZN3aaa5EE211E()
{
  extern Class_Descriptor cd__ZN3aaa5EE211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE211E, buf);
    ::aaa::EE211 *dp, &lv = *(dp=new (buf) ::aaa::EE211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE211E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE211E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE211E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE211E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE211E);
    dp->::aaa::EE211::~EE211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE211E(Test__ZN3aaa5EE211E, "_ZN3aaa5EE211E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE211C1Ev();
extern void _ZN3aaa5EE211D1Ev();
Name_Map name_map__ZN3aaa5EE211E[] = {
  NSPAIR(_ZN3aaa5EE211C1Ev),
  NSPAIR(_ZN3aaa5EE211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
Class_Descriptor cd__ZN3aaa5EE211E = {  "_ZN3aaa5EE211E", // class name
  bases__ZN3aaa5EE211E, 2,
  &(vtc__ZN3aaa5EE211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE211E),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 aaa { 
struct  FF211  : ::aaa::AA2 , ::aaa::BB1 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF2113fooEv
  ~FF211(); // tgen
  FF211(); // tgen
};
//SIG(-1 _ZN3aaa5FF211E) C1{ BC2{ v2 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF211 ::foo(){vfunc_called(this, "_ZN3aaa5FF2113fooEv");}
aaa::FF211 ::~FF211(){ note_dtor("_ZN3aaa5FF211E", this);} // tgen
aaa::FF211 ::FF211(){ note_ctor("_ZN3aaa5FF211E", this);} // tgen
}
static void Test__ZN3aaa5FF211E()
{
  extern Class_Descriptor cd__ZN3aaa5FF211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF211E, buf);
    ::aaa::FF211 *dp, &lv = *(dp=new (buf) ::aaa::FF211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF211E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF211E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF211E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF211E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF211E);
    dp->::aaa::FF211::~FF211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF211E(Test__ZN3aaa5FF211E, "_ZN3aaa5FF211E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF211C1Ev();
extern void _ZN3aaa5FF211D1Ev();
Name_Map name_map__ZN3aaa5FF211E[] = {
  NSPAIR(_ZN3aaa5FF211C1Ev),
  NSPAIR(_ZN3aaa5FF211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
Class_Descriptor cd__ZN3aaa5FF211E = {  "_ZN3aaa5FF211E", // class name
  bases__ZN3aaa5FF211E, 2,
  &(vtc__ZN3aaa5FF211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF211E),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 aaa { 
struct  EE212  : ::aaa::AA2 , ::aaa::BB1 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE2123barEv
  ~EE212(); // tgen
  EE212(); // tgen
};
//SIG(-1 _ZN3aaa5EE212E) C1{ BC2{ v1 Fi} BC3{ v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE212 ::bar(){vfunc_called(this, "_ZN3aaa5EE2123barEv");}
aaa::EE212 ::~EE212(){ note_dtor("_ZN3aaa5EE212E", this);} // tgen
aaa::EE212 ::EE212(){ note_ctor("_ZN3aaa5EE212E", this);} // tgen
}
static void Test__ZN3aaa5EE212E()
{
  extern Class_Descriptor cd__ZN3aaa5EE212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE212E, buf);
    ::aaa::EE212 *dp, &lv = *(dp=new (buf) ::aaa::EE212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE212E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE212E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE212E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE212E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE212E);
    dp->::aaa::EE212::~EE212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE212E(Test__ZN3aaa5EE212E, "_ZN3aaa5EE212E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE212C1Ev();
extern void _ZN3aaa5EE212D1Ev();
Name_Map name_map__ZN3aaa5EE212E[] = {
  NSPAIR(_ZN3aaa5EE212C1Ev),
  NSPAIR(_ZN3aaa5EE212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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 _ZTIN3aaa5EE212E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
Class_Descriptor cd__ZN3aaa5EE212E = {  "_ZN3aaa5EE212E", // class name
  bases__ZN3aaa5EE212E, 2,
  &(vtc__ZN3aaa5EE212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE212E),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 aaa { 
struct  FF212  : ::aaa::AA2 , ::aaa::BB1 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF2123barEv
  ~FF212(); // tgen
  FF212(); // tgen
};
//SIG(-1 _ZN3aaa5FF212E) C1{ BC2{ v1 Fi} BC3{ v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF212 ::bar(){vfunc_called(this, "_ZN3aaa5FF2123barEv");}
aaa::FF212 ::~FF212(){ note_dtor("_ZN3aaa5FF212E", this);} // tgen
aaa::FF212 ::FF212(){ note_ctor("_ZN3aaa5FF212E", this);} // tgen
}
static void Test__ZN3aaa5FF212E()
{
  extern Class_Descriptor cd__ZN3aaa5FF212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF212E, buf);
    ::aaa::FF212 *dp, &lv = *(dp=new (buf) ::aaa::FF212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF212E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF212E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF212E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF212E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF212E);
    dp->::aaa::FF212::~FF212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF212E(Test__ZN3aaa5FF212E, "_ZN3aaa5FF212E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF212C1Ev();
extern void _ZN3aaa5FF212D1Ev();
Name_Map name_map__ZN3aaa5FF212E[] = {
  NSPAIR(_ZN3aaa5FF212C1Ev),
  NSPAIR(_ZN3aaa5FF212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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 _ZTIN3aaa5FF212E[];
extern void _ZN3aaa5FF2123barEv();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
Class_Descriptor cd__ZN3aaa5FF212E = {  "_ZN3aaa5FF212E", // class name
  bases__ZN3aaa5FF212E, 2,
  &(vtc__ZN3aaa5FF212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF212E),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 aaa { 
struct  EE213  : ::aaa::AA2 , ::aaa::BB1 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE2133fooEv
  virtual void  bar(); // _ZN3aaa5EE2133barEv
  ~EE213(); // tgen
  EE213(); // tgen
};
//SIG(-1 _ZN3aaa5EE213E) C1{ BC2{ v2 Fi} BC3{ v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE213 ::foo(){vfunc_called(this, "_ZN3aaa5EE2133fooEv");}
void  aaa::EE213 ::bar(){vfunc_called(this, "_ZN3aaa5EE2133barEv");}
aaa::EE213 ::~EE213(){ note_dtor("_ZN3aaa5EE213E", this);} // tgen
aaa::EE213 ::EE213(){ note_ctor("_ZN3aaa5EE213E", this);} // tgen
}
static void Test__ZN3aaa5EE213E()
{
  extern Class_Descriptor cd__ZN3aaa5EE213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE213E, buf);
    ::aaa::EE213 *dp, &lv = *(dp=new (buf) ::aaa::EE213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE213E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE213E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE213E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE213E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE213E);
    dp->::aaa::EE213::~EE213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE213E(Test__ZN3aaa5EE213E, "_ZN3aaa5EE213E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE213C1Ev();
extern void _ZN3aaa5EE213D1Ev();
Name_Map name_map__ZN3aaa5EE213E[] = {
  NSPAIR(_ZN3aaa5EE213C1Ev),
  NSPAIR(_ZN3aaa5EE213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE213E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
Class_Descriptor cd__ZN3aaa5EE213E = {  "_ZN3aaa5EE213E", // class name
  bases__ZN3aaa5EE213E, 2,
  &(vtc__ZN3aaa5EE213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE213E),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 aaa { 
struct  FF213  : ::aaa::AA2 , ::aaa::BB1 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF2133fooEv
  virtual void  bar(); // _ZN3aaa5FF2133barEv
  ~FF213(); // tgen
  FF213(); // tgen
};
//SIG(-1 _ZN3aaa5FF213E) C1{ BC2{ v2 Fi} BC3{ v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF213 ::foo(){vfunc_called(this, "_ZN3aaa5FF2133fooEv");}
void  aaa::FF213 ::bar(){vfunc_called(this, "_ZN3aaa5FF2133barEv");}
aaa::FF213 ::~FF213(){ note_dtor("_ZN3aaa5FF213E", this);} // tgen
aaa::FF213 ::FF213(){ note_ctor("_ZN3aaa5FF213E", this);} // tgen
}
static void Test__ZN3aaa5FF213E()
{
  extern Class_Descriptor cd__ZN3aaa5FF213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF213E, buf);
    ::aaa::FF213 *dp, &lv = *(dp=new (buf) ::aaa::FF213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF213E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF213E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF213E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF213E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF213E);
    dp->::aaa::FF213::~FF213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF213E(Test__ZN3aaa5FF213E, "_ZN3aaa5FF213E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF213C1Ev();
extern void _ZN3aaa5FF213D1Ev();
Name_Map name_map__ZN3aaa5FF213E[] = {
  NSPAIR(_ZN3aaa5FF213C1Ev),
  NSPAIR(_ZN3aaa5FF213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern void _ZN3aaa5FF2133barEv();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF213E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
Class_Descriptor cd__ZN3aaa5FF213E = {  "_ZN3aaa5FF213E", // class name
  bases__ZN3aaa5FF213E, 2,
  &(vtc__ZN3aaa5FF213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF213E),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 aaa { 
struct  EE221  : ::aaa::AA2 , ::aaa::BB2 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE2213fooEv
  ~EE221(); // tgen
  EE221(); // tgen
};
//SIG(-1 _ZN3aaa5EE221E) C1{ BC2{ v2 Fi} BC3{ v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE221 ::foo(){vfunc_called(this, "_ZN3aaa5EE2213fooEv");}
aaa::EE221 ::~EE221(){ note_dtor("_ZN3aaa5EE221E", this);} // tgen
aaa::EE221 ::EE221(){ note_ctor("_ZN3aaa5EE221E", this);} // tgen
}
static void Test__ZN3aaa5EE221E()
{
  extern Class_Descriptor cd__ZN3aaa5EE221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE221E, buf);
    ::aaa::EE221 *dp, &lv = *(dp=new (buf) ::aaa::EE221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE221E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE221E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE221E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE221E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE221E);
    dp->::aaa::EE221::~EE221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE221E(Test__ZN3aaa5EE221E, "_ZN3aaa5EE221E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE221C1Ev();
extern void _ZN3aaa5EE221D1Ev();
Name_Map name_map__ZN3aaa5EE221E[] = {
  NSPAIR(_ZN3aaa5EE221C1Ev),
  NSPAIR(_ZN3aaa5EE221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
Class_Descriptor cd__ZN3aaa5EE221E = {  "_ZN3aaa5EE221E", // class name
  bases__ZN3aaa5EE221E, 2,
  &(vtc__ZN3aaa5EE221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE221E),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 aaa { 
struct  FF221  : ::aaa::AA2 , ::aaa::BB2 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF2213fooEv
  ~FF221(); // tgen
  FF221(); // tgen
};
//SIG(-1 _ZN3aaa5FF221E) C1{ BC2{ v2 Fi} BC3{ v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF221 ::foo(){vfunc_called(this, "_ZN3aaa5FF2213fooEv");}
aaa::FF221 ::~FF221(){ note_dtor("_ZN3aaa5FF221E", this);} // tgen
aaa::FF221 ::FF221(){ note_ctor("_ZN3aaa5FF221E", this);} // tgen
}
static void Test__ZN3aaa5FF221E()
{
  extern Class_Descriptor cd__ZN3aaa5FF221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF221E, buf);
    ::aaa::FF221 *dp, &lv = *(dp=new (buf) ::aaa::FF221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF221E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF221E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF221E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF221E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF221E);
    dp->::aaa::FF221::~FF221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF221E(Test__ZN3aaa5FF221E, "_ZN3aaa5FF221E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF221C1Ev();
extern void _ZN3aaa5FF221D1Ev();
Name_Map name_map__ZN3aaa5FF221E[] = {
  NSPAIR(_ZN3aaa5FF221C1Ev),
  NSPAIR(_ZN3aaa5FF221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa5FF2213fooEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
Class_Descriptor cd__ZN3aaa5FF221E = {  "_ZN3aaa5FF221E", // class name
  bases__ZN3aaa5FF221E, 2,
  &(vtc__ZN3aaa5FF221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF221E),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 aaa { 
struct  EE222  : ::aaa::AA2 , ::aaa::BB2 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE2223barEv
  ~EE222(); // tgen
  EE222(); // tgen
};
//SIG(-1 _ZN3aaa5EE222E) C1{ BC2{ v1 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE222 ::bar(){vfunc_called(this, "_ZN3aaa5EE2223barEv");}
aaa::EE222 ::~EE222(){ note_dtor("_ZN3aaa5EE222E", this);} // tgen
aaa::EE222 ::EE222(){ note_ctor("_ZN3aaa5EE222E", this);} // tgen
}
static void Test__ZN3aaa5EE222E()
{
  extern Class_Descriptor cd__ZN3aaa5EE222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE222E, buf);
    ::aaa::EE222 *dp, &lv = *(dp=new (buf) ::aaa::EE222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE222E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE222E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE222E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE222E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE222E);
    dp->::aaa::EE222::~EE222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE222E(Test__ZN3aaa5EE222E, "_ZN3aaa5EE222E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE222C1Ev();
extern void _ZN3aaa5EE222D1Ev();
Name_Map name_map__ZN3aaa5EE222E[] = {
  NSPAIR(_ZN3aaa5EE222C1Ev),
  NSPAIR(_ZN3aaa5EE222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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 _ZTIN3aaa5EE222E[];
extern void _ZN3aaa5EE2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
Class_Descriptor cd__ZN3aaa5EE222E = {  "_ZN3aaa5EE222E", // class name
  bases__ZN3aaa5EE222E, 2,
  &(vtc__ZN3aaa5EE222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE222E),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 aaa { 
struct  FF222  : ::aaa::AA2 , ::aaa::BB2 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF2223barEv
  ~FF222(); // tgen
  FF222(); // tgen
};
//SIG(-1 _ZN3aaa5FF222E) C1{ BC2{ v1 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF222 ::bar(){vfunc_called(this, "_ZN3aaa5FF2223barEv");}
aaa::FF222 ::~FF222(){ note_dtor("_ZN3aaa5FF222E", this);} // tgen
aaa::FF222 ::FF222(){ note_ctor("_ZN3aaa5FF222E", this);} // tgen
}
static void Test__ZN3aaa5FF222E()
{
  extern Class_Descriptor cd__ZN3aaa5FF222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF222E, buf);
    ::aaa::FF222 *dp, &lv = *(dp=new (buf) ::aaa::FF222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF222E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF222E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF222E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF222E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF222E);
    dp->::aaa::FF222::~FF222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF222E(Test__ZN3aaa5FF222E, "_ZN3aaa5FF222E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF222C1Ev();
extern void _ZN3aaa5FF222D1Ev();
Name_Map name_map__ZN3aaa5FF222E[] = {
  NSPAIR(_ZN3aaa5FF222C1Ev),
  NSPAIR(_ZN3aaa5FF222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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 _ZTIN3aaa5FF222E[];
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
Class_Descriptor cd__ZN3aaa5FF222E = {  "_ZN3aaa5FF222E", // class name
  bases__ZN3aaa5FF222E, 2,
  &(vtc__ZN3aaa5FF222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF222E),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 aaa { 
struct  EE223  : ::aaa::AA2 , ::aaa::BB2 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE2233fooEv
  virtual void  bar(); // _ZN3aaa5EE2233barEv
  ~EE223(); // tgen
  EE223(); // tgen
};
//SIG(-1 _ZN3aaa5EE223E) C1{ BC2{ v2 Fi} BC3{ v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE223 ::foo(){vfunc_called(this, "_ZN3aaa5EE2233fooEv");}
void  aaa::EE223 ::bar(){vfunc_called(this, "_ZN3aaa5EE2233barEv");}
aaa::EE223 ::~EE223(){ note_dtor("_ZN3aaa5EE223E", this);} // tgen
aaa::EE223 ::EE223(){ note_ctor("_ZN3aaa5EE223E", this);} // tgen
}
static void Test__ZN3aaa5EE223E()
{
  extern Class_Descriptor cd__ZN3aaa5EE223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE223E, buf);
    ::aaa::EE223 *dp, &lv = *(dp=new (buf) ::aaa::EE223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE223E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE223E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE223E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE223E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE223E);
    dp->::aaa::EE223::~EE223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE223E(Test__ZN3aaa5EE223E, "_ZN3aaa5EE223E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE223C1Ev();
extern void _ZN3aaa5EE223D1Ev();
Name_Map name_map__ZN3aaa5EE223E[] = {
  NSPAIR(_ZN3aaa5EE223C1Ev),
  NSPAIR(_ZN3aaa5EE223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE223E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
Class_Descriptor cd__ZN3aaa5EE223E = {  "_ZN3aaa5EE223E", // class name
  bases__ZN3aaa5EE223E, 2,
  &(vtc__ZN3aaa5EE223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE223E),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 aaa { 
struct  FF223  : ::aaa::AA2 , ::aaa::BB2 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF2233fooEv
  virtual void  bar(); // _ZN3aaa5FF2233barEv
  ~FF223(); // tgen
  FF223(); // tgen
};
//SIG(-1 _ZN3aaa5FF223E) C1{ BC2{ v2 Fi} BC3{ v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF223 ::foo(){vfunc_called(this, "_ZN3aaa5FF2233fooEv");}
void  aaa::FF223 ::bar(){vfunc_called(this, "_ZN3aaa5FF2233barEv");}
aaa::FF223 ::~FF223(){ note_dtor("_ZN3aaa5FF223E", this);} // tgen
aaa::FF223 ::FF223(){ note_ctor("_ZN3aaa5FF223E", this);} // tgen
}
static void Test__ZN3aaa5FF223E()
{
  extern Class_Descriptor cd__ZN3aaa5FF223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF223E, buf);
    ::aaa::FF223 *dp, &lv = *(dp=new (buf) ::aaa::FF223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF223E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF223E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF223E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF223E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF223E);
    dp->::aaa::FF223::~FF223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF223E(Test__ZN3aaa5FF223E, "_ZN3aaa5FF223E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF223C1Ev();
extern void _ZN3aaa5FF223D1Ev();
Name_Map name_map__ZN3aaa5FF223E[] = {
  NSPAIR(_ZN3aaa5FF223C1Ev),
  NSPAIR(_ZN3aaa5FF223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern void _ZN3aaa5FF2233barEv();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF223E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
Class_Descriptor cd__ZN3aaa5FF223E = {  "_ZN3aaa5FF223E", // class name
  bases__ZN3aaa5FF223E, 2,
  &(vtc__ZN3aaa5FF223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF223E),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 aaa { 
struct  EE231  : ::aaa::AA2 , ::aaa::BB3 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE2313fooEv
  ~EE231(); // tgen
  EE231(); // tgen
};
//SIG(-1 _ZN3aaa5EE231E) C1{ BC2{ v2 Fi} BC3{ v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE231 ::foo(){vfunc_called(this, "_ZN3aaa5EE2313fooEv");}
aaa::EE231 ::~EE231(){ note_dtor("_ZN3aaa5EE231E", this);} // tgen
aaa::EE231 ::EE231(){ note_ctor("_ZN3aaa5EE231E", this);} // tgen
}
static void Test__ZN3aaa5EE231E()
{
  extern Class_Descriptor cd__ZN3aaa5EE231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE231E, buf);
    ::aaa::EE231 *dp, &lv = *(dp=new (buf) ::aaa::EE231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE231E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE231E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE231E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE231E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE231E);
    dp->::aaa::EE231::~EE231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE231E(Test__ZN3aaa5EE231E, "_ZN3aaa5EE231E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE231C1Ev();
extern void _ZN3aaa5EE231D1Ev();
Name_Map name_map__ZN3aaa5EE231E[] = {
  NSPAIR(_ZN3aaa5EE231C1Ev),
  NSPAIR(_ZN3aaa5EE231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
Class_Descriptor cd__ZN3aaa5EE231E = {  "_ZN3aaa5EE231E", // class name
  bases__ZN3aaa5EE231E, 2,
  &(vtc__ZN3aaa5EE231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE231E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  FF231  : ::aaa::AA2 , ::aaa::BB3 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF2313fooEv
  ~FF231(); // tgen
  FF231(); // tgen
};
//SIG(-1 _ZN3aaa5FF231E) C1{ BC2{ v2 Fi} BC3{ v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF231 ::foo(){vfunc_called(this, "_ZN3aaa5FF2313fooEv");}
aaa::FF231 ::~FF231(){ note_dtor("_ZN3aaa5FF231E", this);} // tgen
aaa::FF231 ::FF231(){ note_ctor("_ZN3aaa5FF231E", this);} // tgen
}
static void Test__ZN3aaa5FF231E()
{
  extern Class_Descriptor cd__ZN3aaa5FF231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF231E, buf);
    ::aaa::FF231 *dp, &lv = *(dp=new (buf) ::aaa::FF231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF231E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF231E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF231E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF231E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF231E);
    dp->::aaa::FF231::~FF231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF231E(Test__ZN3aaa5FF231E, "_ZN3aaa5FF231E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF231C1Ev();
extern void _ZN3aaa5FF231D1Ev();
Name_Map name_map__ZN3aaa5FF231E[] = {
  NSPAIR(_ZN3aaa5FF231C1Ev),
  NSPAIR(_ZN3aaa5FF231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
Class_Descriptor cd__ZN3aaa5FF231E = {  "_ZN3aaa5FF231E", // class name
  bases__ZN3aaa5FF231E, 2,
  &(vtc__ZN3aaa5FF231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF231E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  EE232  : ::aaa::AA2 , ::aaa::BB3 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE2323barEv
  ~EE232(); // tgen
  EE232(); // tgen
};
//SIG(-1 _ZN3aaa5EE232E) C1{ BC2{ v1 Fi} BC3{ v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE232 ::bar(){vfunc_called(this, "_ZN3aaa5EE2323barEv");}
aaa::EE232 ::~EE232(){ note_dtor("_ZN3aaa5EE232E", this);} // tgen
aaa::EE232 ::EE232(){ note_ctor("_ZN3aaa5EE232E", this);} // tgen
}
static void Test__ZN3aaa5EE232E()
{
  extern Class_Descriptor cd__ZN3aaa5EE232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE232E, buf);
    ::aaa::EE232 *dp, &lv = *(dp=new (buf) ::aaa::EE232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE232E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE232E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE232E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE232E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE232E);
    dp->::aaa::EE232::~EE232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE232E(Test__ZN3aaa5EE232E, "_ZN3aaa5EE232E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE232C1Ev();
extern void _ZN3aaa5EE232D1Ev();
Name_Map name_map__ZN3aaa5EE232E[] = {
  NSPAIR(_ZN3aaa5EE232C1Ev),
  NSPAIR(_ZN3aaa5EE232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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 _ZTIN3aaa5EE232E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
Class_Descriptor cd__ZN3aaa5EE232E = {  "_ZN3aaa5EE232E", // class name
  bases__ZN3aaa5EE232E, 2,
  &(vtc__ZN3aaa5EE232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE232E),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 aaa { 
struct  FF232  : ::aaa::AA2 , ::aaa::BB3 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF2323barEv
  ~FF232(); // tgen
  FF232(); // tgen
};
//SIG(-1 _ZN3aaa5FF232E) C1{ BC2{ v1 Fi} BC3{ v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF232 ::bar(){vfunc_called(this, "_ZN3aaa5FF2323barEv");}
aaa::FF232 ::~FF232(){ note_dtor("_ZN3aaa5FF232E", this);} // tgen
aaa::FF232 ::FF232(){ note_ctor("_ZN3aaa5FF232E", this);} // tgen
}
static void Test__ZN3aaa5FF232E()
{
  extern Class_Descriptor cd__ZN3aaa5FF232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF232E, buf);
    ::aaa::FF232 *dp, &lv = *(dp=new (buf) ::aaa::FF232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF232E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF232E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF232E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF232E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF232E);
    dp->::aaa::FF232::~FF232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF232E(Test__ZN3aaa5FF232E, "_ZN3aaa5FF232E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF232C1Ev();
extern void _ZN3aaa5FF232D1Ev();
Name_Map name_map__ZN3aaa5FF232E[] = {
  NSPAIR(_ZN3aaa5FF232C1Ev),
  NSPAIR(_ZN3aaa5FF232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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 _ZTIN3aaa5FF232E[];
extern void _ZN3aaa5FF2323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
Class_Descriptor cd__ZN3aaa5FF232E = {  "_ZN3aaa5FF232E", // class name
  bases__ZN3aaa5FF232E, 2,
  &(vtc__ZN3aaa5FF232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF232E),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 aaa { 
struct  EE233  : ::aaa::AA2 , ::aaa::BB3 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE2333fooEv
  virtual void  bar(); // _ZN3aaa5EE2333barEv
  ~EE233(); // tgen
  EE233(); // tgen
};
//SIG(-1 _ZN3aaa5EE233E) C1{ BC2{ v2 Fi} BC3{ v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE233 ::foo(){vfunc_called(this, "_ZN3aaa5EE2333fooEv");}
void  aaa::EE233 ::bar(){vfunc_called(this, "_ZN3aaa5EE2333barEv");}
aaa::EE233 ::~EE233(){ note_dtor("_ZN3aaa5EE233E", this);} // tgen
aaa::EE233 ::EE233(){ note_ctor("_ZN3aaa5EE233E", this);} // tgen
}
static void Test__ZN3aaa5EE233E()
{
  extern Class_Descriptor cd__ZN3aaa5EE233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE233E, buf);
    ::aaa::EE233 *dp, &lv = *(dp=new (buf) ::aaa::EE233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE233E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5EE233E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE233E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE233E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE233E);
    dp->::aaa::EE233::~EE233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE233E(Test__ZN3aaa5EE233E, "_ZN3aaa5EE233E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE233C1Ev();
extern void _ZN3aaa5EE233D1Ev();
Name_Map name_map__ZN3aaa5EE233E[] = {
  NSPAIR(_ZN3aaa5EE233C1Ev),
  NSPAIR(_ZN3aaa5EE233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE233E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
Class_Descriptor cd__ZN3aaa5EE233E = {  "_ZN3aaa5EE233E", // class name
  bases__ZN3aaa5EE233E, 2,
  &(vtc__ZN3aaa5EE233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE233E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  FF233  : ::aaa::AA2 , ::aaa::BB3 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF2333fooEv
  virtual void  bar(); // _ZN3aaa5FF2333barEv
  ~FF233(); // tgen
  FF233(); // tgen
};
//SIG(-1 _ZN3aaa5FF233E) C1{ BC2{ v2 Fi} BC3{ v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF233 ::foo(){vfunc_called(this, "_ZN3aaa5FF2333fooEv");}
void  aaa::FF233 ::bar(){vfunc_called(this, "_ZN3aaa5FF2333barEv");}
aaa::FF233 ::~FF233(){ note_dtor("_ZN3aaa5FF233E", this);} // tgen
aaa::FF233 ::FF233(){ note_ctor("_ZN3aaa5FF233E", this);} // tgen
}
static void Test__ZN3aaa5FF233E()
{
  extern Class_Descriptor cd__ZN3aaa5FF233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF233E, buf);
    ::aaa::FF233 *dp, &lv = *(dp=new (buf) ::aaa::FF233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF233E)");
    check_base_class_offset(lv, (::aaa::AA2*), 0, "_ZN3aaa5FF233E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF233E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF233E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF233E);
    dp->::aaa::FF233::~FF233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF233E(Test__ZN3aaa5FF233E, "_ZN3aaa5FF233E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF233C1Ev();
extern void _ZN3aaa5FF233D1Ev();
Name_Map name_map__ZN3aaa5FF233E[] = {
  NSPAIR(_ZN3aaa5FF233C1Ev),
  NSPAIR(_ZN3aaa5FF233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern void _ZN3aaa5FF2333barEv();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF233E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
Class_Descriptor cd__ZN3aaa5FF233E = {  "_ZN3aaa5FF233E", // class name
  bases__ZN3aaa5FF233E, 2,
  &(vtc__ZN3aaa5FF233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF233E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  EE311  : ::aaa::AA3 , ::aaa::BB1 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE3113fooEv
  ~EE311(); // tgen
  EE311(); // tgen
};
//SIG(-1 _ZN3aaa5EE311E) C1{ BC2{ v1 v2 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE311 ::foo(){vfunc_called(this, "_ZN3aaa5EE3113fooEv");}
aaa::EE311 ::~EE311(){ note_dtor("_ZN3aaa5EE311E", this);} // tgen
aaa::EE311 ::EE311(){ note_ctor("_ZN3aaa5EE311E", this);} // tgen
}
static void Test__ZN3aaa5EE311E()
{
  extern Class_Descriptor cd__ZN3aaa5EE311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE311E, buf);
    ::aaa::EE311 *dp, &lv = *(dp=new (buf) ::aaa::EE311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE311E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE311E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE311E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE311E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE311E);
    dp->::aaa::EE311::~EE311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE311E(Test__ZN3aaa5EE311E, "_ZN3aaa5EE311E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE311C1Ev();
extern void _ZN3aaa5EE311D1Ev();
Name_Map name_map__ZN3aaa5EE311E[] = {
  NSPAIR(_ZN3aaa5EE311C1Ev),
  NSPAIR(_ZN3aaa5EE311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
Class_Descriptor cd__ZN3aaa5EE311E = {  "_ZN3aaa5EE311E", // class name
  bases__ZN3aaa5EE311E, 2,
  &(vtc__ZN3aaa5EE311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE311E),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 aaa { 
struct  FF311  : ::aaa::AA3 , ::aaa::BB1 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF3113fooEv
  ~FF311(); // tgen
  FF311(); // tgen
};
//SIG(-1 _ZN3aaa5FF311E) C1{ BC2{ v1 v2 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF311 ::foo(){vfunc_called(this, "_ZN3aaa5FF3113fooEv");}
aaa::FF311 ::~FF311(){ note_dtor("_ZN3aaa5FF311E", this);} // tgen
aaa::FF311 ::FF311(){ note_ctor("_ZN3aaa5FF311E", this);} // tgen
}
static void Test__ZN3aaa5FF311E()
{
  extern Class_Descriptor cd__ZN3aaa5FF311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF311E, buf);
    ::aaa::FF311 *dp, &lv = *(dp=new (buf) ::aaa::FF311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF311E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF311E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF311E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF311E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF311E);
    dp->::aaa::FF311::~FF311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF311E(Test__ZN3aaa5FF311E, "_ZN3aaa5FF311E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF311C1Ev();
extern void _ZN3aaa5FF311D1Ev();
Name_Map name_map__ZN3aaa5FF311E[] = {
  NSPAIR(_ZN3aaa5FF311C1Ev),
  NSPAIR(_ZN3aaa5FF311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern void _ZN3aaa5FF3113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
Class_Descriptor cd__ZN3aaa5FF311E = {  "_ZN3aaa5FF311E", // class name
  bases__ZN3aaa5FF311E, 2,
  &(vtc__ZN3aaa5FF311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF311E),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 aaa { 
struct  EE312  : ::aaa::AA3 , ::aaa::BB1 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE3123barEv
  ~EE312(); // tgen
  EE312(); // tgen
};
//SIG(-1 _ZN3aaa5EE312E) C1{ BC2{ v2 v1 Fi} BC3{ v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE312 ::bar(){vfunc_called(this, "_ZN3aaa5EE3123barEv");}
aaa::EE312 ::~EE312(){ note_dtor("_ZN3aaa5EE312E", this);} // tgen
aaa::EE312 ::EE312(){ note_ctor("_ZN3aaa5EE312E", this);} // tgen
}
static void Test__ZN3aaa5EE312E()
{
  extern Class_Descriptor cd__ZN3aaa5EE312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE312E, buf);
    ::aaa::EE312 *dp, &lv = *(dp=new (buf) ::aaa::EE312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE312E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE312E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE312E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE312E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE312E);
    dp->::aaa::EE312::~EE312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE312E(Test__ZN3aaa5EE312E, "_ZN3aaa5EE312E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE312C1Ev();
extern void _ZN3aaa5EE312D1Ev();
Name_Map name_map__ZN3aaa5EE312E[] = {
  NSPAIR(_ZN3aaa5EE312C1Ev),
  NSPAIR(_ZN3aaa5EE312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
Class_Descriptor cd__ZN3aaa5EE312E = {  "_ZN3aaa5EE312E", // class name
  bases__ZN3aaa5EE312E, 2,
  &(vtc__ZN3aaa5EE312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE312E),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 aaa { 
struct  FF312  : ::aaa::AA3 , ::aaa::BB1 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF3123barEv
  ~FF312(); // tgen
  FF312(); // tgen
};
//SIG(-1 _ZN3aaa5FF312E) C1{ BC2{ v2 v1 Fi} BC3{ v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF312 ::bar(){vfunc_called(this, "_ZN3aaa5FF3123barEv");}
aaa::FF312 ::~FF312(){ note_dtor("_ZN3aaa5FF312E", this);} // tgen
aaa::FF312 ::FF312(){ note_ctor("_ZN3aaa5FF312E", this);} // tgen
}
static void Test__ZN3aaa5FF312E()
{
  extern Class_Descriptor cd__ZN3aaa5FF312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF312E, buf);
    ::aaa::FF312 *dp, &lv = *(dp=new (buf) ::aaa::FF312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF312E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF312E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF312E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF312E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF312E);
    dp->::aaa::FF312::~FF312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF312E(Test__ZN3aaa5FF312E, "_ZN3aaa5FF312E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF312C1Ev();
extern void _ZN3aaa5FF312D1Ev();
Name_Map name_map__ZN3aaa5FF312E[] = {
  NSPAIR(_ZN3aaa5FF312C1Ev),
  NSPAIR(_ZN3aaa5FF312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa5FF3123barEv();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
Class_Descriptor cd__ZN3aaa5FF312E = {  "_ZN3aaa5FF312E", // class name
  bases__ZN3aaa5FF312E, 2,
  &(vtc__ZN3aaa5FF312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF312E),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 aaa { 
struct  EE313  : ::aaa::AA3 , ::aaa::BB1 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE3133fooEv
  virtual void  bar(); // _ZN3aaa5EE3133barEv
  ~EE313(); // tgen
  EE313(); // tgen
};
//SIG(-1 _ZN3aaa5EE313E) C1{ BC2{ v1 v2 Fi} BC3{ v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE313 ::foo(){vfunc_called(this, "_ZN3aaa5EE3133fooEv");}
void  aaa::EE313 ::bar(){vfunc_called(this, "_ZN3aaa5EE3133barEv");}
aaa::EE313 ::~EE313(){ note_dtor("_ZN3aaa5EE313E", this);} // tgen
aaa::EE313 ::EE313(){ note_ctor("_ZN3aaa5EE313E", this);} // tgen
}
static void Test__ZN3aaa5EE313E()
{
  extern Class_Descriptor cd__ZN3aaa5EE313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE313E, buf);
    ::aaa::EE313 *dp, &lv = *(dp=new (buf) ::aaa::EE313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE313E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE313E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5EE313E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE313E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE313E);
    dp->::aaa::EE313::~EE313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE313E(Test__ZN3aaa5EE313E, "_ZN3aaa5EE313E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE313C1Ev();
extern void _ZN3aaa5EE313D1Ev();
Name_Map name_map__ZN3aaa5EE313E[] = {
  NSPAIR(_ZN3aaa5EE313C1Ev),
  NSPAIR(_ZN3aaa5EE313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5EE313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE313E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
Class_Descriptor cd__ZN3aaa5EE313E = {  "_ZN3aaa5EE313E", // class name
  bases__ZN3aaa5EE313E, 2,
  &(vtc__ZN3aaa5EE313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE313E),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 aaa { 
struct  FF313  : ::aaa::AA3 , ::aaa::BB1 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF3133fooEv
  virtual void  bar(); // _ZN3aaa5FF3133barEv
  ~FF313(); // tgen
  FF313(); // tgen
};
//SIG(-1 _ZN3aaa5FF313E) C1{ BC2{ v1 v2 Fi} BC3{ v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF313 ::foo(){vfunc_called(this, "_ZN3aaa5FF3133fooEv");}
void  aaa::FF313 ::bar(){vfunc_called(this, "_ZN3aaa5FF3133barEv");}
aaa::FF313 ::~FF313(){ note_dtor("_ZN3aaa5FF313E", this);} // tgen
aaa::FF313 ::FF313(){ note_ctor("_ZN3aaa5FF313E", this);} // tgen
}
static void Test__ZN3aaa5FF313E()
{
  extern Class_Descriptor cd__ZN3aaa5FF313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF313E, buf);
    ::aaa::FF313 *dp, &lv = *(dp=new (buf) ::aaa::FF313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF313E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF313E");
    check_base_class_offset(lv, (::aaa::BB1*), ABISELECT(16,8), "_ZN3aaa5FF313E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF313E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF313E);
    dp->::aaa::FF313::~FF313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF313E(Test__ZN3aaa5FF313E, "_ZN3aaa5FF313E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF313C1Ev();
extern void _ZN3aaa5FF313D1Ev();
Name_Map name_map__ZN3aaa5FF313E[] = {
  NSPAIR(_ZN3aaa5FF313C1Ev),
  NSPAIR(_ZN3aaa5FF313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
static Base_Class bases__ZN3aaa5FF313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern void _ZN3aaa5FF3133fooEv();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF313E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
Class_Descriptor cd__ZN3aaa5FF313E = {  "_ZN3aaa5FF313E", // class name
  bases__ZN3aaa5FF313E, 2,
  &(vtc__ZN3aaa5FF313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF313E),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 aaa { 
struct  EE321  : ::aaa::AA3 , ::aaa::BB2 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE3213fooEv
  ~EE321(); // tgen
  EE321(); // tgen
};
//SIG(-1 _ZN3aaa5EE321E) C1{ BC2{ v1 v2 Fi} BC3{ v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE321 ::foo(){vfunc_called(this, "_ZN3aaa5EE3213fooEv");}
aaa::EE321 ::~EE321(){ note_dtor("_ZN3aaa5EE321E", this);} // tgen
aaa::EE321 ::EE321(){ note_ctor("_ZN3aaa5EE321E", this);} // tgen
}
static void Test__ZN3aaa5EE321E()
{
  extern Class_Descriptor cd__ZN3aaa5EE321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE321E, buf);
    ::aaa::EE321 *dp, &lv = *(dp=new (buf) ::aaa::EE321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE321E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE321E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE321E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE321E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE321E);
    dp->::aaa::EE321::~EE321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE321E(Test__ZN3aaa5EE321E, "_ZN3aaa5EE321E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE321C1Ev();
extern void _ZN3aaa5EE321D1Ev();
Name_Map name_map__ZN3aaa5EE321E[] = {
  NSPAIR(_ZN3aaa5EE321C1Ev),
  NSPAIR(_ZN3aaa5EE321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
Class_Descriptor cd__ZN3aaa5EE321E = {  "_ZN3aaa5EE321E", // class name
  bases__ZN3aaa5EE321E, 2,
  &(vtc__ZN3aaa5EE321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE321E),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 aaa { 
struct  FF321  : ::aaa::AA3 , ::aaa::BB2 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF3213fooEv
  ~FF321(); // tgen
  FF321(); // tgen
};
//SIG(-1 _ZN3aaa5FF321E) C1{ BC2{ v1 v2 Fi} BC3{ v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF321 ::foo(){vfunc_called(this, "_ZN3aaa5FF3213fooEv");}
aaa::FF321 ::~FF321(){ note_dtor("_ZN3aaa5FF321E", this);} // tgen
aaa::FF321 ::FF321(){ note_ctor("_ZN3aaa5FF321E", this);} // tgen
}
static void Test__ZN3aaa5FF321E()
{
  extern Class_Descriptor cd__ZN3aaa5FF321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF321E, buf);
    ::aaa::FF321 *dp, &lv = *(dp=new (buf) ::aaa::FF321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF321E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF321E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF321E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF321E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF321E);
    dp->::aaa::FF321::~FF321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF321E(Test__ZN3aaa5FF321E, "_ZN3aaa5FF321E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF321C1Ev();
extern void _ZN3aaa5FF321D1Ev();
Name_Map name_map__ZN3aaa5FF321E[] = {
  NSPAIR(_ZN3aaa5FF321C1Ev),
  NSPAIR(_ZN3aaa5FF321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern void _ZN3aaa5FF3213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
Class_Descriptor cd__ZN3aaa5FF321E = {  "_ZN3aaa5FF321E", // class name
  bases__ZN3aaa5FF321E, 2,
  &(vtc__ZN3aaa5FF321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF321E),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 aaa { 
struct  EE322  : ::aaa::AA3 , ::aaa::BB2 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE3223barEv
  ~EE322(); // tgen
  EE322(); // tgen
};
//SIG(-1 _ZN3aaa5EE322E) C1{ BC2{ v2 v1 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE322 ::bar(){vfunc_called(this, "_ZN3aaa5EE3223barEv");}
aaa::EE322 ::~EE322(){ note_dtor("_ZN3aaa5EE322E", this);} // tgen
aaa::EE322 ::EE322(){ note_ctor("_ZN3aaa5EE322E", this);} // tgen
}
static void Test__ZN3aaa5EE322E()
{
  extern Class_Descriptor cd__ZN3aaa5EE322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE322E, buf);
    ::aaa::EE322 *dp, &lv = *(dp=new (buf) ::aaa::EE322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE322E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE322E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE322E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE322E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE322E);
    dp->::aaa::EE322::~EE322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE322E(Test__ZN3aaa5EE322E, "_ZN3aaa5EE322E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE322C1Ev();
extern void _ZN3aaa5EE322D1Ev();
Name_Map name_map__ZN3aaa5EE322E[] = {
  NSPAIR(_ZN3aaa5EE322C1Ev),
  NSPAIR(_ZN3aaa5EE322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
Class_Descriptor cd__ZN3aaa5EE322E = {  "_ZN3aaa5EE322E", // class name
  bases__ZN3aaa5EE322E, 2,
  &(vtc__ZN3aaa5EE322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE322E),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 aaa { 
struct  FF322  : ::aaa::AA3 , ::aaa::BB2 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF3223barEv
  ~FF322(); // tgen
  FF322(); // tgen
};
//SIG(-1 _ZN3aaa5FF322E) C1{ BC2{ v2 v1 Fi} BC3{ v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF322 ::bar(){vfunc_called(this, "_ZN3aaa5FF3223barEv");}
aaa::FF322 ::~FF322(){ note_dtor("_ZN3aaa5FF322E", this);} // tgen
aaa::FF322 ::FF322(){ note_ctor("_ZN3aaa5FF322E", this);} // tgen
}
static void Test__ZN3aaa5FF322E()
{
  extern Class_Descriptor cd__ZN3aaa5FF322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF322E, buf);
    ::aaa::FF322 *dp, &lv = *(dp=new (buf) ::aaa::FF322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF322E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF322E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF322E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF322E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF322E);
    dp->::aaa::FF322::~FF322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF322E(Test__ZN3aaa5FF322E, "_ZN3aaa5FF322E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF322C1Ev();
extern void _ZN3aaa5FF322D1Ev();
Name_Map name_map__ZN3aaa5FF322E[] = {
  NSPAIR(_ZN3aaa5FF322C1Ev),
  NSPAIR(_ZN3aaa5FF322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
Class_Descriptor cd__ZN3aaa5FF322E = {  "_ZN3aaa5FF322E", // class name
  bases__ZN3aaa5FF322E, 2,
  &(vtc__ZN3aaa5FF322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF322E),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 aaa { 
struct  EE323  : ::aaa::AA3 , ::aaa::BB2 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE3233fooEv
  virtual void  bar(); // _ZN3aaa5EE3233barEv
  ~EE323(); // tgen
  EE323(); // tgen
};
//SIG(-1 _ZN3aaa5EE323E) C1{ BC2{ v1 v2 Fi} BC3{ v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE323 ::foo(){vfunc_called(this, "_ZN3aaa5EE3233fooEv");}
void  aaa::EE323 ::bar(){vfunc_called(this, "_ZN3aaa5EE3233barEv");}
aaa::EE323 ::~EE323(){ note_dtor("_ZN3aaa5EE323E", this);} // tgen
aaa::EE323 ::EE323(){ note_ctor("_ZN3aaa5EE323E", this);} // tgen
}
static void Test__ZN3aaa5EE323E()
{
  extern Class_Descriptor cd__ZN3aaa5EE323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE323E, buf);
    ::aaa::EE323 *dp, &lv = *(dp=new (buf) ::aaa::EE323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE323E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE323E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5EE323E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE323E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE323E);
    dp->::aaa::EE323::~EE323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE323E(Test__ZN3aaa5EE323E, "_ZN3aaa5EE323E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE323C1Ev();
extern void _ZN3aaa5EE323D1Ev();
Name_Map name_map__ZN3aaa5EE323E[] = {
  NSPAIR(_ZN3aaa5EE323C1Ev),
  NSPAIR(_ZN3aaa5EE323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5EE323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE323E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
Class_Descriptor cd__ZN3aaa5EE323E = {  "_ZN3aaa5EE323E", // class name
  bases__ZN3aaa5EE323E, 2,
  &(vtc__ZN3aaa5EE323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE323E),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 aaa { 
struct  FF323  : ::aaa::AA3 , ::aaa::BB2 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF3233fooEv
  virtual void  bar(); // _ZN3aaa5FF3233barEv
  ~FF323(); // tgen
  FF323(); // tgen
};
//SIG(-1 _ZN3aaa5FF323E) C1{ BC2{ v1 v2 Fi} BC3{ v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF323 ::foo(){vfunc_called(this, "_ZN3aaa5FF3233fooEv");}
void  aaa::FF323 ::bar(){vfunc_called(this, "_ZN3aaa5FF3233barEv");}
aaa::FF323 ::~FF323(){ note_dtor("_ZN3aaa5FF323E", this);} // tgen
aaa::FF323 ::FF323(){ note_ctor("_ZN3aaa5FF323E", this);} // tgen
}
static void Test__ZN3aaa5FF323E()
{
  extern Class_Descriptor cd__ZN3aaa5FF323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF323E, buf);
    ::aaa::FF323 *dp, &lv = *(dp=new (buf) ::aaa::FF323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF323E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF323E");
    check_base_class_offset(lv, (::aaa::BB2*), ABISELECT(16,8), "_ZN3aaa5FF323E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF323E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF323E);
    dp->::aaa::FF323::~FF323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF323E(Test__ZN3aaa5FF323E, "_ZN3aaa5FF323E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF323C1Ev();
extern void _ZN3aaa5FF323D1Ev();
Name_Map name_map__ZN3aaa5FF323E[] = {
  NSPAIR(_ZN3aaa5FF323C1Ev),
  NSPAIR(_ZN3aaa5FF323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
static Base_Class bases__ZN3aaa5FF323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern void _ZN3aaa5FF3233fooEv();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF323E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
Class_Descriptor cd__ZN3aaa5FF323E = {  "_ZN3aaa5FF323E", // class name
  bases__ZN3aaa5FF323E, 2,
  &(vtc__ZN3aaa5FF323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF323E),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 aaa { 
struct  EE331  : ::aaa::AA3 , ::aaa::BB3 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE3313fooEv
  ~EE331(); // tgen
  EE331(); // tgen
};
//SIG(-1 _ZN3aaa5EE331E) C1{ BC2{ v1 v2 Fi} BC3{ v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE331 ::foo(){vfunc_called(this, "_ZN3aaa5EE3313fooEv");}
aaa::EE331 ::~EE331(){ note_dtor("_ZN3aaa5EE331E", this);} // tgen
aaa::EE331 ::EE331(){ note_ctor("_ZN3aaa5EE331E", this);} // tgen
}
static void Test__ZN3aaa5EE331E()
{
  extern Class_Descriptor cd__ZN3aaa5EE331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE331E, buf);
    ::aaa::EE331 *dp, &lv = *(dp=new (buf) ::aaa::EE331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE331E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE331E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE331E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE331E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE331E);
    dp->::aaa::EE331::~EE331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE331E(Test__ZN3aaa5EE331E, "_ZN3aaa5EE331E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE331C1Ev();
extern void _ZN3aaa5EE331D1Ev();
Name_Map name_map__ZN3aaa5EE331E[] = {
  NSPAIR(_ZN3aaa5EE331C1Ev),
  NSPAIR(_ZN3aaa5EE331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa5EE331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
Class_Descriptor cd__ZN3aaa5EE331E = {  "_ZN3aaa5EE331E", // class name
  bases__ZN3aaa5EE331E, 2,
  &(vtc__ZN3aaa5EE331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE331E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  FF331  : ::aaa::AA3 , ::aaa::BB3 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF3313fooEv
  ~FF331(); // tgen
  FF331(); // tgen
};
//SIG(-1 _ZN3aaa5FF331E) C1{ BC2{ v1 v2 Fi} BC3{ v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF331 ::foo(){vfunc_called(this, "_ZN3aaa5FF3313fooEv");}
aaa::FF331 ::~FF331(){ note_dtor("_ZN3aaa5FF331E", this);} // tgen
aaa::FF331 ::FF331(){ note_ctor("_ZN3aaa5FF331E", this);} // tgen
}
static void Test__ZN3aaa5FF331E()
{
  extern Class_Descriptor cd__ZN3aaa5FF331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF331E, buf);
    ::aaa::FF331 *dp, &lv = *(dp=new (buf) ::aaa::FF331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF331E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF331E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF331E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF331E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF331E);
    dp->::aaa::FF331::~FF331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF331E(Test__ZN3aaa5FF331E, "_ZN3aaa5FF331E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF331C1Ev();
extern void _ZN3aaa5FF331D1Ev();
Name_Map name_map__ZN3aaa5FF331E[] = {
  NSPAIR(_ZN3aaa5FF331C1Ev),
  NSPAIR(_ZN3aaa5FF331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern void _ZN3aaa5FF3313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa5FF331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
Class_Descriptor cd__ZN3aaa5FF331E = {  "_ZN3aaa5FF331E", // class name
  bases__ZN3aaa5FF331E, 2,
  &(vtc__ZN3aaa5FF331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF331E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  EE332  : ::aaa::AA3 , ::aaa::BB3 {
  int pe;
  virtual void  bar(); // _ZN3aaa5EE3323barEv
  ~EE332(); // tgen
  EE332(); // tgen
};
//SIG(-1 _ZN3aaa5EE332E) C1{ BC2{ v2 v1 Fi} BC3{ v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::EE332 ::bar(){vfunc_called(this, "_ZN3aaa5EE3323barEv");}
aaa::EE332 ::~EE332(){ note_dtor("_ZN3aaa5EE332E", this);} // tgen
aaa::EE332 ::EE332(){ note_ctor("_ZN3aaa5EE332E", this);} // tgen
}
static void Test__ZN3aaa5EE332E()
{
  extern Class_Descriptor cd__ZN3aaa5EE332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE332E, buf);
    ::aaa::EE332 *dp, &lv = *(dp=new (buf) ::aaa::EE332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE332E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE332E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE332E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE332E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE332E);
    dp->::aaa::EE332::~EE332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE332E(Test__ZN3aaa5EE332E, "_ZN3aaa5EE332E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE332C1Ev();
extern void _ZN3aaa5EE332D1Ev();
Name_Map name_map__ZN3aaa5EE332E[] = {
  NSPAIR(_ZN3aaa5EE332C1Ev),
  NSPAIR(_ZN3aaa5EE332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
Class_Descriptor cd__ZN3aaa5EE332E = {  "_ZN3aaa5EE332E", // class name
  bases__ZN3aaa5EE332E, 2,
  &(vtc__ZN3aaa5EE332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE332E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  FF332  : ::aaa::AA3 , ::aaa::BB3 {
  int pf;
  virtual void  bar(); // _ZN3aaa5FF3323barEv
  ~FF332(); // tgen
  FF332(); // tgen
};
//SIG(-1 _ZN3aaa5FF332E) C1{ BC2{ v2 v1 Fi} BC3{ v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::FF332 ::bar(){vfunc_called(this, "_ZN3aaa5FF3323barEv");}
aaa::FF332 ::~FF332(){ note_dtor("_ZN3aaa5FF332E", this);} // tgen
aaa::FF332 ::FF332(){ note_ctor("_ZN3aaa5FF332E", this);} // tgen
}
static void Test__ZN3aaa5FF332E()
{
  extern Class_Descriptor cd__ZN3aaa5FF332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF332E, buf);
    ::aaa::FF332 *dp, &lv = *(dp=new (buf) ::aaa::FF332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF332E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF332E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF332E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF332E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF332E);
    dp->::aaa::FF332::~FF332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF332E(Test__ZN3aaa5FF332E, "_ZN3aaa5FF332E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF332C1Ev();
extern void _ZN3aaa5FF332D1Ev();
Name_Map name_map__ZN3aaa5FF332E[] = {
  NSPAIR(_ZN3aaa5FF332C1Ev),
  NSPAIR(_ZN3aaa5FF332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa5FF3323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
Class_Descriptor cd__ZN3aaa5FF332E = {  "_ZN3aaa5FF332E", // class name
  bases__ZN3aaa5FF332E, 2,
  &(vtc__ZN3aaa5FF332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF332E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  EE333  : ::aaa::AA3 , ::aaa::BB3 {
  int pe;
  virtual void  foo(); // _ZN3aaa5EE3333fooEv
  virtual void  bar(); // _ZN3aaa5EE3333barEv
  ~EE333(); // tgen
  EE333(); // tgen
};
//SIG(-1 _ZN3aaa5EE333E) C1{ BC2{ v1 v2 Fi} BC3{ v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::EE333 ::foo(){vfunc_called(this, "_ZN3aaa5EE3333fooEv");}
void  aaa::EE333 ::bar(){vfunc_called(this, "_ZN3aaa5EE3333barEv");}
aaa::EE333 ::~EE333(){ note_dtor("_ZN3aaa5EE333E", this);} // tgen
aaa::EE333 ::EE333(){ note_ctor("_ZN3aaa5EE333E", this);} // tgen
}
static void Test__ZN3aaa5EE333E()
{
  extern Class_Descriptor cd__ZN3aaa5EE333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5EE333E, buf);
    ::aaa::EE333 *dp, &lv = *(dp=new (buf) ::aaa::EE333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5EE333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5EE333E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5EE333E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5EE333E");
    check_field_offset(lv, pe, ABISELECT(28,16), "_ZN3aaa5EE333E.pe");
    test_class_info(&lv, &cd__ZN3aaa5EE333E);
    dp->::aaa::EE333::~EE333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5EE333E(Test__ZN3aaa5EE333E, "_ZN3aaa5EE333E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5EE333C1Ev();
extern void _ZN3aaa5EE333D1Ev();
Name_Map name_map__ZN3aaa5EE333E[] = {
  NSPAIR(_ZN3aaa5EE333C1Ev),
  NSPAIR(_ZN3aaa5EE333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5EE333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5EE333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5EE333E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5EE333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
Class_Descriptor cd__ZN3aaa5EE333E = {  "_ZN3aaa5EE333E", // class name
  bases__ZN3aaa5EE333E, 2,
  &(vtc__ZN3aaa5EE333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5EE333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5EE333E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  FF333  : ::aaa::AA3 , ::aaa::BB3 {
  int pf;
  virtual void  foo(); // _ZN3aaa5FF3333fooEv
  virtual void  bar(); // _ZN3aaa5FF3333barEv
  ~FF333(); // tgen
  FF333(); // tgen
};
//SIG(-1 _ZN3aaa5FF333E) C1{ BC2{ v1 v2 Fi} BC3{ v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::FF333 ::foo(){vfunc_called(this, "_ZN3aaa5FF3333fooEv");}
void  aaa::FF333 ::bar(){vfunc_called(this, "_ZN3aaa5FF3333barEv");}
aaa::FF333 ::~FF333(){ note_dtor("_ZN3aaa5FF333E", this);} // tgen
aaa::FF333 ::FF333(){ note_ctor("_ZN3aaa5FF333E", this);} // tgen
}
static void Test__ZN3aaa5FF333E()
{
  extern Class_Descriptor cd__ZN3aaa5FF333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd__ZN3aaa5FF333E, buf);
    ::aaa::FF333 *dp, &lv = *(dp=new (buf) ::aaa::FF333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(_ZN3aaa5FF333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa5FF333E)");
    check_base_class_offset(lv, (::aaa::AA3*), 0, "_ZN3aaa5FF333E");
    check_base_class_offset(lv, (::aaa::BB3*), ABISELECT(16,8), "_ZN3aaa5FF333E");
    check_field_offset(lv, pf, ABISELECT(28,16), "_ZN3aaa5FF333E.pf");
    test_class_info(&lv, &cd__ZN3aaa5FF333E);
    dp->::aaa::FF333::~FF333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa5FF333E(Test__ZN3aaa5FF333E, "_ZN3aaa5FF333E", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3aaa5FF333C1Ev();
extern void _ZN3aaa5FF333D1Ev();
Name_Map name_map__ZN3aaa5FF333E[] = {
  NSPAIR(_ZN3aaa5FF333C1Ev),
  NSPAIR(_ZN3aaa5FF333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
static Base_Class bases__ZN3aaa5FF333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern void _ZN3aaa5FF3333fooEv();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa5FF333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa5FF333E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa5FF333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
Class_Descriptor cd__ZN3aaa5FF333E = {  "_ZN3aaa5FF333E", // class name
  bases__ZN3aaa5FF333E, 2,
  &(vtc__ZN3aaa5FF333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTIN3aaa5FF333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa5FF333E),8, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111111  : ::aaa::EE111 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11111113fooEv
  ~GG1111111(); // tgen
  GG1111111(); // tgen
};
//SIG(1 _ZN3aaa9GG1111111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11111113fooEv");}
aaa::GG1111111 ::~GG1111111(){ note_dtor("_ZN3aaa9GG1111111E", this);} // tgen
aaa::GG1111111 ::GG1111111(){ note_ctor("_ZN3aaa9GG1111111E", this);} // tgen
}
static void Test__ZN3aaa9GG1111111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111111E, buf);
    ::aaa::GG1111111 *dp, &lv = *(dp=new (buf) ::aaa::GG1111111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111111E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1111111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1111111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1111111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111111E);
    dp->::aaa::GG1111111::~GG1111111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111111E(Test__ZN3aaa9GG1111111E, "_ZN3aaa9GG1111111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111111C1Ev();
extern void _ZN3aaa9GG1111111D1Ev();
Name_Map name_map__ZN3aaa9GG1111111E[] = {
  NSPAIR(_ZN3aaa9GG1111111C1Ev),
  NSPAIR(_ZN3aaa9GG1111111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1111111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111111E[];
extern void _ZN3aaa9GG11111113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11111113fooEv,_ZThn8_N3aaa9GG11111113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11111113fooEv,_ZThn20_N3aaa9GG11111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11111113fooEv,_ZThn28_N3aaa9GG11111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11111113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11111113fooEv,_ZThn8_N3aaa9GG11111113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111113fooEv,_ZThn20_N3aaa9GG11111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11111113fooEv,_ZThn28_N3aaa9GG11111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111111E[];
Class_Descriptor cd__ZN3aaa9GG1111111E = {  "_ZN3aaa9GG1111111E", // class name
  bases__ZN3aaa9GG1111111E, 6,
  &(vtc__ZN3aaa9GG1111111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111111E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111112  : ::aaa::EE111 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11111123barEv
  ~GG1111112(); // tgen
  GG1111112(); // tgen
};
//SIG(1 _ZN3aaa9GG1111112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11111123barEv");}
aaa::GG1111112 ::~GG1111112(){ note_dtor("_ZN3aaa9GG1111112E", this);} // tgen
aaa::GG1111112 ::GG1111112(){ note_ctor("_ZN3aaa9GG1111112E", this);} // tgen
}
static void Test__ZN3aaa9GG1111112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111112E, buf);
    ::aaa::GG1111112 *dp, &lv = *(dp=new (buf) ::aaa::GG1111112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111112E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1111112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1111112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1111112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111112E);
    dp->::aaa::GG1111112::~GG1111112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111112E(Test__ZN3aaa9GG1111112E, "_ZN3aaa9GG1111112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111112C1Ev();
extern void _ZN3aaa9GG1111112D1Ev();
Name_Map name_map__ZN3aaa9GG1111112E[] = {
  NSPAIR(_ZN3aaa9GG1111112C1Ev),
  NSPAIR(_ZN3aaa9GG1111112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1111112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111112E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11111123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11111123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111112E[];
Class_Descriptor cd__ZN3aaa9GG1111112E = {  "_ZN3aaa9GG1111112E", // class name
  bases__ZN3aaa9GG1111112E, 6,
  &(vtc__ZN3aaa9GG1111112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111113  : ::aaa::EE111 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11111133fooEv
  virtual void  bar(); // _ZN3aaa9GG11111133barEv
  ~GG1111113(); // tgen
  GG1111113(); // tgen
};
//SIG(1 _ZN3aaa9GG1111113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11111133fooEv");}
void  aaa::GG1111113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11111133barEv");}
aaa::GG1111113 ::~GG1111113(){ note_dtor("_ZN3aaa9GG1111113E", this);} // tgen
aaa::GG1111113 ::GG1111113(){ note_ctor("_ZN3aaa9GG1111113E", this);} // tgen
}
static void Test__ZN3aaa9GG1111113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111113E, buf);
    ::aaa::GG1111113 *dp, &lv = *(dp=new (buf) ::aaa::GG1111113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111113E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1111113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1111113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1111113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111113E);
    dp->::aaa::GG1111113::~GG1111113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111113E(Test__ZN3aaa9GG1111113E, "_ZN3aaa9GG1111113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111113C1Ev();
extern void _ZN3aaa9GG1111113D1Ev();
Name_Map name_map__ZN3aaa9GG1111113E[] = {
  NSPAIR(_ZN3aaa9GG1111113C1Ev),
  NSPAIR(_ZN3aaa9GG1111113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1111113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111113E[];
extern void _ZN3aaa9GG11111133fooEv();
extern void _ZN3aaa9GG11111133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11111133fooEv,_ZThn8_N3aaa9GG11111133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11111133fooEv,_ZThn20_N3aaa9GG11111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11111133fooEv,_ZThn28_N3aaa9GG11111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11111133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11111133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11111133fooEv,_ZThn8_N3aaa9GG11111133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111133fooEv,_ZThn20_N3aaa9GG11111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11111133fooEv,_ZThn28_N3aaa9GG11111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111113E[];
Class_Descriptor cd__ZN3aaa9GG1111113E = {  "_ZN3aaa9GG1111113E", // class name
  bases__ZN3aaa9GG1111113E, 6,
  &(vtc__ZN3aaa9GG1111113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111121  : ::aaa::EE111 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11111213fooEv
  ~GG1111121(); // tgen
  GG1111121(); // tgen
};
//SIG(1 _ZN3aaa9GG1111121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11111213fooEv");}
aaa::GG1111121 ::~GG1111121(){ note_dtor("_ZN3aaa9GG1111121E", this);} // tgen
aaa::GG1111121 ::GG1111121(){ note_ctor("_ZN3aaa9GG1111121E", this);} // tgen
}
static void Test__ZN3aaa9GG1111121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111121E, buf);
    ::aaa::GG1111121 *dp, &lv = *(dp=new (buf) ::aaa::GG1111121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111121E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1111121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1111121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1111121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111121E);
    dp->::aaa::GG1111121::~GG1111121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111121E(Test__ZN3aaa9GG1111121E, "_ZN3aaa9GG1111121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111121C1Ev();
extern void _ZN3aaa9GG1111121D1Ev();
Name_Map name_map__ZN3aaa9GG1111121E[] = {
  NSPAIR(_ZN3aaa9GG1111121C1Ev),
  NSPAIR(_ZN3aaa9GG1111121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1111121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111121E[];
extern void _ZN3aaa9GG11111213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11111213fooEv,_ZThn8_N3aaa9GG11111213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11111213fooEv,_ZThn20_N3aaa9GG11111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11111213fooEv,_ZThn28_N3aaa9GG11111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11111213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11111213fooEv,_ZThn8_N3aaa9GG11111213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111213fooEv,_ZThn20_N3aaa9GG11111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11111213fooEv,_ZThn28_N3aaa9GG11111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111121E[];
Class_Descriptor cd__ZN3aaa9GG1111121E = {  "_ZN3aaa9GG1111121E", // class name
  bases__ZN3aaa9GG1111121E, 6,
  &(vtc__ZN3aaa9GG1111121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111122  : ::aaa::EE111 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11111223barEv
  ~GG1111122(); // tgen
  GG1111122(); // tgen
};
//SIG(1 _ZN3aaa9GG1111122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11111223barEv");}
aaa::GG1111122 ::~GG1111122(){ note_dtor("_ZN3aaa9GG1111122E", this);} // tgen
aaa::GG1111122 ::GG1111122(){ note_ctor("_ZN3aaa9GG1111122E", this);} // tgen
}
static void Test__ZN3aaa9GG1111122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111122E, buf);
    ::aaa::GG1111122 *dp, &lv = *(dp=new (buf) ::aaa::GG1111122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111122E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1111122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1111122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1111122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111122E);
    dp->::aaa::GG1111122::~GG1111122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111122E(Test__ZN3aaa9GG1111122E, "_ZN3aaa9GG1111122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111122C1Ev();
extern void _ZN3aaa9GG1111122D1Ev();
Name_Map name_map__ZN3aaa9GG1111122E[] = {
  NSPAIR(_ZN3aaa9GG1111122C1Ev),
  NSPAIR(_ZN3aaa9GG1111122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1111122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111122E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11111223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11111223barEv,_ZThn20_N3aaa9GG11111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11111223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111223barEv,_ZThn20_N3aaa9GG11111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111122E[];
Class_Descriptor cd__ZN3aaa9GG1111122E = {  "_ZN3aaa9GG1111122E", // class name
  bases__ZN3aaa9GG1111122E, 6,
  &(vtc__ZN3aaa9GG1111122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111123  : ::aaa::EE111 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11111233fooEv
  virtual void  bar(); // _ZN3aaa9GG11111233barEv
  ~GG1111123(); // tgen
  GG1111123(); // tgen
};
//SIG(1 _ZN3aaa9GG1111123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11111233fooEv");}
void  aaa::GG1111123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11111233barEv");}
aaa::GG1111123 ::~GG1111123(){ note_dtor("_ZN3aaa9GG1111123E", this);} // tgen
aaa::GG1111123 ::GG1111123(){ note_ctor("_ZN3aaa9GG1111123E", this);} // tgen
}
static void Test__ZN3aaa9GG1111123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111123E, buf);
    ::aaa::GG1111123 *dp, &lv = *(dp=new (buf) ::aaa::GG1111123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111123E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1111123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1111123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1111123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111123E);
    dp->::aaa::GG1111123::~GG1111123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111123E(Test__ZN3aaa9GG1111123E, "_ZN3aaa9GG1111123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111123C1Ev();
extern void _ZN3aaa9GG1111123D1Ev();
Name_Map name_map__ZN3aaa9GG1111123E[] = {
  NSPAIR(_ZN3aaa9GG1111123C1Ev),
  NSPAIR(_ZN3aaa9GG1111123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1111123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111123E[];
extern void _ZN3aaa9GG11111233fooEv();
extern void _ZN3aaa9GG11111233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11111233fooEv,_ZThn8_N3aaa9GG11111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11111233fooEv,_ZThn20_N3aaa9GG11111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11111233barEv,_ZThn20_N3aaa9GG11111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11111233fooEv,_ZThn28_N3aaa9GG11111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11111233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11111233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11111233fooEv,_ZThn8_N3aaa9GG11111233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111233fooEv,_ZThn20_N3aaa9GG11111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111233barEv,_ZThn20_N3aaa9GG11111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11111233fooEv,_ZThn28_N3aaa9GG11111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111123E[];
Class_Descriptor cd__ZN3aaa9GG1111123E = {  "_ZN3aaa9GG1111123E", // class name
  bases__ZN3aaa9GG1111123E, 6,
  &(vtc__ZN3aaa9GG1111123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111131  : ::aaa::EE111 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11111313fooEv
  ~GG1111131(); // tgen
  GG1111131(); // tgen
};
//SIG(1 _ZN3aaa9GG1111131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11111313fooEv");}
aaa::GG1111131 ::~GG1111131(){ note_dtor("_ZN3aaa9GG1111131E", this);} // tgen
aaa::GG1111131 ::GG1111131(){ note_ctor("_ZN3aaa9GG1111131E", this);} // tgen
}
static void Test__ZN3aaa9GG1111131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111131E, buf);
    ::aaa::GG1111131 *dp, &lv = *(dp=new (buf) ::aaa::GG1111131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111131E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1111131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1111131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1111131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111131E);
    dp->::aaa::GG1111131::~GG1111131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111131E(Test__ZN3aaa9GG1111131E, "_ZN3aaa9GG1111131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111131C1Ev();
extern void _ZN3aaa9GG1111131D1Ev();
Name_Map name_map__ZN3aaa9GG1111131E[] = {
  NSPAIR(_ZN3aaa9GG1111131C1Ev),
  NSPAIR(_ZN3aaa9GG1111131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1111131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111131E[];
extern void _ZN3aaa9GG11111313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11111313fooEv,_ZThn8_N3aaa9GG11111313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11111313fooEv,_ZThn20_N3aaa9GG11111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11111313fooEv,_ZThn28_N3aaa9GG11111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11111313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11111313fooEv,_ZThn8_N3aaa9GG11111313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111313fooEv,_ZThn20_N3aaa9GG11111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11111313fooEv,_ZThn28_N3aaa9GG11111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111131E[];
Class_Descriptor cd__ZN3aaa9GG1111131E = {  "_ZN3aaa9GG1111131E", // class name
  bases__ZN3aaa9GG1111131E, 6,
  &(vtc__ZN3aaa9GG1111131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111131E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111132  : ::aaa::EE111 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11111323barEv
  ~GG1111132(); // tgen
  GG1111132(); // tgen
};
//SIG(1 _ZN3aaa9GG1111132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11111323barEv");}
aaa::GG1111132 ::~GG1111132(){ note_dtor("_ZN3aaa9GG1111132E", this);} // tgen
aaa::GG1111132 ::GG1111132(){ note_ctor("_ZN3aaa9GG1111132E", this);} // tgen
}
static void Test__ZN3aaa9GG1111132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111132E, buf);
    ::aaa::GG1111132 *dp, &lv = *(dp=new (buf) ::aaa::GG1111132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111132E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1111132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1111132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1111132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111132E);
    dp->::aaa::GG1111132::~GG1111132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111132E(Test__ZN3aaa9GG1111132E, "_ZN3aaa9GG1111132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111132C1Ev();
extern void _ZN3aaa9GG1111132D1Ev();
Name_Map name_map__ZN3aaa9GG1111132E[] = {
  NSPAIR(_ZN3aaa9GG1111132C1Ev),
  NSPAIR(_ZN3aaa9GG1111132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1111132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111132E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11111323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11111323barEv,_ZThn20_N3aaa9GG11111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11111323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111323barEv,_ZThn20_N3aaa9GG11111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111132E[];
Class_Descriptor cd__ZN3aaa9GG1111132E = {  "_ZN3aaa9GG1111132E", // class name
  bases__ZN3aaa9GG1111132E, 6,
  &(vtc__ZN3aaa9GG1111132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111133  : ::aaa::EE111 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11111333fooEv
  virtual void  bar(); // _ZN3aaa9GG11111333barEv
  ~GG1111133(); // tgen
  GG1111133(); // tgen
};
//SIG(1 _ZN3aaa9GG1111133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11111333fooEv");}
void  aaa::GG1111133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11111333barEv");}
aaa::GG1111133 ::~GG1111133(){ note_dtor("_ZN3aaa9GG1111133E", this);} // tgen
aaa::GG1111133 ::GG1111133(){ note_ctor("_ZN3aaa9GG1111133E", this);} // tgen
}
static void Test__ZN3aaa9GG1111133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111133E, buf);
    ::aaa::GG1111133 *dp, &lv = *(dp=new (buf) ::aaa::GG1111133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111133E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1111133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1111133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1111133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111133E);
    dp->::aaa::GG1111133::~GG1111133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111133E(Test__ZN3aaa9GG1111133E, "_ZN3aaa9GG1111133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111133C1Ev();
extern void _ZN3aaa9GG1111133D1Ev();
Name_Map name_map__ZN3aaa9GG1111133E[] = {
  NSPAIR(_ZN3aaa9GG1111133C1Ev),
  NSPAIR(_ZN3aaa9GG1111133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1111133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111133E[];
extern void _ZN3aaa9GG11111333fooEv();
extern void _ZN3aaa9GG11111333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11111333fooEv,_ZThn8_N3aaa9GG11111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11111333fooEv,_ZThn20_N3aaa9GG11111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11111333barEv,_ZThn20_N3aaa9GG11111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11111333fooEv,_ZThn28_N3aaa9GG11111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11111333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11111333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11111333fooEv,_ZThn8_N3aaa9GG11111333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111333fooEv,_ZThn20_N3aaa9GG11111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11111333barEv,_ZThn20_N3aaa9GG11111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11111333fooEv,_ZThn28_N3aaa9GG11111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111133E[];
Class_Descriptor cd__ZN3aaa9GG1111133E = {  "_ZN3aaa9GG1111133E", // class name
  bases__ZN3aaa9GG1111133E, 6,
  &(vtc__ZN3aaa9GG1111133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111211  : ::aaa::EE111 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11112113fooEv
  ~GG1111211(); // tgen
  GG1111211(); // tgen
};
//SIG(1 _ZN3aaa9GG1111211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11112113fooEv");}
aaa::GG1111211 ::~GG1111211(){ note_dtor("_ZN3aaa9GG1111211E", this);} // tgen
aaa::GG1111211 ::GG1111211(){ note_ctor("_ZN3aaa9GG1111211E", this);} // tgen
}
static void Test__ZN3aaa9GG1111211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111211E, buf);
    ::aaa::GG1111211 *dp, &lv = *(dp=new (buf) ::aaa::GG1111211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111211E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1111211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1111211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1111211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111211E);
    dp->::aaa::GG1111211::~GG1111211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111211E(Test__ZN3aaa9GG1111211E, "_ZN3aaa9GG1111211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111211C1Ev();
extern void _ZN3aaa9GG1111211D1Ev();
Name_Map name_map__ZN3aaa9GG1111211E[] = {
  NSPAIR(_ZN3aaa9GG1111211C1Ev),
  NSPAIR(_ZN3aaa9GG1111211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1111211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111211E[];
extern void _ZN3aaa9GG11112113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11112113fooEv,_ZThn8_N3aaa9GG11112113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11112113fooEv,_ZThn20_N3aaa9GG11112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11112113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11112113fooEv,_ZThn8_N3aaa9GG11112113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112113fooEv,_ZThn20_N3aaa9GG11112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111211E[];
Class_Descriptor cd__ZN3aaa9GG1111211E = {  "_ZN3aaa9GG1111211E", // class name
  bases__ZN3aaa9GG1111211E, 6,
  &(vtc__ZN3aaa9GG1111211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111211E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111212  : ::aaa::EE111 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11112123barEv
  ~GG1111212(); // tgen
  GG1111212(); // tgen
};
//SIG(1 _ZN3aaa9GG1111212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11112123barEv");}
aaa::GG1111212 ::~GG1111212(){ note_dtor("_ZN3aaa9GG1111212E", this);} // tgen
aaa::GG1111212 ::GG1111212(){ note_ctor("_ZN3aaa9GG1111212E", this);} // tgen
}
static void Test__ZN3aaa9GG1111212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111212E, buf);
    ::aaa::GG1111212 *dp, &lv = *(dp=new (buf) ::aaa::GG1111212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111212E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1111212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1111212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1111212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111212E);
    dp->::aaa::GG1111212::~GG1111212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111212E(Test__ZN3aaa9GG1111212E, "_ZN3aaa9GG1111212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111212C1Ev();
extern void _ZN3aaa9GG1111212D1Ev();
Name_Map name_map__ZN3aaa9GG1111212E[] = {
  NSPAIR(_ZN3aaa9GG1111212C1Ev),
  NSPAIR(_ZN3aaa9GG1111212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1111212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111212E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11112123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11112123barEv,_ZThn28_N3aaa9GG11112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11112123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11112123barEv,_ZThn28_N3aaa9GG11112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111212E[];
Class_Descriptor cd__ZN3aaa9GG1111212E = {  "_ZN3aaa9GG1111212E", // class name
  bases__ZN3aaa9GG1111212E, 6,
  &(vtc__ZN3aaa9GG1111212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111213  : ::aaa::EE111 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11112133fooEv
  virtual void  bar(); // _ZN3aaa9GG11112133barEv
  ~GG1111213(); // tgen
  GG1111213(); // tgen
};
//SIG(1 _ZN3aaa9GG1111213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11112133fooEv");}
void  aaa::GG1111213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11112133barEv");}
aaa::GG1111213 ::~GG1111213(){ note_dtor("_ZN3aaa9GG1111213E", this);} // tgen
aaa::GG1111213 ::GG1111213(){ note_ctor("_ZN3aaa9GG1111213E", this);} // tgen
}
static void Test__ZN3aaa9GG1111213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111213E, buf);
    ::aaa::GG1111213 *dp, &lv = *(dp=new (buf) ::aaa::GG1111213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111213E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1111213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1111213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1111213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111213E);
    dp->::aaa::GG1111213::~GG1111213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111213E(Test__ZN3aaa9GG1111213E, "_ZN3aaa9GG1111213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111213C1Ev();
extern void _ZN3aaa9GG1111213D1Ev();
Name_Map name_map__ZN3aaa9GG1111213E[] = {
  NSPAIR(_ZN3aaa9GG1111213C1Ev),
  NSPAIR(_ZN3aaa9GG1111213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1111213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111213E[];
extern void _ZN3aaa9GG11112133fooEv();
extern void _ZN3aaa9GG11112133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11112133fooEv,_ZThn8_N3aaa9GG11112133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11112133fooEv,_ZThn20_N3aaa9GG11112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11112133barEv,_ZThn28_N3aaa9GG11112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11112133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11112133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11112133fooEv,_ZThn8_N3aaa9GG11112133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112133fooEv,_ZThn20_N3aaa9GG11112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11112133barEv,_ZThn28_N3aaa9GG11112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111213E[];
Class_Descriptor cd__ZN3aaa9GG1111213E = {  "_ZN3aaa9GG1111213E", // class name
  bases__ZN3aaa9GG1111213E, 6,
  &(vtc__ZN3aaa9GG1111213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111221  : ::aaa::EE111 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11112213fooEv
  ~GG1111221(); // tgen
  GG1111221(); // tgen
};
//SIG(1 _ZN3aaa9GG1111221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11112213fooEv");}
aaa::GG1111221 ::~GG1111221(){ note_dtor("_ZN3aaa9GG1111221E", this);} // tgen
aaa::GG1111221 ::GG1111221(){ note_ctor("_ZN3aaa9GG1111221E", this);} // tgen
}
static void Test__ZN3aaa9GG1111221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111221E, buf);
    ::aaa::GG1111221 *dp, &lv = *(dp=new (buf) ::aaa::GG1111221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111221E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1111221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1111221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1111221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111221E);
    dp->::aaa::GG1111221::~GG1111221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111221E(Test__ZN3aaa9GG1111221E, "_ZN3aaa9GG1111221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111221C1Ev();
extern void _ZN3aaa9GG1111221D1Ev();
Name_Map name_map__ZN3aaa9GG1111221E[] = {
  NSPAIR(_ZN3aaa9GG1111221C1Ev),
  NSPAIR(_ZN3aaa9GG1111221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1111221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111221E[];
extern void _ZN3aaa9GG11112213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11112213fooEv,_ZThn8_N3aaa9GG11112213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11112213fooEv,_ZThn20_N3aaa9GG11112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11112213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11112213fooEv,_ZThn8_N3aaa9GG11112213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112213fooEv,_ZThn20_N3aaa9GG11112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111221E[];
Class_Descriptor cd__ZN3aaa9GG1111221E = {  "_ZN3aaa9GG1111221E", // class name
  bases__ZN3aaa9GG1111221E, 6,
  &(vtc__ZN3aaa9GG1111221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111222  : ::aaa::EE111 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11112223barEv
  ~GG1111222(); // tgen
  GG1111222(); // tgen
};
//SIG(1 _ZN3aaa9GG1111222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11112223barEv");}
aaa::GG1111222 ::~GG1111222(){ note_dtor("_ZN3aaa9GG1111222E", this);} // tgen
aaa::GG1111222 ::GG1111222(){ note_ctor("_ZN3aaa9GG1111222E", this);} // tgen
}
static void Test__ZN3aaa9GG1111222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111222E, buf);
    ::aaa::GG1111222 *dp, &lv = *(dp=new (buf) ::aaa::GG1111222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111222E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1111222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1111222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1111222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111222E);
    dp->::aaa::GG1111222::~GG1111222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111222E(Test__ZN3aaa9GG1111222E, "_ZN3aaa9GG1111222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111222C1Ev();
extern void _ZN3aaa9GG1111222D1Ev();
Name_Map name_map__ZN3aaa9GG1111222E[] = {
  NSPAIR(_ZN3aaa9GG1111222C1Ev),
  NSPAIR(_ZN3aaa9GG1111222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1111222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111222E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11112223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11112223barEv,_ZThn20_N3aaa9GG11112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11112223barEv,_ZThn28_N3aaa9GG11112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11112223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112223barEv,_ZThn20_N3aaa9GG11112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11112223barEv,_ZThn28_N3aaa9GG11112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111222E[];
Class_Descriptor cd__ZN3aaa9GG1111222E = {  "_ZN3aaa9GG1111222E", // class name
  bases__ZN3aaa9GG1111222E, 6,
  &(vtc__ZN3aaa9GG1111222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111223  : ::aaa::EE111 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11112233fooEv
  virtual void  bar(); // _ZN3aaa9GG11112233barEv
  ~GG1111223(); // tgen
  GG1111223(); // tgen
};
//SIG(1 _ZN3aaa9GG1111223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11112233fooEv");}
void  aaa::GG1111223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11112233barEv");}
aaa::GG1111223 ::~GG1111223(){ note_dtor("_ZN3aaa9GG1111223E", this);} // tgen
aaa::GG1111223 ::GG1111223(){ note_ctor("_ZN3aaa9GG1111223E", this);} // tgen
}
static void Test__ZN3aaa9GG1111223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111223E, buf);
    ::aaa::GG1111223 *dp, &lv = *(dp=new (buf) ::aaa::GG1111223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111223E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1111223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1111223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1111223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111223E);
    dp->::aaa::GG1111223::~GG1111223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111223E(Test__ZN3aaa9GG1111223E, "_ZN3aaa9GG1111223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111223C1Ev();
extern void _ZN3aaa9GG1111223D1Ev();
Name_Map name_map__ZN3aaa9GG1111223E[] = {
  NSPAIR(_ZN3aaa9GG1111223C1Ev),
  NSPAIR(_ZN3aaa9GG1111223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1111223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111223E[];
extern void _ZN3aaa9GG11112233fooEv();
extern void _ZN3aaa9GG11112233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11112233fooEv,_ZThn8_N3aaa9GG11112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11112233fooEv,_ZThn20_N3aaa9GG11112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11112233barEv,_ZThn20_N3aaa9GG11112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11112233barEv,_ZThn28_N3aaa9GG11112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11112233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11112233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11112233fooEv,_ZThn8_N3aaa9GG11112233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112233fooEv,_ZThn20_N3aaa9GG11112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112233barEv,_ZThn20_N3aaa9GG11112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11112233barEv,_ZThn28_N3aaa9GG11112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111223E[];
Class_Descriptor cd__ZN3aaa9GG1111223E = {  "_ZN3aaa9GG1111223E", // class name
  bases__ZN3aaa9GG1111223E, 6,
  &(vtc__ZN3aaa9GG1111223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111231  : ::aaa::EE111 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11112313fooEv
  ~GG1111231(); // tgen
  GG1111231(); // tgen
};
//SIG(1 _ZN3aaa9GG1111231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11112313fooEv");}
aaa::GG1111231 ::~GG1111231(){ note_dtor("_ZN3aaa9GG1111231E", this);} // tgen
aaa::GG1111231 ::GG1111231(){ note_ctor("_ZN3aaa9GG1111231E", this);} // tgen
}
static void Test__ZN3aaa9GG1111231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111231E, buf);
    ::aaa::GG1111231 *dp, &lv = *(dp=new (buf) ::aaa::GG1111231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111231E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1111231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1111231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1111231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111231E);
    dp->::aaa::GG1111231::~GG1111231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111231E(Test__ZN3aaa9GG1111231E, "_ZN3aaa9GG1111231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111231C1Ev();
extern void _ZN3aaa9GG1111231D1Ev();
Name_Map name_map__ZN3aaa9GG1111231E[] = {
  NSPAIR(_ZN3aaa9GG1111231C1Ev),
  NSPAIR(_ZN3aaa9GG1111231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1111231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111231E[];
extern void _ZN3aaa9GG11112313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11112313fooEv,_ZThn8_N3aaa9GG11112313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11112313fooEv,_ZThn20_N3aaa9GG11112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11112313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11112313fooEv,_ZThn8_N3aaa9GG11112313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112313fooEv,_ZThn20_N3aaa9GG11112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111231E[];
Class_Descriptor cd__ZN3aaa9GG1111231E = {  "_ZN3aaa9GG1111231E", // class name
  bases__ZN3aaa9GG1111231E, 6,
  &(vtc__ZN3aaa9GG1111231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111231E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111232  : ::aaa::EE111 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11112323barEv
  ~GG1111232(); // tgen
  GG1111232(); // tgen
};
//SIG(1 _ZN3aaa9GG1111232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11112323barEv");}
aaa::GG1111232 ::~GG1111232(){ note_dtor("_ZN3aaa9GG1111232E", this);} // tgen
aaa::GG1111232 ::GG1111232(){ note_ctor("_ZN3aaa9GG1111232E", this);} // tgen
}
static void Test__ZN3aaa9GG1111232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111232E, buf);
    ::aaa::GG1111232 *dp, &lv = *(dp=new (buf) ::aaa::GG1111232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111232E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1111232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1111232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1111232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111232E);
    dp->::aaa::GG1111232::~GG1111232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111232E(Test__ZN3aaa9GG1111232E, "_ZN3aaa9GG1111232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111232C1Ev();
extern void _ZN3aaa9GG1111232D1Ev();
Name_Map name_map__ZN3aaa9GG1111232E[] = {
  NSPAIR(_ZN3aaa9GG1111232C1Ev),
  NSPAIR(_ZN3aaa9GG1111232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1111232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111232E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11112323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11112323barEv,_ZThn20_N3aaa9GG11112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11112323barEv,_ZThn28_N3aaa9GG11112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11112323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112323barEv,_ZThn20_N3aaa9GG11112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11112323barEv,_ZThn28_N3aaa9GG11112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111232E[];
Class_Descriptor cd__ZN3aaa9GG1111232E = {  "_ZN3aaa9GG1111232E", // class name
  bases__ZN3aaa9GG1111232E, 6,
  &(vtc__ZN3aaa9GG1111232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111233  : ::aaa::EE111 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11112333fooEv
  virtual void  bar(); // _ZN3aaa9GG11112333barEv
  ~GG1111233(); // tgen
  GG1111233(); // tgen
};
//SIG(1 _ZN3aaa9GG1111233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11112333fooEv");}
void  aaa::GG1111233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11112333barEv");}
aaa::GG1111233 ::~GG1111233(){ note_dtor("_ZN3aaa9GG1111233E", this);} // tgen
aaa::GG1111233 ::GG1111233(){ note_ctor("_ZN3aaa9GG1111233E", this);} // tgen
}
static void Test__ZN3aaa9GG1111233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111233E, buf);
    ::aaa::GG1111233 *dp, &lv = *(dp=new (buf) ::aaa::GG1111233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111233E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1111233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1111233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1111233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111233E);
    dp->::aaa::GG1111233::~GG1111233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111233E(Test__ZN3aaa9GG1111233E, "_ZN3aaa9GG1111233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111233C1Ev();
extern void _ZN3aaa9GG1111233D1Ev();
Name_Map name_map__ZN3aaa9GG1111233E[] = {
  NSPAIR(_ZN3aaa9GG1111233C1Ev),
  NSPAIR(_ZN3aaa9GG1111233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1111233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111233E[];
extern void _ZN3aaa9GG11112333fooEv();
extern void _ZN3aaa9GG11112333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11112333fooEv,_ZThn8_N3aaa9GG11112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11112333fooEv,_ZThn20_N3aaa9GG11112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11112333barEv,_ZThn20_N3aaa9GG11112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11112333barEv,_ZThn28_N3aaa9GG11112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11112333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11112333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11112333fooEv,_ZThn8_N3aaa9GG11112333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112333fooEv,_ZThn20_N3aaa9GG11112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11112333barEv,_ZThn20_N3aaa9GG11112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11112333barEv,_ZThn28_N3aaa9GG11112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111233E[];
Class_Descriptor cd__ZN3aaa9GG1111233E = {  "_ZN3aaa9GG1111233E", // class name
  bases__ZN3aaa9GG1111233E, 6,
  &(vtc__ZN3aaa9GG1111233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111311  : ::aaa::EE111 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11113113fooEv
  ~GG1111311(); // tgen
  GG1111311(); // tgen
};
//SIG(1 _ZN3aaa9GG1111311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11113113fooEv");}
aaa::GG1111311 ::~GG1111311(){ note_dtor("_ZN3aaa9GG1111311E", this);} // tgen
aaa::GG1111311 ::GG1111311(){ note_ctor("_ZN3aaa9GG1111311E", this);} // tgen
}
static void Test__ZN3aaa9GG1111311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111311E, buf);
    ::aaa::GG1111311 *dp, &lv = *(dp=new (buf) ::aaa::GG1111311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111311E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1111311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1111311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1111311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111311E);
    dp->::aaa::GG1111311::~GG1111311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111311E(Test__ZN3aaa9GG1111311E, "_ZN3aaa9GG1111311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111311C1Ev();
extern void _ZN3aaa9GG1111311D1Ev();
Name_Map name_map__ZN3aaa9GG1111311E[] = {
  NSPAIR(_ZN3aaa9GG1111311C1Ev),
  NSPAIR(_ZN3aaa9GG1111311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1111311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111311E[];
extern void _ZN3aaa9GG11113113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11113113fooEv,_ZThn8_N3aaa9GG11113113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11113113fooEv,_ZThn20_N3aaa9GG11113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113113fooEv,_ZThn28_N3aaa9GG11113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11113113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11113113fooEv,_ZThn8_N3aaa9GG11113113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113113fooEv,_ZThn20_N3aaa9GG11113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113113fooEv,_ZThn28_N3aaa9GG11113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111311E[];
Class_Descriptor cd__ZN3aaa9GG1111311E = {  "_ZN3aaa9GG1111311E", // class name
  bases__ZN3aaa9GG1111311E, 6,
  &(vtc__ZN3aaa9GG1111311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111311E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111312  : ::aaa::EE111 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11113123barEv
  ~GG1111312(); // tgen
  GG1111312(); // tgen
};
//SIG(1 _ZN3aaa9GG1111312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11113123barEv");}
aaa::GG1111312 ::~GG1111312(){ note_dtor("_ZN3aaa9GG1111312E", this);} // tgen
aaa::GG1111312 ::GG1111312(){ note_ctor("_ZN3aaa9GG1111312E", this);} // tgen
}
static void Test__ZN3aaa9GG1111312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111312E, buf);
    ::aaa::GG1111312 *dp, &lv = *(dp=new (buf) ::aaa::GG1111312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111312E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1111312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1111312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1111312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111312E);
    dp->::aaa::GG1111312::~GG1111312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111312E(Test__ZN3aaa9GG1111312E, "_ZN3aaa9GG1111312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111312C1Ev();
extern void _ZN3aaa9GG1111312D1Ev();
Name_Map name_map__ZN3aaa9GG1111312E[] = {
  NSPAIR(_ZN3aaa9GG1111312C1Ev),
  NSPAIR(_ZN3aaa9GG1111312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1111312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111312E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11113123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113123barEv,_ZThn28_N3aaa9GG11113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11113123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113123barEv,_ZThn28_N3aaa9GG11113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111312E[];
Class_Descriptor cd__ZN3aaa9GG1111312E = {  "_ZN3aaa9GG1111312E", // class name
  bases__ZN3aaa9GG1111312E, 6,
  &(vtc__ZN3aaa9GG1111312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111313  : ::aaa::EE111 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11113133fooEv
  virtual void  bar(); // _ZN3aaa9GG11113133barEv
  ~GG1111313(); // tgen
  GG1111313(); // tgen
};
//SIG(1 _ZN3aaa9GG1111313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11113133fooEv");}
void  aaa::GG1111313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11113133barEv");}
aaa::GG1111313 ::~GG1111313(){ note_dtor("_ZN3aaa9GG1111313E", this);} // tgen
aaa::GG1111313 ::GG1111313(){ note_ctor("_ZN3aaa9GG1111313E", this);} // tgen
}
static void Test__ZN3aaa9GG1111313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111313E, buf);
    ::aaa::GG1111313 *dp, &lv = *(dp=new (buf) ::aaa::GG1111313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111313E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1111313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1111313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1111313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111313E);
    dp->::aaa::GG1111313::~GG1111313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111313E(Test__ZN3aaa9GG1111313E, "_ZN3aaa9GG1111313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111313C1Ev();
extern void _ZN3aaa9GG1111313D1Ev();
Name_Map name_map__ZN3aaa9GG1111313E[] = {
  NSPAIR(_ZN3aaa9GG1111313C1Ev),
  NSPAIR(_ZN3aaa9GG1111313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1111313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111313E[];
extern void _ZN3aaa9GG11113133fooEv();
extern void _ZN3aaa9GG11113133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11113133fooEv,_ZThn8_N3aaa9GG11113133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11113133fooEv,_ZThn20_N3aaa9GG11113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113133fooEv,_ZThn28_N3aaa9GG11113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113133barEv,_ZThn28_N3aaa9GG11113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11113133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11113133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11113133fooEv,_ZThn8_N3aaa9GG11113133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113133fooEv,_ZThn20_N3aaa9GG11113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113133fooEv,_ZThn28_N3aaa9GG11113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113133barEv,_ZThn28_N3aaa9GG11113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111313E[];
Class_Descriptor cd__ZN3aaa9GG1111313E = {  "_ZN3aaa9GG1111313E", // class name
  bases__ZN3aaa9GG1111313E, 6,
  &(vtc__ZN3aaa9GG1111313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111321  : ::aaa::EE111 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11113213fooEv
  ~GG1111321(); // tgen
  GG1111321(); // tgen
};
//SIG(1 _ZN3aaa9GG1111321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11113213fooEv");}
aaa::GG1111321 ::~GG1111321(){ note_dtor("_ZN3aaa9GG1111321E", this);} // tgen
aaa::GG1111321 ::GG1111321(){ note_ctor("_ZN3aaa9GG1111321E", this);} // tgen
}
static void Test__ZN3aaa9GG1111321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111321E, buf);
    ::aaa::GG1111321 *dp, &lv = *(dp=new (buf) ::aaa::GG1111321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111321E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1111321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1111321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1111321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111321E);
    dp->::aaa::GG1111321::~GG1111321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111321E(Test__ZN3aaa9GG1111321E, "_ZN3aaa9GG1111321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111321C1Ev();
extern void _ZN3aaa9GG1111321D1Ev();
Name_Map name_map__ZN3aaa9GG1111321E[] = {
  NSPAIR(_ZN3aaa9GG1111321C1Ev),
  NSPAIR(_ZN3aaa9GG1111321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1111321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111321E[];
extern void _ZN3aaa9GG11113213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11113213fooEv,_ZThn8_N3aaa9GG11113213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11113213fooEv,_ZThn20_N3aaa9GG11113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11113213fooEv,_ZThn28_N3aaa9GG11113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11113213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11113213fooEv,_ZThn8_N3aaa9GG11113213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113213fooEv,_ZThn20_N3aaa9GG11113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113213fooEv,_ZThn28_N3aaa9GG11113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111321E[];
Class_Descriptor cd__ZN3aaa9GG1111321E = {  "_ZN3aaa9GG1111321E", // class name
  bases__ZN3aaa9GG1111321E, 6,
  &(vtc__ZN3aaa9GG1111321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111322  : ::aaa::EE111 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11113223barEv
  ~GG1111322(); // tgen
  GG1111322(); // tgen
};
//SIG(1 _ZN3aaa9GG1111322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11113223barEv");}
aaa::GG1111322 ::~GG1111322(){ note_dtor("_ZN3aaa9GG1111322E", this);} // tgen
aaa::GG1111322 ::GG1111322(){ note_ctor("_ZN3aaa9GG1111322E", this);} // tgen
}
static void Test__ZN3aaa9GG1111322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111322E, buf);
    ::aaa::GG1111322 *dp, &lv = *(dp=new (buf) ::aaa::GG1111322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111322E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1111322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1111322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1111322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111322E);
    dp->::aaa::GG1111322::~GG1111322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111322E(Test__ZN3aaa9GG1111322E, "_ZN3aaa9GG1111322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111322C1Ev();
extern void _ZN3aaa9GG1111322D1Ev();
Name_Map name_map__ZN3aaa9GG1111322E[] = {
  NSPAIR(_ZN3aaa9GG1111322C1Ev),
  NSPAIR(_ZN3aaa9GG1111322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1111322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111322E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11113223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11113223barEv,_ZThn20_N3aaa9GG11113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11113223barEv,_ZThn28_N3aaa9GG11113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11113223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113223barEv,_ZThn20_N3aaa9GG11113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113223barEv,_ZThn28_N3aaa9GG11113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111322E[];
Class_Descriptor cd__ZN3aaa9GG1111322E = {  "_ZN3aaa9GG1111322E", // class name
  bases__ZN3aaa9GG1111322E, 6,
  &(vtc__ZN3aaa9GG1111322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111323  : ::aaa::EE111 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11113233fooEv
  virtual void  bar(); // _ZN3aaa9GG11113233barEv
  ~GG1111323(); // tgen
  GG1111323(); // tgen
};
//SIG(1 _ZN3aaa9GG1111323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11113233fooEv");}
void  aaa::GG1111323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11113233barEv");}
aaa::GG1111323 ::~GG1111323(){ note_dtor("_ZN3aaa9GG1111323E", this);} // tgen
aaa::GG1111323 ::GG1111323(){ note_ctor("_ZN3aaa9GG1111323E", this);} // tgen
}
static void Test__ZN3aaa9GG1111323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111323E, buf);
    ::aaa::GG1111323 *dp, &lv = *(dp=new (buf) ::aaa::GG1111323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111323E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1111323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1111323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1111323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111323E);
    dp->::aaa::GG1111323::~GG1111323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111323E(Test__ZN3aaa9GG1111323E, "_ZN3aaa9GG1111323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111323C1Ev();
extern void _ZN3aaa9GG1111323D1Ev();
Name_Map name_map__ZN3aaa9GG1111323E[] = {
  NSPAIR(_ZN3aaa9GG1111323C1Ev),
  NSPAIR(_ZN3aaa9GG1111323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1111323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111323E[];
extern void _ZN3aaa9GG11113233fooEv();
extern void _ZN3aaa9GG11113233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11113233fooEv,_ZThn8_N3aaa9GG11113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11113233fooEv,_ZThn20_N3aaa9GG11113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11113233barEv,_ZThn20_N3aaa9GG11113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113233fooEv,_ZThn28_N3aaa9GG11113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113233barEv,_ZThn28_N3aaa9GG11113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11113233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11113233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11113233fooEv,_ZThn8_N3aaa9GG11113233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113233fooEv,_ZThn20_N3aaa9GG11113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113233barEv,_ZThn20_N3aaa9GG11113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113233fooEv,_ZThn28_N3aaa9GG11113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113233barEv,_ZThn28_N3aaa9GG11113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111323E[];
Class_Descriptor cd__ZN3aaa9GG1111323E = {  "_ZN3aaa9GG1111323E", // class name
  bases__ZN3aaa9GG1111323E, 6,
  &(vtc__ZN3aaa9GG1111323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111331  : ::aaa::EE111 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11113313fooEv
  ~GG1111331(); // tgen
  GG1111331(); // tgen
};
//SIG(1 _ZN3aaa9GG1111331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11113313fooEv");}
aaa::GG1111331 ::~GG1111331(){ note_dtor("_ZN3aaa9GG1111331E", this);} // tgen
aaa::GG1111331 ::GG1111331(){ note_ctor("_ZN3aaa9GG1111331E", this);} // tgen
}
static void Test__ZN3aaa9GG1111331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111331E, buf);
    ::aaa::GG1111331 *dp, &lv = *(dp=new (buf) ::aaa::GG1111331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111331E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1111331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1111331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1111331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111331E);
    dp->::aaa::GG1111331::~GG1111331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111331E(Test__ZN3aaa9GG1111331E, "_ZN3aaa9GG1111331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111331C1Ev();
extern void _ZN3aaa9GG1111331D1Ev();
Name_Map name_map__ZN3aaa9GG1111331E[] = {
  NSPAIR(_ZN3aaa9GG1111331C1Ev),
  NSPAIR(_ZN3aaa9GG1111331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1111331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111331E[];
extern void _ZN3aaa9GG11113313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11113313fooEv,_ZThn8_N3aaa9GG11113313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11113313fooEv,_ZThn20_N3aaa9GG11113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11113313fooEv,_ZThn28_N3aaa9GG11113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11113313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11113313fooEv,_ZThn8_N3aaa9GG11113313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113313fooEv,_ZThn20_N3aaa9GG11113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113313fooEv,_ZThn28_N3aaa9GG11113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111331E[];
Class_Descriptor cd__ZN3aaa9GG1111331E = {  "_ZN3aaa9GG1111331E", // class name
  bases__ZN3aaa9GG1111331E, 6,
  &(vtc__ZN3aaa9GG1111331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111331E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111332  : ::aaa::EE111 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11113323barEv
  ~GG1111332(); // tgen
  GG1111332(); // tgen
};
//SIG(1 _ZN3aaa9GG1111332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1111332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11113323barEv");}
aaa::GG1111332 ::~GG1111332(){ note_dtor("_ZN3aaa9GG1111332E", this);} // tgen
aaa::GG1111332 ::GG1111332(){ note_ctor("_ZN3aaa9GG1111332E", this);} // tgen
}
static void Test__ZN3aaa9GG1111332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111332E, buf);
    ::aaa::GG1111332 *dp, &lv = *(dp=new (buf) ::aaa::GG1111332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111332E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1111332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1111332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1111332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111332E);
    dp->::aaa::GG1111332::~GG1111332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111332E(Test__ZN3aaa9GG1111332E, "_ZN3aaa9GG1111332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111332C1Ev();
extern void _ZN3aaa9GG1111332D1Ev();
Name_Map name_map__ZN3aaa9GG1111332E[] = {
  NSPAIR(_ZN3aaa9GG1111332C1Ev),
  NSPAIR(_ZN3aaa9GG1111332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1111332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111332E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11113323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11113323barEv,_ZThn20_N3aaa9GG11113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113323barEv,_ZThn28_N3aaa9GG11113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11113323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113323barEv,_ZThn20_N3aaa9GG11113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113323barEv,_ZThn28_N3aaa9GG11113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111332E[];
Class_Descriptor cd__ZN3aaa9GG1111332E = {  "_ZN3aaa9GG1111332E", // class name
  bases__ZN3aaa9GG1111332E, 6,
  &(vtc__ZN3aaa9GG1111332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1111333  : ::aaa::EE111 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11113333fooEv
  virtual void  bar(); // _ZN3aaa9GG11113333barEv
  ~GG1111333(); // tgen
  GG1111333(); // tgen
};
//SIG(1 _ZN3aaa9GG1111333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1111333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11113333fooEv");}
void  aaa::GG1111333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11113333barEv");}
aaa::GG1111333 ::~GG1111333(){ note_dtor("_ZN3aaa9GG1111333E", this);} // tgen
aaa::GG1111333 ::GG1111333(){ note_ctor("_ZN3aaa9GG1111333E", this);} // tgen
}
static void Test__ZN3aaa9GG1111333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1111333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1111333E, buf);
    ::aaa::GG1111333 *dp, &lv = *(dp=new (buf) ::aaa::GG1111333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1111333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1111333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1111333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1111333E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1111333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1111333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1111333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1111333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1111333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1111333E);
    dp->::aaa::GG1111333::~GG1111333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1111333E(Test__ZN3aaa9GG1111333E, "_ZN3aaa9GG1111333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1111333C1Ev();
extern void _ZN3aaa9GG1111333D1Ev();
Name_Map name_map__ZN3aaa9GG1111333E[] = {
  NSPAIR(_ZN3aaa9GG1111333C1Ev),
  NSPAIR(_ZN3aaa9GG1111333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1111333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1111333E[];
extern void _ZN3aaa9GG11113333fooEv();
extern void _ZN3aaa9GG11113333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11113333fooEv,_ZThn8_N3aaa9GG11113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11113333fooEv,_ZThn20_N3aaa9GG11113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11113333barEv,_ZThn20_N3aaa9GG11113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113333fooEv,_ZThn28_N3aaa9GG11113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11113333barEv,_ZThn28_N3aaa9GG11113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1111333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11113333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11113333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11113333fooEv,_ZThn8_N3aaa9GG11113333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113333fooEv,_ZThn20_N3aaa9GG11113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11113333barEv,_ZThn20_N3aaa9GG11113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113333fooEv,_ZThn28_N3aaa9GG11113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11113333barEv,_ZThn28_N3aaa9GG11113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1111333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1111333E[];
Class_Descriptor cd__ZN3aaa9GG1111333E = {  "_ZN3aaa9GG1111333E", // class name
  bases__ZN3aaa9GG1111333E, 6,
  &(vtc__ZN3aaa9GG1111333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1111333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1111333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112111  : ::aaa::EE111 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11121113fooEv
  ~GG1112111(); // tgen
  GG1112111(); // tgen
};
//SIG(1 _ZN3aaa9GG1112111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11121113fooEv");}
aaa::GG1112111 ::~GG1112111(){ note_dtor("_ZN3aaa9GG1112111E", this);} // tgen
aaa::GG1112111 ::GG1112111(){ note_ctor("_ZN3aaa9GG1112111E", this);} // tgen
}
static void Test__ZN3aaa9GG1112111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112111E, buf);
    ::aaa::GG1112111 *dp, &lv = *(dp=new (buf) ::aaa::GG1112111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112111E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1112111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1112111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1112111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112111E);
    dp->::aaa::GG1112111::~GG1112111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112111E(Test__ZN3aaa9GG1112111E, "_ZN3aaa9GG1112111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112111C1Ev();
extern void _ZN3aaa9GG1112111D1Ev();
Name_Map name_map__ZN3aaa9GG1112111E[] = {
  NSPAIR(_ZN3aaa9GG1112111C1Ev),
  NSPAIR(_ZN3aaa9GG1112111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1112111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112111E[];
extern void _ZN3aaa9GG11121113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11121113fooEv,_ZThn8_N3aaa9GG11121113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11121113fooEv,_ZThn20_N3aaa9GG11121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11121113fooEv,_ZThn28_N3aaa9GG11121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11121113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11121113fooEv,_ZThn8_N3aaa9GG11121113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121113fooEv,_ZThn20_N3aaa9GG11121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11121113fooEv,_ZThn28_N3aaa9GG11121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112111E[];
Class_Descriptor cd__ZN3aaa9GG1112111E = {  "_ZN3aaa9GG1112111E", // class name
  bases__ZN3aaa9GG1112111E, 6,
  &(vtc__ZN3aaa9GG1112111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112112  : ::aaa::EE111 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11121123barEv
  ~GG1112112(); // tgen
  GG1112112(); // tgen
};
//SIG(1 _ZN3aaa9GG1112112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11121123barEv");}
aaa::GG1112112 ::~GG1112112(){ note_dtor("_ZN3aaa9GG1112112E", this);} // tgen
aaa::GG1112112 ::GG1112112(){ note_ctor("_ZN3aaa9GG1112112E", this);} // tgen
}
static void Test__ZN3aaa9GG1112112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112112E, buf);
    ::aaa::GG1112112 *dp, &lv = *(dp=new (buf) ::aaa::GG1112112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112112E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1112112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1112112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1112112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112112E);
    dp->::aaa::GG1112112::~GG1112112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112112E(Test__ZN3aaa9GG1112112E, "_ZN3aaa9GG1112112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112112C1Ev();
extern void _ZN3aaa9GG1112112D1Ev();
Name_Map name_map__ZN3aaa9GG1112112E[] = {
  NSPAIR(_ZN3aaa9GG1112112C1Ev),
  NSPAIR(_ZN3aaa9GG1112112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1112112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112112E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11121123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11121123barEv,_ZThn20_N3aaa9GG11121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11121123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121123barEv,_ZThn20_N3aaa9GG11121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112112E[];
Class_Descriptor cd__ZN3aaa9GG1112112E = {  "_ZN3aaa9GG1112112E", // class name
  bases__ZN3aaa9GG1112112E, 6,
  &(vtc__ZN3aaa9GG1112112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112113  : ::aaa::EE111 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11121133fooEv
  virtual void  bar(); // _ZN3aaa9GG11121133barEv
  ~GG1112113(); // tgen
  GG1112113(); // tgen
};
//SIG(1 _ZN3aaa9GG1112113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11121133fooEv");}
void  aaa::GG1112113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11121133barEv");}
aaa::GG1112113 ::~GG1112113(){ note_dtor("_ZN3aaa9GG1112113E", this);} // tgen
aaa::GG1112113 ::GG1112113(){ note_ctor("_ZN3aaa9GG1112113E", this);} // tgen
}
static void Test__ZN3aaa9GG1112113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112113E, buf);
    ::aaa::GG1112113 *dp, &lv = *(dp=new (buf) ::aaa::GG1112113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112113E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1112113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1112113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1112113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112113E);
    dp->::aaa::GG1112113::~GG1112113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112113E(Test__ZN3aaa9GG1112113E, "_ZN3aaa9GG1112113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112113C1Ev();
extern void _ZN3aaa9GG1112113D1Ev();
Name_Map name_map__ZN3aaa9GG1112113E[] = {
  NSPAIR(_ZN3aaa9GG1112113C1Ev),
  NSPAIR(_ZN3aaa9GG1112113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1112113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112113E[];
extern void _ZN3aaa9GG11121133fooEv();
extern void _ZN3aaa9GG11121133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11121133fooEv,_ZThn8_N3aaa9GG11121133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11121133barEv,_ZThn20_N3aaa9GG11121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11121133fooEv,_ZThn20_N3aaa9GG11121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11121133fooEv,_ZThn28_N3aaa9GG11121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11121133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11121133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11121133fooEv,_ZThn8_N3aaa9GG11121133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121133barEv,_ZThn20_N3aaa9GG11121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121133fooEv,_ZThn20_N3aaa9GG11121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11121133fooEv,_ZThn28_N3aaa9GG11121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112113E[];
Class_Descriptor cd__ZN3aaa9GG1112113E = {  "_ZN3aaa9GG1112113E", // class name
  bases__ZN3aaa9GG1112113E, 6,
  &(vtc__ZN3aaa9GG1112113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112121  : ::aaa::EE111 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11121213fooEv
  ~GG1112121(); // tgen
  GG1112121(); // tgen
};
//SIG(1 _ZN3aaa9GG1112121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11121213fooEv");}
aaa::GG1112121 ::~GG1112121(){ note_dtor("_ZN3aaa9GG1112121E", this);} // tgen
aaa::GG1112121 ::GG1112121(){ note_ctor("_ZN3aaa9GG1112121E", this);} // tgen
}
static void Test__ZN3aaa9GG1112121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112121E, buf);
    ::aaa::GG1112121 *dp, &lv = *(dp=new (buf) ::aaa::GG1112121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112121E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1112121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1112121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1112121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112121E);
    dp->::aaa::GG1112121::~GG1112121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112121E(Test__ZN3aaa9GG1112121E, "_ZN3aaa9GG1112121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112121C1Ev();
extern void _ZN3aaa9GG1112121D1Ev();
Name_Map name_map__ZN3aaa9GG1112121E[] = {
  NSPAIR(_ZN3aaa9GG1112121C1Ev),
  NSPAIR(_ZN3aaa9GG1112121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1112121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112121E[];
extern void _ZN3aaa9GG11121213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11121213fooEv,_ZThn8_N3aaa9GG11121213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11121213fooEv,_ZThn28_N3aaa9GG11121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11121213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11121213fooEv,_ZThn8_N3aaa9GG11121213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11121213fooEv,_ZThn28_N3aaa9GG11121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112121E[];
Class_Descriptor cd__ZN3aaa9GG1112121E = {  "_ZN3aaa9GG1112121E", // class name
  bases__ZN3aaa9GG1112121E, 6,
  &(vtc__ZN3aaa9GG1112121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112121E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112122  : ::aaa::EE111 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11121223barEv
  ~GG1112122(); // tgen
  GG1112122(); // tgen
};
//SIG(1 _ZN3aaa9GG1112122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11121223barEv");}
aaa::GG1112122 ::~GG1112122(){ note_dtor("_ZN3aaa9GG1112122E", this);} // tgen
aaa::GG1112122 ::GG1112122(){ note_ctor("_ZN3aaa9GG1112122E", this);} // tgen
}
static void Test__ZN3aaa9GG1112122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112122E, buf);
    ::aaa::GG1112122 *dp, &lv = *(dp=new (buf) ::aaa::GG1112122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112122E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1112122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1112122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1112122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112122E);
    dp->::aaa::GG1112122::~GG1112122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112122E(Test__ZN3aaa9GG1112122E, "_ZN3aaa9GG1112122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112122C1Ev();
extern void _ZN3aaa9GG1112122D1Ev();
Name_Map name_map__ZN3aaa9GG1112122E[] = {
  NSPAIR(_ZN3aaa9GG1112122C1Ev),
  NSPAIR(_ZN3aaa9GG1112122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1112122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112122E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11121223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11121223barEv,_ZThn20_N3aaa9GG11121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11121223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121223barEv,_ZThn20_N3aaa9GG11121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112122E[];
Class_Descriptor cd__ZN3aaa9GG1112122E = {  "_ZN3aaa9GG1112122E", // class name
  bases__ZN3aaa9GG1112122E, 6,
  &(vtc__ZN3aaa9GG1112122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112123  : ::aaa::EE111 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11121233fooEv
  virtual void  bar(); // _ZN3aaa9GG11121233barEv
  ~GG1112123(); // tgen
  GG1112123(); // tgen
};
//SIG(1 _ZN3aaa9GG1112123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11121233fooEv");}
void  aaa::GG1112123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11121233barEv");}
aaa::GG1112123 ::~GG1112123(){ note_dtor("_ZN3aaa9GG1112123E", this);} // tgen
aaa::GG1112123 ::GG1112123(){ note_ctor("_ZN3aaa9GG1112123E", this);} // tgen
}
static void Test__ZN3aaa9GG1112123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112123E, buf);
    ::aaa::GG1112123 *dp, &lv = *(dp=new (buf) ::aaa::GG1112123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112123E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1112123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1112123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1112123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112123E);
    dp->::aaa::GG1112123::~GG1112123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112123E(Test__ZN3aaa9GG1112123E, "_ZN3aaa9GG1112123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112123C1Ev();
extern void _ZN3aaa9GG1112123D1Ev();
Name_Map name_map__ZN3aaa9GG1112123E[] = {
  NSPAIR(_ZN3aaa9GG1112123C1Ev),
  NSPAIR(_ZN3aaa9GG1112123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1112123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112123E[];
extern void _ZN3aaa9GG11121233fooEv();
extern void _ZN3aaa9GG11121233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11121233fooEv,_ZThn8_N3aaa9GG11121233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11121233barEv,_ZThn20_N3aaa9GG11121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11121233fooEv,_ZThn28_N3aaa9GG11121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11121233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11121233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11121233fooEv,_ZThn8_N3aaa9GG11121233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121233barEv,_ZThn20_N3aaa9GG11121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11121233fooEv,_ZThn28_N3aaa9GG11121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112123E[];
Class_Descriptor cd__ZN3aaa9GG1112123E = {  "_ZN3aaa9GG1112123E", // class name
  bases__ZN3aaa9GG1112123E, 6,
  &(vtc__ZN3aaa9GG1112123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112131  : ::aaa::EE111 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11121313fooEv
  ~GG1112131(); // tgen
  GG1112131(); // tgen
};
//SIG(1 _ZN3aaa9GG1112131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11121313fooEv");}
aaa::GG1112131 ::~GG1112131(){ note_dtor("_ZN3aaa9GG1112131E", this);} // tgen
aaa::GG1112131 ::GG1112131(){ note_ctor("_ZN3aaa9GG1112131E", this);} // tgen
}
static void Test__ZN3aaa9GG1112131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112131E, buf);
    ::aaa::GG1112131 *dp, &lv = *(dp=new (buf) ::aaa::GG1112131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112131E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1112131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1112131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1112131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112131E);
    dp->::aaa::GG1112131::~GG1112131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112131E(Test__ZN3aaa9GG1112131E, "_ZN3aaa9GG1112131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112131C1Ev();
extern void _ZN3aaa9GG1112131D1Ev();
Name_Map name_map__ZN3aaa9GG1112131E[] = {
  NSPAIR(_ZN3aaa9GG1112131C1Ev),
  NSPAIR(_ZN3aaa9GG1112131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1112131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112131E[];
extern void _ZN3aaa9GG11121313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11121313fooEv,_ZThn8_N3aaa9GG11121313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11121313fooEv,_ZThn20_N3aaa9GG11121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11121313fooEv,_ZThn28_N3aaa9GG11121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11121313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11121313fooEv,_ZThn8_N3aaa9GG11121313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121313fooEv,_ZThn20_N3aaa9GG11121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11121313fooEv,_ZThn28_N3aaa9GG11121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112131E[];
Class_Descriptor cd__ZN3aaa9GG1112131E = {  "_ZN3aaa9GG1112131E", // class name
  bases__ZN3aaa9GG1112131E, 6,
  &(vtc__ZN3aaa9GG1112131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112131E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112132  : ::aaa::EE111 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11121323barEv
  ~GG1112132(); // tgen
  GG1112132(); // tgen
};
//SIG(1 _ZN3aaa9GG1112132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11121323barEv");}
aaa::GG1112132 ::~GG1112132(){ note_dtor("_ZN3aaa9GG1112132E", this);} // tgen
aaa::GG1112132 ::GG1112132(){ note_ctor("_ZN3aaa9GG1112132E", this);} // tgen
}
static void Test__ZN3aaa9GG1112132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112132E, buf);
    ::aaa::GG1112132 *dp, &lv = *(dp=new (buf) ::aaa::GG1112132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112132E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1112132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1112132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1112132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112132E);
    dp->::aaa::GG1112132::~GG1112132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112132E(Test__ZN3aaa9GG1112132E, "_ZN3aaa9GG1112132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112132C1Ev();
extern void _ZN3aaa9GG1112132D1Ev();
Name_Map name_map__ZN3aaa9GG1112132E[] = {
  NSPAIR(_ZN3aaa9GG1112132C1Ev),
  NSPAIR(_ZN3aaa9GG1112132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1112132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112132E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11121323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11121323barEv,_ZThn20_N3aaa9GG11121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11121323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121323barEv,_ZThn20_N3aaa9GG11121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112132E[];
Class_Descriptor cd__ZN3aaa9GG1112132E = {  "_ZN3aaa9GG1112132E", // class name
  bases__ZN3aaa9GG1112132E, 6,
  &(vtc__ZN3aaa9GG1112132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112133  : ::aaa::EE111 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11121333fooEv
  virtual void  bar(); // _ZN3aaa9GG11121333barEv
  ~GG1112133(); // tgen
  GG1112133(); // tgen
};
//SIG(1 _ZN3aaa9GG1112133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11121333fooEv");}
void  aaa::GG1112133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11121333barEv");}
aaa::GG1112133 ::~GG1112133(){ note_dtor("_ZN3aaa9GG1112133E", this);} // tgen
aaa::GG1112133 ::GG1112133(){ note_ctor("_ZN3aaa9GG1112133E", this);} // tgen
}
static void Test__ZN3aaa9GG1112133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112133E, buf);
    ::aaa::GG1112133 *dp, &lv = *(dp=new (buf) ::aaa::GG1112133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112133E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1112133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1112133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1112133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112133E);
    dp->::aaa::GG1112133::~GG1112133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112133E(Test__ZN3aaa9GG1112133E, "_ZN3aaa9GG1112133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112133C1Ev();
extern void _ZN3aaa9GG1112133D1Ev();
Name_Map name_map__ZN3aaa9GG1112133E[] = {
  NSPAIR(_ZN3aaa9GG1112133C1Ev),
  NSPAIR(_ZN3aaa9GG1112133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1112133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112133E[];
extern void _ZN3aaa9GG11121333fooEv();
extern void _ZN3aaa9GG11121333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11121333fooEv,_ZThn8_N3aaa9GG11121333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11121333barEv,_ZThn20_N3aaa9GG11121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11121333fooEv,_ZThn20_N3aaa9GG11121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11121333fooEv,_ZThn28_N3aaa9GG11121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11121333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11121333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11121333fooEv,_ZThn8_N3aaa9GG11121333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121333barEv,_ZThn20_N3aaa9GG11121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11121333fooEv,_ZThn20_N3aaa9GG11121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11121333fooEv,_ZThn28_N3aaa9GG11121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112133E[];
Class_Descriptor cd__ZN3aaa9GG1112133E = {  "_ZN3aaa9GG1112133E", // class name
  bases__ZN3aaa9GG1112133E, 6,
  &(vtc__ZN3aaa9GG1112133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112211  : ::aaa::EE111 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11122113fooEv
  ~GG1112211(); // tgen
  GG1112211(); // tgen
};
//SIG(1 _ZN3aaa9GG1112211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11122113fooEv");}
aaa::GG1112211 ::~GG1112211(){ note_dtor("_ZN3aaa9GG1112211E", this);} // tgen
aaa::GG1112211 ::GG1112211(){ note_ctor("_ZN3aaa9GG1112211E", this);} // tgen
}
static void Test__ZN3aaa9GG1112211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112211E, buf);
    ::aaa::GG1112211 *dp, &lv = *(dp=new (buf) ::aaa::GG1112211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112211E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1112211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1112211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1112211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112211E);
    dp->::aaa::GG1112211::~GG1112211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112211E(Test__ZN3aaa9GG1112211E, "_ZN3aaa9GG1112211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112211C1Ev();
extern void _ZN3aaa9GG1112211D1Ev();
Name_Map name_map__ZN3aaa9GG1112211E[] = {
  NSPAIR(_ZN3aaa9GG1112211C1Ev),
  NSPAIR(_ZN3aaa9GG1112211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1112211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112211E[];
extern void _ZN3aaa9GG11122113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11122113fooEv,_ZThn8_N3aaa9GG11122113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11122113fooEv,_ZThn20_N3aaa9GG11122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11122113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11122113fooEv,_ZThn8_N3aaa9GG11122113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122113fooEv,_ZThn20_N3aaa9GG11122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112211E[];
Class_Descriptor cd__ZN3aaa9GG1112211E = {  "_ZN3aaa9GG1112211E", // class name
  bases__ZN3aaa9GG1112211E, 6,
  &(vtc__ZN3aaa9GG1112211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112212  : ::aaa::EE111 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11122123barEv
  ~GG1112212(); // tgen
  GG1112212(); // tgen
};
//SIG(1 _ZN3aaa9GG1112212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11122123barEv");}
aaa::GG1112212 ::~GG1112212(){ note_dtor("_ZN3aaa9GG1112212E", this);} // tgen
aaa::GG1112212 ::GG1112212(){ note_ctor("_ZN3aaa9GG1112212E", this);} // tgen
}
static void Test__ZN3aaa9GG1112212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112212E, buf);
    ::aaa::GG1112212 *dp, &lv = *(dp=new (buf) ::aaa::GG1112212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112212E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1112212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1112212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1112212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112212E);
    dp->::aaa::GG1112212::~GG1112212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112212E(Test__ZN3aaa9GG1112212E, "_ZN3aaa9GG1112212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112212C1Ev();
extern void _ZN3aaa9GG1112212D1Ev();
Name_Map name_map__ZN3aaa9GG1112212E[] = {
  NSPAIR(_ZN3aaa9GG1112212C1Ev),
  NSPAIR(_ZN3aaa9GG1112212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1112212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112212E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11122123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11122123barEv,_ZThn20_N3aaa9GG11122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11122123barEv,_ZThn28_N3aaa9GG11122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11122123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122123barEv,_ZThn20_N3aaa9GG11122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11122123barEv,_ZThn28_N3aaa9GG11122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112212E[];
Class_Descriptor cd__ZN3aaa9GG1112212E = {  "_ZN3aaa9GG1112212E", // class name
  bases__ZN3aaa9GG1112212E, 6,
  &(vtc__ZN3aaa9GG1112212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112213  : ::aaa::EE111 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11122133fooEv
  virtual void  bar(); // _ZN3aaa9GG11122133barEv
  ~GG1112213(); // tgen
  GG1112213(); // tgen
};
//SIG(1 _ZN3aaa9GG1112213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11122133fooEv");}
void  aaa::GG1112213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11122133barEv");}
aaa::GG1112213 ::~GG1112213(){ note_dtor("_ZN3aaa9GG1112213E", this);} // tgen
aaa::GG1112213 ::GG1112213(){ note_ctor("_ZN3aaa9GG1112213E", this);} // tgen
}
static void Test__ZN3aaa9GG1112213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112213E, buf);
    ::aaa::GG1112213 *dp, &lv = *(dp=new (buf) ::aaa::GG1112213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112213E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1112213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1112213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1112213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112213E);
    dp->::aaa::GG1112213::~GG1112213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112213E(Test__ZN3aaa9GG1112213E, "_ZN3aaa9GG1112213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112213C1Ev();
extern void _ZN3aaa9GG1112213D1Ev();
Name_Map name_map__ZN3aaa9GG1112213E[] = {
  NSPAIR(_ZN3aaa9GG1112213C1Ev),
  NSPAIR(_ZN3aaa9GG1112213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1112213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112213E[];
extern void _ZN3aaa9GG11122133fooEv();
extern void _ZN3aaa9GG11122133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11122133fooEv,_ZThn8_N3aaa9GG11122133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11122133barEv,_ZThn20_N3aaa9GG11122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11122133fooEv,_ZThn20_N3aaa9GG11122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11122133barEv,_ZThn28_N3aaa9GG11122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11122133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11122133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11122133fooEv,_ZThn8_N3aaa9GG11122133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122133barEv,_ZThn20_N3aaa9GG11122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122133fooEv,_ZThn20_N3aaa9GG11122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11122133barEv,_ZThn28_N3aaa9GG11122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112213E[];
Class_Descriptor cd__ZN3aaa9GG1112213E = {  "_ZN3aaa9GG1112213E", // class name
  bases__ZN3aaa9GG1112213E, 6,
  &(vtc__ZN3aaa9GG1112213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112221  : ::aaa::EE111 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11122213fooEv
  ~GG1112221(); // tgen
  GG1112221(); // tgen
};
//SIG(1 _ZN3aaa9GG1112221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11122213fooEv");}
aaa::GG1112221 ::~GG1112221(){ note_dtor("_ZN3aaa9GG1112221E", this);} // tgen
aaa::GG1112221 ::GG1112221(){ note_ctor("_ZN3aaa9GG1112221E", this);} // tgen
}
static void Test__ZN3aaa9GG1112221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112221E, buf);
    ::aaa::GG1112221 *dp, &lv = *(dp=new (buf) ::aaa::GG1112221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112221E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1112221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1112221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1112221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112221E);
    dp->::aaa::GG1112221::~GG1112221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112221E(Test__ZN3aaa9GG1112221E, "_ZN3aaa9GG1112221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112221C1Ev();
extern void _ZN3aaa9GG1112221D1Ev();
Name_Map name_map__ZN3aaa9GG1112221E[] = {
  NSPAIR(_ZN3aaa9GG1112221C1Ev),
  NSPAIR(_ZN3aaa9GG1112221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1112221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112221E[];
extern void _ZN3aaa9GG11122213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11122213fooEv,_ZThn8_N3aaa9GG11122213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11122213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11122213fooEv,_ZThn8_N3aaa9GG11122213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112221E[];
Class_Descriptor cd__ZN3aaa9GG1112221E = {  "_ZN3aaa9GG1112221E", // class name
  bases__ZN3aaa9GG1112221E, 6,
  &(vtc__ZN3aaa9GG1112221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112221E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112222  : ::aaa::EE111 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11122223barEv
  ~GG1112222(); // tgen
  GG1112222(); // tgen
};
//SIG(1 _ZN3aaa9GG1112222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11122223barEv");}
aaa::GG1112222 ::~GG1112222(){ note_dtor("_ZN3aaa9GG1112222E", this);} // tgen
aaa::GG1112222 ::GG1112222(){ note_ctor("_ZN3aaa9GG1112222E", this);} // tgen
}
static void Test__ZN3aaa9GG1112222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112222E, buf);
    ::aaa::GG1112222 *dp, &lv = *(dp=new (buf) ::aaa::GG1112222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112222E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1112222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1112222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1112222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112222E);
    dp->::aaa::GG1112222::~GG1112222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112222E(Test__ZN3aaa9GG1112222E, "_ZN3aaa9GG1112222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112222C1Ev();
extern void _ZN3aaa9GG1112222D1Ev();
Name_Map name_map__ZN3aaa9GG1112222E[] = {
  NSPAIR(_ZN3aaa9GG1112222C1Ev),
  NSPAIR(_ZN3aaa9GG1112222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1112222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112222E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11122223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11122223barEv,_ZThn20_N3aaa9GG11122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11122223barEv,_ZThn28_N3aaa9GG11122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11122223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122223barEv,_ZThn20_N3aaa9GG11122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11122223barEv,_ZThn28_N3aaa9GG11122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112222E[];
Class_Descriptor cd__ZN3aaa9GG1112222E = {  "_ZN3aaa9GG1112222E", // class name
  bases__ZN3aaa9GG1112222E, 6,
  &(vtc__ZN3aaa9GG1112222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112223  : ::aaa::EE111 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11122233fooEv
  virtual void  bar(); // _ZN3aaa9GG11122233barEv
  ~GG1112223(); // tgen
  GG1112223(); // tgen
};
//SIG(1 _ZN3aaa9GG1112223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11122233fooEv");}
void  aaa::GG1112223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11122233barEv");}
aaa::GG1112223 ::~GG1112223(){ note_dtor("_ZN3aaa9GG1112223E", this);} // tgen
aaa::GG1112223 ::GG1112223(){ note_ctor("_ZN3aaa9GG1112223E", this);} // tgen
}
static void Test__ZN3aaa9GG1112223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112223E, buf);
    ::aaa::GG1112223 *dp, &lv = *(dp=new (buf) ::aaa::GG1112223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112223E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1112223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1112223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1112223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112223E);
    dp->::aaa::GG1112223::~GG1112223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112223E(Test__ZN3aaa9GG1112223E, "_ZN3aaa9GG1112223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112223C1Ev();
extern void _ZN3aaa9GG1112223D1Ev();
Name_Map name_map__ZN3aaa9GG1112223E[] = {
  NSPAIR(_ZN3aaa9GG1112223C1Ev),
  NSPAIR(_ZN3aaa9GG1112223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1112223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112223E[];
extern void _ZN3aaa9GG11122233fooEv();
extern void _ZN3aaa9GG11122233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11122233fooEv,_ZThn8_N3aaa9GG11122233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11122233barEv,_ZThn20_N3aaa9GG11122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11122233barEv,_ZThn28_N3aaa9GG11122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11122233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11122233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11122233fooEv,_ZThn8_N3aaa9GG11122233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122233barEv,_ZThn20_N3aaa9GG11122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11122233barEv,_ZThn28_N3aaa9GG11122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112223E[];
Class_Descriptor cd__ZN3aaa9GG1112223E = {  "_ZN3aaa9GG1112223E", // class name
  bases__ZN3aaa9GG1112223E, 6,
  &(vtc__ZN3aaa9GG1112223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112231  : ::aaa::EE111 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11122313fooEv
  ~GG1112231(); // tgen
  GG1112231(); // tgen
};
//SIG(1 _ZN3aaa9GG1112231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11122313fooEv");}
aaa::GG1112231 ::~GG1112231(){ note_dtor("_ZN3aaa9GG1112231E", this);} // tgen
aaa::GG1112231 ::GG1112231(){ note_ctor("_ZN3aaa9GG1112231E", this);} // tgen
}
static void Test__ZN3aaa9GG1112231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112231E, buf);
    ::aaa::GG1112231 *dp, &lv = *(dp=new (buf) ::aaa::GG1112231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112231E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1112231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1112231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1112231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112231E);
    dp->::aaa::GG1112231::~GG1112231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112231E(Test__ZN3aaa9GG1112231E, "_ZN3aaa9GG1112231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112231C1Ev();
extern void _ZN3aaa9GG1112231D1Ev();
Name_Map name_map__ZN3aaa9GG1112231E[] = {
  NSPAIR(_ZN3aaa9GG1112231C1Ev),
  NSPAIR(_ZN3aaa9GG1112231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1112231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112231E[];
extern void _ZN3aaa9GG11122313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11122313fooEv,_ZThn8_N3aaa9GG11122313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11122313fooEv,_ZThn20_N3aaa9GG11122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11122313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11122313fooEv,_ZThn8_N3aaa9GG11122313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122313fooEv,_ZThn20_N3aaa9GG11122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112231E[];
Class_Descriptor cd__ZN3aaa9GG1112231E = {  "_ZN3aaa9GG1112231E", // class name
  bases__ZN3aaa9GG1112231E, 6,
  &(vtc__ZN3aaa9GG1112231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112231E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112232  : ::aaa::EE111 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11122323barEv
  ~GG1112232(); // tgen
  GG1112232(); // tgen
};
//SIG(1 _ZN3aaa9GG1112232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11122323barEv");}
aaa::GG1112232 ::~GG1112232(){ note_dtor("_ZN3aaa9GG1112232E", this);} // tgen
aaa::GG1112232 ::GG1112232(){ note_ctor("_ZN3aaa9GG1112232E", this);} // tgen
}
static void Test__ZN3aaa9GG1112232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112232E, buf);
    ::aaa::GG1112232 *dp, &lv = *(dp=new (buf) ::aaa::GG1112232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112232E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1112232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1112232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1112232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112232E);
    dp->::aaa::GG1112232::~GG1112232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112232E(Test__ZN3aaa9GG1112232E, "_ZN3aaa9GG1112232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112232C1Ev();
extern void _ZN3aaa9GG1112232D1Ev();
Name_Map name_map__ZN3aaa9GG1112232E[] = {
  NSPAIR(_ZN3aaa9GG1112232C1Ev),
  NSPAIR(_ZN3aaa9GG1112232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1112232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112232E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11122323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11122323barEv,_ZThn20_N3aaa9GG11122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11122323barEv,_ZThn28_N3aaa9GG11122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11122323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122323barEv,_ZThn20_N3aaa9GG11122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11122323barEv,_ZThn28_N3aaa9GG11122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112232E[];
Class_Descriptor cd__ZN3aaa9GG1112232E = {  "_ZN3aaa9GG1112232E", // class name
  bases__ZN3aaa9GG1112232E, 6,
  &(vtc__ZN3aaa9GG1112232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112233  : ::aaa::EE111 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11122333fooEv
  virtual void  bar(); // _ZN3aaa9GG11122333barEv
  ~GG1112233(); // tgen
  GG1112233(); // tgen
};
//SIG(1 _ZN3aaa9GG1112233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11122333fooEv");}
void  aaa::GG1112233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11122333barEv");}
aaa::GG1112233 ::~GG1112233(){ note_dtor("_ZN3aaa9GG1112233E", this);} // tgen
aaa::GG1112233 ::GG1112233(){ note_ctor("_ZN3aaa9GG1112233E", this);} // tgen
}
static void Test__ZN3aaa9GG1112233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112233E, buf);
    ::aaa::GG1112233 *dp, &lv = *(dp=new (buf) ::aaa::GG1112233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112233E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1112233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1112233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1112233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112233E);
    dp->::aaa::GG1112233::~GG1112233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112233E(Test__ZN3aaa9GG1112233E, "_ZN3aaa9GG1112233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112233C1Ev();
extern void _ZN3aaa9GG1112233D1Ev();
Name_Map name_map__ZN3aaa9GG1112233E[] = {
  NSPAIR(_ZN3aaa9GG1112233C1Ev),
  NSPAIR(_ZN3aaa9GG1112233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1112233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112233E[];
extern void _ZN3aaa9GG11122333fooEv();
extern void _ZN3aaa9GG11122333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11122333fooEv,_ZThn8_N3aaa9GG11122333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11122333barEv,_ZThn20_N3aaa9GG11122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11122333fooEv,_ZThn20_N3aaa9GG11122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11122333barEv,_ZThn28_N3aaa9GG11122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11122333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11122333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11122333fooEv,_ZThn8_N3aaa9GG11122333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122333barEv,_ZThn20_N3aaa9GG11122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11122333fooEv,_ZThn20_N3aaa9GG11122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11122333barEv,_ZThn28_N3aaa9GG11122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112233E[];
Class_Descriptor cd__ZN3aaa9GG1112233E = {  "_ZN3aaa9GG1112233E", // class name
  bases__ZN3aaa9GG1112233E, 6,
  &(vtc__ZN3aaa9GG1112233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112311  : ::aaa::EE111 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11123113fooEv
  ~GG1112311(); // tgen
  GG1112311(); // tgen
};
//SIG(1 _ZN3aaa9GG1112311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11123113fooEv");}
aaa::GG1112311 ::~GG1112311(){ note_dtor("_ZN3aaa9GG1112311E", this);} // tgen
aaa::GG1112311 ::GG1112311(){ note_ctor("_ZN3aaa9GG1112311E", this);} // tgen
}
static void Test__ZN3aaa9GG1112311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112311E, buf);
    ::aaa::GG1112311 *dp, &lv = *(dp=new (buf) ::aaa::GG1112311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112311E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1112311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1112311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1112311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112311E);
    dp->::aaa::GG1112311::~GG1112311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112311E(Test__ZN3aaa9GG1112311E, "_ZN3aaa9GG1112311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112311C1Ev();
extern void _ZN3aaa9GG1112311D1Ev();
Name_Map name_map__ZN3aaa9GG1112311E[] = {
  NSPAIR(_ZN3aaa9GG1112311C1Ev),
  NSPAIR(_ZN3aaa9GG1112311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1112311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112311E[];
extern void _ZN3aaa9GG11123113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11123113fooEv,_ZThn8_N3aaa9GG11123113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11123113fooEv,_ZThn20_N3aaa9GG11123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123113fooEv,_ZThn28_N3aaa9GG11123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11123113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11123113fooEv,_ZThn8_N3aaa9GG11123113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123113fooEv,_ZThn20_N3aaa9GG11123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123113fooEv,_ZThn28_N3aaa9GG11123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112311E[];
Class_Descriptor cd__ZN3aaa9GG1112311E = {  "_ZN3aaa9GG1112311E", // class name
  bases__ZN3aaa9GG1112311E, 6,
  &(vtc__ZN3aaa9GG1112311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112312  : ::aaa::EE111 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11123123barEv
  ~GG1112312(); // tgen
  GG1112312(); // tgen
};
//SIG(1 _ZN3aaa9GG1112312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11123123barEv");}
aaa::GG1112312 ::~GG1112312(){ note_dtor("_ZN3aaa9GG1112312E", this);} // tgen
aaa::GG1112312 ::GG1112312(){ note_ctor("_ZN3aaa9GG1112312E", this);} // tgen
}
static void Test__ZN3aaa9GG1112312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112312E, buf);
    ::aaa::GG1112312 *dp, &lv = *(dp=new (buf) ::aaa::GG1112312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112312E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1112312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1112312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1112312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112312E);
    dp->::aaa::GG1112312::~GG1112312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112312E(Test__ZN3aaa9GG1112312E, "_ZN3aaa9GG1112312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112312C1Ev();
extern void _ZN3aaa9GG1112312D1Ev();
Name_Map name_map__ZN3aaa9GG1112312E[] = {
  NSPAIR(_ZN3aaa9GG1112312C1Ev),
  NSPAIR(_ZN3aaa9GG1112312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1112312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112312E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11123123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11123123barEv,_ZThn20_N3aaa9GG11123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123123barEv,_ZThn28_N3aaa9GG11123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11123123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123123barEv,_ZThn20_N3aaa9GG11123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123123barEv,_ZThn28_N3aaa9GG11123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112312E[];
Class_Descriptor cd__ZN3aaa9GG1112312E = {  "_ZN3aaa9GG1112312E", // class name
  bases__ZN3aaa9GG1112312E, 6,
  &(vtc__ZN3aaa9GG1112312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112313  : ::aaa::EE111 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11123133fooEv
  virtual void  bar(); // _ZN3aaa9GG11123133barEv
  ~GG1112313(); // tgen
  GG1112313(); // tgen
};
//SIG(1 _ZN3aaa9GG1112313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11123133fooEv");}
void  aaa::GG1112313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11123133barEv");}
aaa::GG1112313 ::~GG1112313(){ note_dtor("_ZN3aaa9GG1112313E", this);} // tgen
aaa::GG1112313 ::GG1112313(){ note_ctor("_ZN3aaa9GG1112313E", this);} // tgen
}
static void Test__ZN3aaa9GG1112313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112313E, buf);
    ::aaa::GG1112313 *dp, &lv = *(dp=new (buf) ::aaa::GG1112313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112313E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1112313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1112313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1112313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112313E);
    dp->::aaa::GG1112313::~GG1112313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112313E(Test__ZN3aaa9GG1112313E, "_ZN3aaa9GG1112313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112313C1Ev();
extern void _ZN3aaa9GG1112313D1Ev();
Name_Map name_map__ZN3aaa9GG1112313E[] = {
  NSPAIR(_ZN3aaa9GG1112313C1Ev),
  NSPAIR(_ZN3aaa9GG1112313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1112313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112313E[];
extern void _ZN3aaa9GG11123133fooEv();
extern void _ZN3aaa9GG11123133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11123133fooEv,_ZThn8_N3aaa9GG11123133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11123133barEv,_ZThn20_N3aaa9GG11123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11123133fooEv,_ZThn20_N3aaa9GG11123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123133fooEv,_ZThn28_N3aaa9GG11123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123133barEv,_ZThn28_N3aaa9GG11123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11123133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11123133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11123133fooEv,_ZThn8_N3aaa9GG11123133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123133barEv,_ZThn20_N3aaa9GG11123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123133fooEv,_ZThn20_N3aaa9GG11123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123133fooEv,_ZThn28_N3aaa9GG11123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123133barEv,_ZThn28_N3aaa9GG11123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112313E[];
Class_Descriptor cd__ZN3aaa9GG1112313E = {  "_ZN3aaa9GG1112313E", // class name
  bases__ZN3aaa9GG1112313E, 6,
  &(vtc__ZN3aaa9GG1112313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112321  : ::aaa::EE111 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11123213fooEv
  ~GG1112321(); // tgen
  GG1112321(); // tgen
};
//SIG(1 _ZN3aaa9GG1112321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11123213fooEv");}
aaa::GG1112321 ::~GG1112321(){ note_dtor("_ZN3aaa9GG1112321E", this);} // tgen
aaa::GG1112321 ::GG1112321(){ note_ctor("_ZN3aaa9GG1112321E", this);} // tgen
}
static void Test__ZN3aaa9GG1112321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112321E, buf);
    ::aaa::GG1112321 *dp, &lv = *(dp=new (buf) ::aaa::GG1112321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112321E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1112321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1112321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1112321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112321E);
    dp->::aaa::GG1112321::~GG1112321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112321E(Test__ZN3aaa9GG1112321E, "_ZN3aaa9GG1112321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112321C1Ev();
extern void _ZN3aaa9GG1112321D1Ev();
Name_Map name_map__ZN3aaa9GG1112321E[] = {
  NSPAIR(_ZN3aaa9GG1112321C1Ev),
  NSPAIR(_ZN3aaa9GG1112321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1112321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112321E[];
extern void _ZN3aaa9GG11123213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11123213fooEv,_ZThn8_N3aaa9GG11123213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11123213fooEv,_ZThn28_N3aaa9GG11123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11123213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11123213fooEv,_ZThn8_N3aaa9GG11123213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123213fooEv,_ZThn28_N3aaa9GG11123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112321E[];
Class_Descriptor cd__ZN3aaa9GG1112321E = {  "_ZN3aaa9GG1112321E", // class name
  bases__ZN3aaa9GG1112321E, 6,
  &(vtc__ZN3aaa9GG1112321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112321E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112322  : ::aaa::EE111 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11123223barEv
  ~GG1112322(); // tgen
  GG1112322(); // tgen
};
//SIG(1 _ZN3aaa9GG1112322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11123223barEv");}
aaa::GG1112322 ::~GG1112322(){ note_dtor("_ZN3aaa9GG1112322E", this);} // tgen
aaa::GG1112322 ::GG1112322(){ note_ctor("_ZN3aaa9GG1112322E", this);} // tgen
}
static void Test__ZN3aaa9GG1112322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112322E, buf);
    ::aaa::GG1112322 *dp, &lv = *(dp=new (buf) ::aaa::GG1112322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112322E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1112322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1112322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1112322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112322E);
    dp->::aaa::GG1112322::~GG1112322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112322E(Test__ZN3aaa9GG1112322E, "_ZN3aaa9GG1112322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112322C1Ev();
extern void _ZN3aaa9GG1112322D1Ev();
Name_Map name_map__ZN3aaa9GG1112322E[] = {
  NSPAIR(_ZN3aaa9GG1112322C1Ev),
  NSPAIR(_ZN3aaa9GG1112322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1112322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112322E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11123223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11123223barEv,_ZThn20_N3aaa9GG11123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11123223barEv,_ZThn28_N3aaa9GG11123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11123223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123223barEv,_ZThn20_N3aaa9GG11123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123223barEv,_ZThn28_N3aaa9GG11123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112322E[];
Class_Descriptor cd__ZN3aaa9GG1112322E = {  "_ZN3aaa9GG1112322E", // class name
  bases__ZN3aaa9GG1112322E, 6,
  &(vtc__ZN3aaa9GG1112322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112323  : ::aaa::EE111 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11123233fooEv
  virtual void  bar(); // _ZN3aaa9GG11123233barEv
  ~GG1112323(); // tgen
  GG1112323(); // tgen
};
//SIG(1 _ZN3aaa9GG1112323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11123233fooEv");}
void  aaa::GG1112323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11123233barEv");}
aaa::GG1112323 ::~GG1112323(){ note_dtor("_ZN3aaa9GG1112323E", this);} // tgen
aaa::GG1112323 ::GG1112323(){ note_ctor("_ZN3aaa9GG1112323E", this);} // tgen
}
static void Test__ZN3aaa9GG1112323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112323E, buf);
    ::aaa::GG1112323 *dp, &lv = *(dp=new (buf) ::aaa::GG1112323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112323E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1112323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1112323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1112323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112323E);
    dp->::aaa::GG1112323::~GG1112323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112323E(Test__ZN3aaa9GG1112323E, "_ZN3aaa9GG1112323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112323C1Ev();
extern void _ZN3aaa9GG1112323D1Ev();
Name_Map name_map__ZN3aaa9GG1112323E[] = {
  NSPAIR(_ZN3aaa9GG1112323C1Ev),
  NSPAIR(_ZN3aaa9GG1112323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1112323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112323E[];
extern void _ZN3aaa9GG11123233fooEv();
extern void _ZN3aaa9GG11123233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11123233fooEv,_ZThn8_N3aaa9GG11123233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11123233barEv,_ZThn20_N3aaa9GG11123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123233fooEv,_ZThn28_N3aaa9GG11123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123233barEv,_ZThn28_N3aaa9GG11123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11123233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11123233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11123233fooEv,_ZThn8_N3aaa9GG11123233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123233barEv,_ZThn20_N3aaa9GG11123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123233fooEv,_ZThn28_N3aaa9GG11123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123233barEv,_ZThn28_N3aaa9GG11123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112323E[];
Class_Descriptor cd__ZN3aaa9GG1112323E = {  "_ZN3aaa9GG1112323E", // class name
  bases__ZN3aaa9GG1112323E, 6,
  &(vtc__ZN3aaa9GG1112323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112331  : ::aaa::EE111 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11123313fooEv
  ~GG1112331(); // tgen
  GG1112331(); // tgen
};
//SIG(1 _ZN3aaa9GG1112331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11123313fooEv");}
aaa::GG1112331 ::~GG1112331(){ note_dtor("_ZN3aaa9GG1112331E", this);} // tgen
aaa::GG1112331 ::GG1112331(){ note_ctor("_ZN3aaa9GG1112331E", this);} // tgen
}
static void Test__ZN3aaa9GG1112331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112331E, buf);
    ::aaa::GG1112331 *dp, &lv = *(dp=new (buf) ::aaa::GG1112331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112331E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1112331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1112331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1112331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112331E);
    dp->::aaa::GG1112331::~GG1112331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112331E(Test__ZN3aaa9GG1112331E, "_ZN3aaa9GG1112331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112331C1Ev();
extern void _ZN3aaa9GG1112331D1Ev();
Name_Map name_map__ZN3aaa9GG1112331E[] = {
  NSPAIR(_ZN3aaa9GG1112331C1Ev),
  NSPAIR(_ZN3aaa9GG1112331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1112331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112331E[];
extern void _ZN3aaa9GG11123313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11123313fooEv,_ZThn8_N3aaa9GG11123313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11123313fooEv,_ZThn20_N3aaa9GG11123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123313fooEv,_ZThn28_N3aaa9GG11123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11123313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11123313fooEv,_ZThn8_N3aaa9GG11123313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123313fooEv,_ZThn20_N3aaa9GG11123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123313fooEv,_ZThn28_N3aaa9GG11123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112331E[];
Class_Descriptor cd__ZN3aaa9GG1112331E = {  "_ZN3aaa9GG1112331E", // class name
  bases__ZN3aaa9GG1112331E, 6,
  &(vtc__ZN3aaa9GG1112331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112331E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112332  : ::aaa::EE111 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11123323barEv
  ~GG1112332(); // tgen
  GG1112332(); // tgen
};
//SIG(1 _ZN3aaa9GG1112332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1112332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11123323barEv");}
aaa::GG1112332 ::~GG1112332(){ note_dtor("_ZN3aaa9GG1112332E", this);} // tgen
aaa::GG1112332 ::GG1112332(){ note_ctor("_ZN3aaa9GG1112332E", this);} // tgen
}
static void Test__ZN3aaa9GG1112332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112332E, buf);
    ::aaa::GG1112332 *dp, &lv = *(dp=new (buf) ::aaa::GG1112332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112332E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1112332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1112332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1112332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112332E);
    dp->::aaa::GG1112332::~GG1112332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112332E(Test__ZN3aaa9GG1112332E, "_ZN3aaa9GG1112332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112332C1Ev();
extern void _ZN3aaa9GG1112332D1Ev();
Name_Map name_map__ZN3aaa9GG1112332E[] = {
  NSPAIR(_ZN3aaa9GG1112332C1Ev),
  NSPAIR(_ZN3aaa9GG1112332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1112332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112332E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11123323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11123323barEv,_ZThn20_N3aaa9GG11123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123323barEv,_ZThn28_N3aaa9GG11123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11123323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123323barEv,_ZThn20_N3aaa9GG11123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123323barEv,_ZThn28_N3aaa9GG11123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112332E[];
Class_Descriptor cd__ZN3aaa9GG1112332E = {  "_ZN3aaa9GG1112332E", // class name
  bases__ZN3aaa9GG1112332E, 6,
  &(vtc__ZN3aaa9GG1112332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1112333  : ::aaa::EE111 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11123333fooEv
  virtual void  bar(); // _ZN3aaa9GG11123333barEv
  ~GG1112333(); // tgen
  GG1112333(); // tgen
};
//SIG(1 _ZN3aaa9GG1112333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1112333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11123333fooEv");}
void  aaa::GG1112333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11123333barEv");}
aaa::GG1112333 ::~GG1112333(){ note_dtor("_ZN3aaa9GG1112333E", this);} // tgen
aaa::GG1112333 ::GG1112333(){ note_ctor("_ZN3aaa9GG1112333E", this);} // tgen
}
static void Test__ZN3aaa9GG1112333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1112333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1112333E, buf);
    ::aaa::GG1112333 *dp, &lv = *(dp=new (buf) ::aaa::GG1112333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1112333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1112333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1112333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1112333E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1112333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1112333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1112333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1112333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1112333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1112333E);
    dp->::aaa::GG1112333::~GG1112333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1112333E(Test__ZN3aaa9GG1112333E, "_ZN3aaa9GG1112333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1112333C1Ev();
extern void _ZN3aaa9GG1112333D1Ev();
Name_Map name_map__ZN3aaa9GG1112333E[] = {
  NSPAIR(_ZN3aaa9GG1112333C1Ev),
  NSPAIR(_ZN3aaa9GG1112333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1112333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1112333E[];
extern void _ZN3aaa9GG11123333fooEv();
extern void _ZN3aaa9GG11123333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11123333fooEv,_ZThn8_N3aaa9GG11123333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11123333barEv,_ZThn20_N3aaa9GG11123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11123333fooEv,_ZThn20_N3aaa9GG11123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123333fooEv,_ZThn28_N3aaa9GG11123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11123333barEv,_ZThn28_N3aaa9GG11123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1112333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11123333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11123333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11123333fooEv,_ZThn8_N3aaa9GG11123333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123333barEv,_ZThn20_N3aaa9GG11123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11123333fooEv,_ZThn20_N3aaa9GG11123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123333fooEv,_ZThn28_N3aaa9GG11123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11123333barEv,_ZThn28_N3aaa9GG11123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1112333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1112333E[];
Class_Descriptor cd__ZN3aaa9GG1112333E = {  "_ZN3aaa9GG1112333E", // class name
  bases__ZN3aaa9GG1112333E, 6,
  &(vtc__ZN3aaa9GG1112333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1112333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1112333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113111  : ::aaa::EE111 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11131113fooEv
  ~GG1113111(); // tgen
  GG1113111(); // tgen
};
//SIG(1 _ZN3aaa9GG1113111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11131113fooEv");}
aaa::GG1113111 ::~GG1113111(){ note_dtor("_ZN3aaa9GG1113111E", this);} // tgen
aaa::GG1113111 ::GG1113111(){ note_ctor("_ZN3aaa9GG1113111E", this);} // tgen
}
static void Test__ZN3aaa9GG1113111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113111E, buf);
    ::aaa::GG1113111 *dp, &lv = *(dp=new (buf) ::aaa::GG1113111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113111E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1113111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1113111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1113111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113111E);
    dp->::aaa::GG1113111::~GG1113111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113111E(Test__ZN3aaa9GG1113111E, "_ZN3aaa9GG1113111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113111C1Ev();
extern void _ZN3aaa9GG1113111D1Ev();
Name_Map name_map__ZN3aaa9GG1113111E[] = {
  NSPAIR(_ZN3aaa9GG1113111C1Ev),
  NSPAIR(_ZN3aaa9GG1113111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1113111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113111E[];
extern void _ZN3aaa9GG11131113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11131113fooEv,_ZThn8_N3aaa9GG11131113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131113fooEv,_ZThn20_N3aaa9GG11131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11131113fooEv,_ZThn28_N3aaa9GG11131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11131113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11131113fooEv,_ZThn8_N3aaa9GG11131113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131113fooEv,_ZThn20_N3aaa9GG11131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11131113fooEv,_ZThn28_N3aaa9GG11131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113111E[];
Class_Descriptor cd__ZN3aaa9GG1113111E = {  "_ZN3aaa9GG1113111E", // class name
  bases__ZN3aaa9GG1113111E, 6,
  &(vtc__ZN3aaa9GG1113111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113112  : ::aaa::EE111 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11131123barEv
  ~GG1113112(); // tgen
  GG1113112(); // tgen
};
//SIG(1 _ZN3aaa9GG1113112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11131123barEv");}
aaa::GG1113112 ::~GG1113112(){ note_dtor("_ZN3aaa9GG1113112E", this);} // tgen
aaa::GG1113112 ::GG1113112(){ note_ctor("_ZN3aaa9GG1113112E", this);} // tgen
}
static void Test__ZN3aaa9GG1113112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113112E, buf);
    ::aaa::GG1113112 *dp, &lv = *(dp=new (buf) ::aaa::GG1113112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113112E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1113112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1113112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1113112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113112E);
    dp->::aaa::GG1113112::~GG1113112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113112E(Test__ZN3aaa9GG1113112E, "_ZN3aaa9GG1113112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113112C1Ev();
extern void _ZN3aaa9GG1113112D1Ev();
Name_Map name_map__ZN3aaa9GG1113112E[] = {
  NSPAIR(_ZN3aaa9GG1113112C1Ev),
  NSPAIR(_ZN3aaa9GG1113112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1113112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113112E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11131123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11131123barEv,_ZThn20_N3aaa9GG11131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11131123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131123barEv,_ZThn20_N3aaa9GG11131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113112E[];
Class_Descriptor cd__ZN3aaa9GG1113112E = {  "_ZN3aaa9GG1113112E", // class name
  bases__ZN3aaa9GG1113112E, 6,
  &(vtc__ZN3aaa9GG1113112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113113  : ::aaa::EE111 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11131133fooEv
  virtual void  bar(); // _ZN3aaa9GG11131133barEv
  ~GG1113113(); // tgen
  GG1113113(); // tgen
};
//SIG(1 _ZN3aaa9GG1113113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11131133fooEv");}
void  aaa::GG1113113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11131133barEv");}
aaa::GG1113113 ::~GG1113113(){ note_dtor("_ZN3aaa9GG1113113E", this);} // tgen
aaa::GG1113113 ::GG1113113(){ note_ctor("_ZN3aaa9GG1113113E", this);} // tgen
}
static void Test__ZN3aaa9GG1113113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113113E, buf);
    ::aaa::GG1113113 *dp, &lv = *(dp=new (buf) ::aaa::GG1113113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113113E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1113113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1113113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1113113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113113E);
    dp->::aaa::GG1113113::~GG1113113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113113E(Test__ZN3aaa9GG1113113E, "_ZN3aaa9GG1113113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113113C1Ev();
extern void _ZN3aaa9GG1113113D1Ev();
Name_Map name_map__ZN3aaa9GG1113113E[] = {
  NSPAIR(_ZN3aaa9GG1113113C1Ev),
  NSPAIR(_ZN3aaa9GG1113113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1113113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113113E[];
extern void _ZN3aaa9GG11131133fooEv();
extern void _ZN3aaa9GG11131133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11131133fooEv,_ZThn8_N3aaa9GG11131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131133fooEv,_ZThn20_N3aaa9GG11131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131133barEv,_ZThn20_N3aaa9GG11131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11131133fooEv,_ZThn28_N3aaa9GG11131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11131133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11131133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11131133fooEv,_ZThn8_N3aaa9GG11131133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131133fooEv,_ZThn20_N3aaa9GG11131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131133barEv,_ZThn20_N3aaa9GG11131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11131133fooEv,_ZThn28_N3aaa9GG11131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113113E[];
Class_Descriptor cd__ZN3aaa9GG1113113E = {  "_ZN3aaa9GG1113113E", // class name
  bases__ZN3aaa9GG1113113E, 6,
  &(vtc__ZN3aaa9GG1113113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113121  : ::aaa::EE111 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11131213fooEv
  ~GG1113121(); // tgen
  GG1113121(); // tgen
};
//SIG(1 _ZN3aaa9GG1113121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11131213fooEv");}
aaa::GG1113121 ::~GG1113121(){ note_dtor("_ZN3aaa9GG1113121E", this);} // tgen
aaa::GG1113121 ::GG1113121(){ note_ctor("_ZN3aaa9GG1113121E", this);} // tgen
}
static void Test__ZN3aaa9GG1113121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113121E, buf);
    ::aaa::GG1113121 *dp, &lv = *(dp=new (buf) ::aaa::GG1113121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113121E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1113121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1113121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1113121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113121E);
    dp->::aaa::GG1113121::~GG1113121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113121E(Test__ZN3aaa9GG1113121E, "_ZN3aaa9GG1113121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113121C1Ev();
extern void _ZN3aaa9GG1113121D1Ev();
Name_Map name_map__ZN3aaa9GG1113121E[] = {
  NSPAIR(_ZN3aaa9GG1113121C1Ev),
  NSPAIR(_ZN3aaa9GG1113121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1113121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113121E[];
extern void _ZN3aaa9GG11131213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11131213fooEv,_ZThn8_N3aaa9GG11131213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131213fooEv,_ZThn20_N3aaa9GG11131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11131213fooEv,_ZThn28_N3aaa9GG11131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11131213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11131213fooEv,_ZThn8_N3aaa9GG11131213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131213fooEv,_ZThn20_N3aaa9GG11131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11131213fooEv,_ZThn28_N3aaa9GG11131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113121E[];
Class_Descriptor cd__ZN3aaa9GG1113121E = {  "_ZN3aaa9GG1113121E", // class name
  bases__ZN3aaa9GG1113121E, 6,
  &(vtc__ZN3aaa9GG1113121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113122  : ::aaa::EE111 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11131223barEv
  ~GG1113122(); // tgen
  GG1113122(); // tgen
};
//SIG(1 _ZN3aaa9GG1113122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11131223barEv");}
aaa::GG1113122 ::~GG1113122(){ note_dtor("_ZN3aaa9GG1113122E", this);} // tgen
aaa::GG1113122 ::GG1113122(){ note_ctor("_ZN3aaa9GG1113122E", this);} // tgen
}
static void Test__ZN3aaa9GG1113122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113122E, buf);
    ::aaa::GG1113122 *dp, &lv = *(dp=new (buf) ::aaa::GG1113122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113122E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1113122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1113122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1113122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113122E);
    dp->::aaa::GG1113122::~GG1113122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113122E(Test__ZN3aaa9GG1113122E, "_ZN3aaa9GG1113122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113122C1Ev();
extern void _ZN3aaa9GG1113122D1Ev();
Name_Map name_map__ZN3aaa9GG1113122E[] = {
  NSPAIR(_ZN3aaa9GG1113122C1Ev),
  NSPAIR(_ZN3aaa9GG1113122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1113122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113122E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11131223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11131223barEv,_ZThn20_N3aaa9GG11131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11131223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131223barEv,_ZThn20_N3aaa9GG11131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113122E[];
Class_Descriptor cd__ZN3aaa9GG1113122E = {  "_ZN3aaa9GG1113122E", // class name
  bases__ZN3aaa9GG1113122E, 6,
  &(vtc__ZN3aaa9GG1113122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113123  : ::aaa::EE111 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11131233fooEv
  virtual void  bar(); // _ZN3aaa9GG11131233barEv
  ~GG1113123(); // tgen
  GG1113123(); // tgen
};
//SIG(1 _ZN3aaa9GG1113123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11131233fooEv");}
void  aaa::GG1113123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11131233barEv");}
aaa::GG1113123 ::~GG1113123(){ note_dtor("_ZN3aaa9GG1113123E", this);} // tgen
aaa::GG1113123 ::GG1113123(){ note_ctor("_ZN3aaa9GG1113123E", this);} // tgen
}
static void Test__ZN3aaa9GG1113123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113123E, buf);
    ::aaa::GG1113123 *dp, &lv = *(dp=new (buf) ::aaa::GG1113123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113123E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1113123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1113123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1113123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113123E);
    dp->::aaa::GG1113123::~GG1113123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113123E(Test__ZN3aaa9GG1113123E, "_ZN3aaa9GG1113123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113123C1Ev();
extern void _ZN3aaa9GG1113123D1Ev();
Name_Map name_map__ZN3aaa9GG1113123E[] = {
  NSPAIR(_ZN3aaa9GG1113123C1Ev),
  NSPAIR(_ZN3aaa9GG1113123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1113123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113123E[];
extern void _ZN3aaa9GG11131233fooEv();
extern void _ZN3aaa9GG11131233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11131233fooEv,_ZThn8_N3aaa9GG11131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131233fooEv,_ZThn20_N3aaa9GG11131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131233barEv,_ZThn20_N3aaa9GG11131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11131233fooEv,_ZThn28_N3aaa9GG11131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11131233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11131233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11131233fooEv,_ZThn8_N3aaa9GG11131233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131233fooEv,_ZThn20_N3aaa9GG11131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131233barEv,_ZThn20_N3aaa9GG11131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11131233fooEv,_ZThn28_N3aaa9GG11131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113123E[];
Class_Descriptor cd__ZN3aaa9GG1113123E = {  "_ZN3aaa9GG1113123E", // class name
  bases__ZN3aaa9GG1113123E, 6,
  &(vtc__ZN3aaa9GG1113123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113131  : ::aaa::EE111 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11131313fooEv
  ~GG1113131(); // tgen
  GG1113131(); // tgen
};
//SIG(1 _ZN3aaa9GG1113131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11131313fooEv");}
aaa::GG1113131 ::~GG1113131(){ note_dtor("_ZN3aaa9GG1113131E", this);} // tgen
aaa::GG1113131 ::GG1113131(){ note_ctor("_ZN3aaa9GG1113131E", this);} // tgen
}
static void Test__ZN3aaa9GG1113131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113131E, buf);
    ::aaa::GG1113131 *dp, &lv = *(dp=new (buf) ::aaa::GG1113131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113131E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1113131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1113131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1113131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113131E);
    dp->::aaa::GG1113131::~GG1113131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113131E(Test__ZN3aaa9GG1113131E, "_ZN3aaa9GG1113131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113131C1Ev();
extern void _ZN3aaa9GG1113131D1Ev();
Name_Map name_map__ZN3aaa9GG1113131E[] = {
  NSPAIR(_ZN3aaa9GG1113131C1Ev),
  NSPAIR(_ZN3aaa9GG1113131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1113131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113131E[];
extern void _ZN3aaa9GG11131313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11131313fooEv,_ZThn8_N3aaa9GG11131313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131313fooEv,_ZThn20_N3aaa9GG11131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11131313fooEv,_ZThn28_N3aaa9GG11131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11131313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11131313fooEv,_ZThn8_N3aaa9GG11131313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131313fooEv,_ZThn20_N3aaa9GG11131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11131313fooEv,_ZThn28_N3aaa9GG11131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113131E[];
Class_Descriptor cd__ZN3aaa9GG1113131E = {  "_ZN3aaa9GG1113131E", // class name
  bases__ZN3aaa9GG1113131E, 6,
  &(vtc__ZN3aaa9GG1113131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113131E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113132  : ::aaa::EE111 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11131323barEv
  ~GG1113132(); // tgen
  GG1113132(); // tgen
};
//SIG(1 _ZN3aaa9GG1113132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11131323barEv");}
aaa::GG1113132 ::~GG1113132(){ note_dtor("_ZN3aaa9GG1113132E", this);} // tgen
aaa::GG1113132 ::GG1113132(){ note_ctor("_ZN3aaa9GG1113132E", this);} // tgen
}
static void Test__ZN3aaa9GG1113132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113132E, buf);
    ::aaa::GG1113132 *dp, &lv = *(dp=new (buf) ::aaa::GG1113132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113132E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1113132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1113132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1113132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113132E);
    dp->::aaa::GG1113132::~GG1113132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113132E(Test__ZN3aaa9GG1113132E, "_ZN3aaa9GG1113132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113132C1Ev();
extern void _ZN3aaa9GG1113132D1Ev();
Name_Map name_map__ZN3aaa9GG1113132E[] = {
  NSPAIR(_ZN3aaa9GG1113132C1Ev),
  NSPAIR(_ZN3aaa9GG1113132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1113132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113132E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11131323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11131323barEv,_ZThn20_N3aaa9GG11131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11131323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131323barEv,_ZThn20_N3aaa9GG11131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113132E[];
Class_Descriptor cd__ZN3aaa9GG1113132E = {  "_ZN3aaa9GG1113132E", // class name
  bases__ZN3aaa9GG1113132E, 6,
  &(vtc__ZN3aaa9GG1113132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113133  : ::aaa::EE111 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11131333fooEv
  virtual void  bar(); // _ZN3aaa9GG11131333barEv
  ~GG1113133(); // tgen
  GG1113133(); // tgen
};
//SIG(1 _ZN3aaa9GG1113133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11131333fooEv");}
void  aaa::GG1113133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11131333barEv");}
aaa::GG1113133 ::~GG1113133(){ note_dtor("_ZN3aaa9GG1113133E", this);} // tgen
aaa::GG1113133 ::GG1113133(){ note_ctor("_ZN3aaa9GG1113133E", this);} // tgen
}
static void Test__ZN3aaa9GG1113133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113133E, buf);
    ::aaa::GG1113133 *dp, &lv = *(dp=new (buf) ::aaa::GG1113133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113133E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1113133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1113133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1113133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113133E);
    dp->::aaa::GG1113133::~GG1113133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113133E(Test__ZN3aaa9GG1113133E, "_ZN3aaa9GG1113133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113133C1Ev();
extern void _ZN3aaa9GG1113133D1Ev();
Name_Map name_map__ZN3aaa9GG1113133E[] = {
  NSPAIR(_ZN3aaa9GG1113133C1Ev),
  NSPAIR(_ZN3aaa9GG1113133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1113133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113133E[];
extern void _ZN3aaa9GG11131333fooEv();
extern void _ZN3aaa9GG11131333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11131333fooEv,_ZThn8_N3aaa9GG11131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131333fooEv,_ZThn20_N3aaa9GG11131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11131333barEv,_ZThn20_N3aaa9GG11131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11131333fooEv,_ZThn28_N3aaa9GG11131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11131333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11131333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11131333fooEv,_ZThn8_N3aaa9GG11131333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131333fooEv,_ZThn20_N3aaa9GG11131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11131333barEv,_ZThn20_N3aaa9GG11131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11131333fooEv,_ZThn28_N3aaa9GG11131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113133E[];
Class_Descriptor cd__ZN3aaa9GG1113133E = {  "_ZN3aaa9GG1113133E", // class name
  bases__ZN3aaa9GG1113133E, 6,
  &(vtc__ZN3aaa9GG1113133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113211  : ::aaa::EE111 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11132113fooEv
  ~GG1113211(); // tgen
  GG1113211(); // tgen
};
//SIG(1 _ZN3aaa9GG1113211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11132113fooEv");}
aaa::GG1113211 ::~GG1113211(){ note_dtor("_ZN3aaa9GG1113211E", this);} // tgen
aaa::GG1113211 ::GG1113211(){ note_ctor("_ZN3aaa9GG1113211E", this);} // tgen
}
static void Test__ZN3aaa9GG1113211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113211E, buf);
    ::aaa::GG1113211 *dp, &lv = *(dp=new (buf) ::aaa::GG1113211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113211E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1113211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1113211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1113211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113211E);
    dp->::aaa::GG1113211::~GG1113211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113211E(Test__ZN3aaa9GG1113211E, "_ZN3aaa9GG1113211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113211C1Ev();
extern void _ZN3aaa9GG1113211D1Ev();
Name_Map name_map__ZN3aaa9GG1113211E[] = {
  NSPAIR(_ZN3aaa9GG1113211C1Ev),
  NSPAIR(_ZN3aaa9GG1113211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1113211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113211E[];
extern void _ZN3aaa9GG11132113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11132113fooEv,_ZThn8_N3aaa9GG11132113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132113fooEv,_ZThn20_N3aaa9GG11132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11132113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11132113fooEv,_ZThn8_N3aaa9GG11132113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132113fooEv,_ZThn20_N3aaa9GG11132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113211E[];
Class_Descriptor cd__ZN3aaa9GG1113211E = {  "_ZN3aaa9GG1113211E", // class name
  bases__ZN3aaa9GG1113211E, 6,
  &(vtc__ZN3aaa9GG1113211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113212  : ::aaa::EE111 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11132123barEv
  ~GG1113212(); // tgen
  GG1113212(); // tgen
};
//SIG(1 _ZN3aaa9GG1113212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11132123barEv");}
aaa::GG1113212 ::~GG1113212(){ note_dtor("_ZN3aaa9GG1113212E", this);} // tgen
aaa::GG1113212 ::GG1113212(){ note_ctor("_ZN3aaa9GG1113212E", this);} // tgen
}
static void Test__ZN3aaa9GG1113212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113212E, buf);
    ::aaa::GG1113212 *dp, &lv = *(dp=new (buf) ::aaa::GG1113212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113212E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1113212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1113212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1113212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113212E);
    dp->::aaa::GG1113212::~GG1113212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113212E(Test__ZN3aaa9GG1113212E, "_ZN3aaa9GG1113212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113212C1Ev();
extern void _ZN3aaa9GG1113212D1Ev();
Name_Map name_map__ZN3aaa9GG1113212E[] = {
  NSPAIR(_ZN3aaa9GG1113212C1Ev),
  NSPAIR(_ZN3aaa9GG1113212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1113212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113212E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11132123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11132123barEv,_ZThn20_N3aaa9GG11132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11132123barEv,_ZThn28_N3aaa9GG11132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11132123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132123barEv,_ZThn20_N3aaa9GG11132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11132123barEv,_ZThn28_N3aaa9GG11132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113212E[];
Class_Descriptor cd__ZN3aaa9GG1113212E = {  "_ZN3aaa9GG1113212E", // class name
  bases__ZN3aaa9GG1113212E, 6,
  &(vtc__ZN3aaa9GG1113212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113213  : ::aaa::EE111 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11132133fooEv
  virtual void  bar(); // _ZN3aaa9GG11132133barEv
  ~GG1113213(); // tgen
  GG1113213(); // tgen
};
//SIG(1 _ZN3aaa9GG1113213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11132133fooEv");}
void  aaa::GG1113213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11132133barEv");}
aaa::GG1113213 ::~GG1113213(){ note_dtor("_ZN3aaa9GG1113213E", this);} // tgen
aaa::GG1113213 ::GG1113213(){ note_ctor("_ZN3aaa9GG1113213E", this);} // tgen
}
static void Test__ZN3aaa9GG1113213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113213E, buf);
    ::aaa::GG1113213 *dp, &lv = *(dp=new (buf) ::aaa::GG1113213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113213E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1113213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1113213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1113213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113213E);
    dp->::aaa::GG1113213::~GG1113213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113213E(Test__ZN3aaa9GG1113213E, "_ZN3aaa9GG1113213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113213C1Ev();
extern void _ZN3aaa9GG1113213D1Ev();
Name_Map name_map__ZN3aaa9GG1113213E[] = {
  NSPAIR(_ZN3aaa9GG1113213C1Ev),
  NSPAIR(_ZN3aaa9GG1113213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1113213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113213E[];
extern void _ZN3aaa9GG11132133fooEv();
extern void _ZN3aaa9GG11132133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11132133fooEv,_ZThn8_N3aaa9GG11132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132133fooEv,_ZThn20_N3aaa9GG11132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132133barEv,_ZThn20_N3aaa9GG11132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11132133barEv,_ZThn28_N3aaa9GG11132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11132133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11132133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11132133fooEv,_ZThn8_N3aaa9GG11132133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132133fooEv,_ZThn20_N3aaa9GG11132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132133barEv,_ZThn20_N3aaa9GG11132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11132133barEv,_ZThn28_N3aaa9GG11132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113213E[];
Class_Descriptor cd__ZN3aaa9GG1113213E = {  "_ZN3aaa9GG1113213E", // class name
  bases__ZN3aaa9GG1113213E, 6,
  &(vtc__ZN3aaa9GG1113213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113221  : ::aaa::EE111 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11132213fooEv
  ~GG1113221(); // tgen
  GG1113221(); // tgen
};
//SIG(1 _ZN3aaa9GG1113221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11132213fooEv");}
aaa::GG1113221 ::~GG1113221(){ note_dtor("_ZN3aaa9GG1113221E", this);} // tgen
aaa::GG1113221 ::GG1113221(){ note_ctor("_ZN3aaa9GG1113221E", this);} // tgen
}
static void Test__ZN3aaa9GG1113221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113221E, buf);
    ::aaa::GG1113221 *dp, &lv = *(dp=new (buf) ::aaa::GG1113221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113221E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1113221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1113221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1113221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113221E);
    dp->::aaa::GG1113221::~GG1113221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113221E(Test__ZN3aaa9GG1113221E, "_ZN3aaa9GG1113221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113221C1Ev();
extern void _ZN3aaa9GG1113221D1Ev();
Name_Map name_map__ZN3aaa9GG1113221E[] = {
  NSPAIR(_ZN3aaa9GG1113221C1Ev),
  NSPAIR(_ZN3aaa9GG1113221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1113221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113221E[];
extern void _ZN3aaa9GG11132213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11132213fooEv,_ZThn8_N3aaa9GG11132213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132213fooEv,_ZThn20_N3aaa9GG11132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11132213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11132213fooEv,_ZThn8_N3aaa9GG11132213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132213fooEv,_ZThn20_N3aaa9GG11132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113221E[];
Class_Descriptor cd__ZN3aaa9GG1113221E = {  "_ZN3aaa9GG1113221E", // class name
  bases__ZN3aaa9GG1113221E, 6,
  &(vtc__ZN3aaa9GG1113221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113222  : ::aaa::EE111 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11132223barEv
  ~GG1113222(); // tgen
  GG1113222(); // tgen
};
//SIG(1 _ZN3aaa9GG1113222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11132223barEv");}
aaa::GG1113222 ::~GG1113222(){ note_dtor("_ZN3aaa9GG1113222E", this);} // tgen
aaa::GG1113222 ::GG1113222(){ note_ctor("_ZN3aaa9GG1113222E", this);} // tgen
}
static void Test__ZN3aaa9GG1113222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113222E, buf);
    ::aaa::GG1113222 *dp, &lv = *(dp=new (buf) ::aaa::GG1113222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113222E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1113222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1113222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1113222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113222E);
    dp->::aaa::GG1113222::~GG1113222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113222E(Test__ZN3aaa9GG1113222E, "_ZN3aaa9GG1113222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113222C1Ev();
extern void _ZN3aaa9GG1113222D1Ev();
Name_Map name_map__ZN3aaa9GG1113222E[] = {
  NSPAIR(_ZN3aaa9GG1113222C1Ev),
  NSPAIR(_ZN3aaa9GG1113222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1113222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113222E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11132223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11132223barEv,_ZThn20_N3aaa9GG11132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11132223barEv,_ZThn28_N3aaa9GG11132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11132223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132223barEv,_ZThn20_N3aaa9GG11132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11132223barEv,_ZThn28_N3aaa9GG11132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113222E[];
Class_Descriptor cd__ZN3aaa9GG1113222E = {  "_ZN3aaa9GG1113222E", // class name
  bases__ZN3aaa9GG1113222E, 6,
  &(vtc__ZN3aaa9GG1113222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113223  : ::aaa::EE111 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11132233fooEv
  virtual void  bar(); // _ZN3aaa9GG11132233barEv
  ~GG1113223(); // tgen
  GG1113223(); // tgen
};
//SIG(1 _ZN3aaa9GG1113223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11132233fooEv");}
void  aaa::GG1113223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11132233barEv");}
aaa::GG1113223 ::~GG1113223(){ note_dtor("_ZN3aaa9GG1113223E", this);} // tgen
aaa::GG1113223 ::GG1113223(){ note_ctor("_ZN3aaa9GG1113223E", this);} // tgen
}
static void Test__ZN3aaa9GG1113223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113223E, buf);
    ::aaa::GG1113223 *dp, &lv = *(dp=new (buf) ::aaa::GG1113223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113223E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1113223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1113223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1113223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113223E);
    dp->::aaa::GG1113223::~GG1113223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113223E(Test__ZN3aaa9GG1113223E, "_ZN3aaa9GG1113223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113223C1Ev();
extern void _ZN3aaa9GG1113223D1Ev();
Name_Map name_map__ZN3aaa9GG1113223E[] = {
  NSPAIR(_ZN3aaa9GG1113223C1Ev),
  NSPAIR(_ZN3aaa9GG1113223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1113223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113223E[];
extern void _ZN3aaa9GG11132233fooEv();
extern void _ZN3aaa9GG11132233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11132233fooEv,_ZThn8_N3aaa9GG11132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132233fooEv,_ZThn20_N3aaa9GG11132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132233barEv,_ZThn20_N3aaa9GG11132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11132233barEv,_ZThn28_N3aaa9GG11132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11132233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11132233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11132233fooEv,_ZThn8_N3aaa9GG11132233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132233fooEv,_ZThn20_N3aaa9GG11132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132233barEv,_ZThn20_N3aaa9GG11132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11132233barEv,_ZThn28_N3aaa9GG11132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113223E[];
Class_Descriptor cd__ZN3aaa9GG1113223E = {  "_ZN3aaa9GG1113223E", // class name
  bases__ZN3aaa9GG1113223E, 6,
  &(vtc__ZN3aaa9GG1113223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113231  : ::aaa::EE111 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11132313fooEv
  ~GG1113231(); // tgen
  GG1113231(); // tgen
};
//SIG(1 _ZN3aaa9GG1113231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11132313fooEv");}
aaa::GG1113231 ::~GG1113231(){ note_dtor("_ZN3aaa9GG1113231E", this);} // tgen
aaa::GG1113231 ::GG1113231(){ note_ctor("_ZN3aaa9GG1113231E", this);} // tgen
}
static void Test__ZN3aaa9GG1113231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113231E, buf);
    ::aaa::GG1113231 *dp, &lv = *(dp=new (buf) ::aaa::GG1113231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113231E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1113231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1113231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1113231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113231E);
    dp->::aaa::GG1113231::~GG1113231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113231E(Test__ZN3aaa9GG1113231E, "_ZN3aaa9GG1113231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113231C1Ev();
extern void _ZN3aaa9GG1113231D1Ev();
Name_Map name_map__ZN3aaa9GG1113231E[] = {
  NSPAIR(_ZN3aaa9GG1113231C1Ev),
  NSPAIR(_ZN3aaa9GG1113231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1113231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113231E[];
extern void _ZN3aaa9GG11132313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11132313fooEv,_ZThn8_N3aaa9GG11132313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132313fooEv,_ZThn20_N3aaa9GG11132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11132313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11132313fooEv,_ZThn8_N3aaa9GG11132313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132313fooEv,_ZThn20_N3aaa9GG11132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113231E[];
Class_Descriptor cd__ZN3aaa9GG1113231E = {  "_ZN3aaa9GG1113231E", // class name
  bases__ZN3aaa9GG1113231E, 6,
  &(vtc__ZN3aaa9GG1113231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113231E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113232  : ::aaa::EE111 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11132323barEv
  ~GG1113232(); // tgen
  GG1113232(); // tgen
};
//SIG(1 _ZN3aaa9GG1113232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11132323barEv");}
aaa::GG1113232 ::~GG1113232(){ note_dtor("_ZN3aaa9GG1113232E", this);} // tgen
aaa::GG1113232 ::GG1113232(){ note_ctor("_ZN3aaa9GG1113232E", this);} // tgen
}
static void Test__ZN3aaa9GG1113232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113232E, buf);
    ::aaa::GG1113232 *dp, &lv = *(dp=new (buf) ::aaa::GG1113232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113232E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1113232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1113232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1113232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113232E);
    dp->::aaa::GG1113232::~GG1113232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113232E(Test__ZN3aaa9GG1113232E, "_ZN3aaa9GG1113232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113232C1Ev();
extern void _ZN3aaa9GG1113232D1Ev();
Name_Map name_map__ZN3aaa9GG1113232E[] = {
  NSPAIR(_ZN3aaa9GG1113232C1Ev),
  NSPAIR(_ZN3aaa9GG1113232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1113232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113232E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11132323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11132323barEv,_ZThn20_N3aaa9GG11132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11132323barEv,_ZThn28_N3aaa9GG11132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11132323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132323barEv,_ZThn20_N3aaa9GG11132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11132323barEv,_ZThn28_N3aaa9GG11132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113232E[];
Class_Descriptor cd__ZN3aaa9GG1113232E = {  "_ZN3aaa9GG1113232E", // class name
  bases__ZN3aaa9GG1113232E, 6,
  &(vtc__ZN3aaa9GG1113232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113233  : ::aaa::EE111 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11132333fooEv
  virtual void  bar(); // _ZN3aaa9GG11132333barEv
  ~GG1113233(); // tgen
  GG1113233(); // tgen
};
//SIG(1 _ZN3aaa9GG1113233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11132333fooEv");}
void  aaa::GG1113233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11132333barEv");}
aaa::GG1113233 ::~GG1113233(){ note_dtor("_ZN3aaa9GG1113233E", this);} // tgen
aaa::GG1113233 ::GG1113233(){ note_ctor("_ZN3aaa9GG1113233E", this);} // tgen
}
static void Test__ZN3aaa9GG1113233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113233E, buf);
    ::aaa::GG1113233 *dp, &lv = *(dp=new (buf) ::aaa::GG1113233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113233E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1113233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1113233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1113233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113233E);
    dp->::aaa::GG1113233::~GG1113233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113233E(Test__ZN3aaa9GG1113233E, "_ZN3aaa9GG1113233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113233C1Ev();
extern void _ZN3aaa9GG1113233D1Ev();
Name_Map name_map__ZN3aaa9GG1113233E[] = {
  NSPAIR(_ZN3aaa9GG1113233C1Ev),
  NSPAIR(_ZN3aaa9GG1113233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1113233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113233E[];
extern void _ZN3aaa9GG11132333fooEv();
extern void _ZN3aaa9GG11132333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11132333fooEv,_ZThn8_N3aaa9GG11132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132333fooEv,_ZThn20_N3aaa9GG11132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11132333barEv,_ZThn20_N3aaa9GG11132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11132333barEv,_ZThn28_N3aaa9GG11132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11132333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11132333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11132333fooEv,_ZThn8_N3aaa9GG11132333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132333fooEv,_ZThn20_N3aaa9GG11132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11132333barEv,_ZThn20_N3aaa9GG11132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11132333barEv,_ZThn28_N3aaa9GG11132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113233E[];
Class_Descriptor cd__ZN3aaa9GG1113233E = {  "_ZN3aaa9GG1113233E", // class name
  bases__ZN3aaa9GG1113233E, 6,
  &(vtc__ZN3aaa9GG1113233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113311  : ::aaa::EE111 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11133113fooEv
  ~GG1113311(); // tgen
  GG1113311(); // tgen
};
//SIG(1 _ZN3aaa9GG1113311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11133113fooEv");}
aaa::GG1113311 ::~GG1113311(){ note_dtor("_ZN3aaa9GG1113311E", this);} // tgen
aaa::GG1113311 ::GG1113311(){ note_ctor("_ZN3aaa9GG1113311E", this);} // tgen
}
static void Test__ZN3aaa9GG1113311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113311E, buf);
    ::aaa::GG1113311 *dp, &lv = *(dp=new (buf) ::aaa::GG1113311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113311E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1113311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1113311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1113311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113311E);
    dp->::aaa::GG1113311::~GG1113311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113311E(Test__ZN3aaa9GG1113311E, "_ZN3aaa9GG1113311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113311C1Ev();
extern void _ZN3aaa9GG1113311D1Ev();
Name_Map name_map__ZN3aaa9GG1113311E[] = {
  NSPAIR(_ZN3aaa9GG1113311C1Ev),
  NSPAIR(_ZN3aaa9GG1113311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1113311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113311E[];
extern void _ZN3aaa9GG11133113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11133113fooEv,_ZThn8_N3aaa9GG11133113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133113fooEv,_ZThn20_N3aaa9GG11133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11133113fooEv,_ZThn28_N3aaa9GG11133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11133113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11133113fooEv,_ZThn8_N3aaa9GG11133113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133113fooEv,_ZThn20_N3aaa9GG11133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133113fooEv,_ZThn28_N3aaa9GG11133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113311E[];
Class_Descriptor cd__ZN3aaa9GG1113311E = {  "_ZN3aaa9GG1113311E", // class name
  bases__ZN3aaa9GG1113311E, 6,
  &(vtc__ZN3aaa9GG1113311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113312  : ::aaa::EE111 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11133123barEv
  ~GG1113312(); // tgen
  GG1113312(); // tgen
};
//SIG(1 _ZN3aaa9GG1113312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11133123barEv");}
aaa::GG1113312 ::~GG1113312(){ note_dtor("_ZN3aaa9GG1113312E", this);} // tgen
aaa::GG1113312 ::GG1113312(){ note_ctor("_ZN3aaa9GG1113312E", this);} // tgen
}
static void Test__ZN3aaa9GG1113312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113312E, buf);
    ::aaa::GG1113312 *dp, &lv = *(dp=new (buf) ::aaa::GG1113312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113312E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1113312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1113312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1113312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113312E);
    dp->::aaa::GG1113312::~GG1113312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113312E(Test__ZN3aaa9GG1113312E, "_ZN3aaa9GG1113312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113312C1Ev();
extern void _ZN3aaa9GG1113312D1Ev();
Name_Map name_map__ZN3aaa9GG1113312E[] = {
  NSPAIR(_ZN3aaa9GG1113312C1Ev),
  NSPAIR(_ZN3aaa9GG1113312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1113312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113312E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11133123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11133123barEv,_ZThn20_N3aaa9GG11133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11133123barEv,_ZThn28_N3aaa9GG11133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11133123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133123barEv,_ZThn20_N3aaa9GG11133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133123barEv,_ZThn28_N3aaa9GG11133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113312E[];
Class_Descriptor cd__ZN3aaa9GG1113312E = {  "_ZN3aaa9GG1113312E", // class name
  bases__ZN3aaa9GG1113312E, 6,
  &(vtc__ZN3aaa9GG1113312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113313  : ::aaa::EE111 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11133133fooEv
  virtual void  bar(); // _ZN3aaa9GG11133133barEv
  ~GG1113313(); // tgen
  GG1113313(); // tgen
};
//SIG(1 _ZN3aaa9GG1113313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11133133fooEv");}
void  aaa::GG1113313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11133133barEv");}
aaa::GG1113313 ::~GG1113313(){ note_dtor("_ZN3aaa9GG1113313E", this);} // tgen
aaa::GG1113313 ::GG1113313(){ note_ctor("_ZN3aaa9GG1113313E", this);} // tgen
}
static void Test__ZN3aaa9GG1113313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113313E, buf);
    ::aaa::GG1113313 *dp, &lv = *(dp=new (buf) ::aaa::GG1113313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113313E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1113313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1113313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1113313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113313E);
    dp->::aaa::GG1113313::~GG1113313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113313E(Test__ZN3aaa9GG1113313E, "_ZN3aaa9GG1113313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113313C1Ev();
extern void _ZN3aaa9GG1113313D1Ev();
Name_Map name_map__ZN3aaa9GG1113313E[] = {
  NSPAIR(_ZN3aaa9GG1113313C1Ev),
  NSPAIR(_ZN3aaa9GG1113313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1113313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113313E[];
extern void _ZN3aaa9GG11133133fooEv();
extern void _ZN3aaa9GG11133133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11133133fooEv,_ZThn8_N3aaa9GG11133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133133fooEv,_ZThn20_N3aaa9GG11133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133133barEv,_ZThn20_N3aaa9GG11133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11133133fooEv,_ZThn28_N3aaa9GG11133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11133133barEv,_ZThn28_N3aaa9GG11133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11133133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11133133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11133133fooEv,_ZThn8_N3aaa9GG11133133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133133fooEv,_ZThn20_N3aaa9GG11133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133133barEv,_ZThn20_N3aaa9GG11133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133133fooEv,_ZThn28_N3aaa9GG11133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133133barEv,_ZThn28_N3aaa9GG11133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113313E[];
Class_Descriptor cd__ZN3aaa9GG1113313E = {  "_ZN3aaa9GG1113313E", // class name
  bases__ZN3aaa9GG1113313E, 6,
  &(vtc__ZN3aaa9GG1113313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113321  : ::aaa::EE111 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11133213fooEv
  ~GG1113321(); // tgen
  GG1113321(); // tgen
};
//SIG(1 _ZN3aaa9GG1113321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11133213fooEv");}
aaa::GG1113321 ::~GG1113321(){ note_dtor("_ZN3aaa9GG1113321E", this);} // tgen
aaa::GG1113321 ::GG1113321(){ note_ctor("_ZN3aaa9GG1113321E", this);} // tgen
}
static void Test__ZN3aaa9GG1113321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113321E, buf);
    ::aaa::GG1113321 *dp, &lv = *(dp=new (buf) ::aaa::GG1113321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113321E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1113321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1113321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1113321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113321E);
    dp->::aaa::GG1113321::~GG1113321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113321E(Test__ZN3aaa9GG1113321E, "_ZN3aaa9GG1113321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113321C1Ev();
extern void _ZN3aaa9GG1113321D1Ev();
Name_Map name_map__ZN3aaa9GG1113321E[] = {
  NSPAIR(_ZN3aaa9GG1113321C1Ev),
  NSPAIR(_ZN3aaa9GG1113321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1113321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113321E[];
extern void _ZN3aaa9GG11133213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11133213fooEv,_ZThn8_N3aaa9GG11133213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133213fooEv,_ZThn20_N3aaa9GG11133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11133213fooEv,_ZThn28_N3aaa9GG11133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11133213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11133213fooEv,_ZThn8_N3aaa9GG11133213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133213fooEv,_ZThn20_N3aaa9GG11133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133213fooEv,_ZThn28_N3aaa9GG11133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113321E[];
Class_Descriptor cd__ZN3aaa9GG1113321E = {  "_ZN3aaa9GG1113321E", // class name
  bases__ZN3aaa9GG1113321E, 6,
  &(vtc__ZN3aaa9GG1113321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113322  : ::aaa::EE111 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11133223barEv
  ~GG1113322(); // tgen
  GG1113322(); // tgen
};
//SIG(1 _ZN3aaa9GG1113322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11133223barEv");}
aaa::GG1113322 ::~GG1113322(){ note_dtor("_ZN3aaa9GG1113322E", this);} // tgen
aaa::GG1113322 ::GG1113322(){ note_ctor("_ZN3aaa9GG1113322E", this);} // tgen
}
static void Test__ZN3aaa9GG1113322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113322E, buf);
    ::aaa::GG1113322 *dp, &lv = *(dp=new (buf) ::aaa::GG1113322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113322E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1113322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1113322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1113322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113322E);
    dp->::aaa::GG1113322::~GG1113322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113322E(Test__ZN3aaa9GG1113322E, "_ZN3aaa9GG1113322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113322C1Ev();
extern void _ZN3aaa9GG1113322D1Ev();
Name_Map name_map__ZN3aaa9GG1113322E[] = {
  NSPAIR(_ZN3aaa9GG1113322C1Ev),
  NSPAIR(_ZN3aaa9GG1113322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1113322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113322E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11133223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11133223barEv,_ZThn20_N3aaa9GG11133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11133223barEv,_ZThn28_N3aaa9GG11133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11133223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133223barEv,_ZThn20_N3aaa9GG11133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133223barEv,_ZThn28_N3aaa9GG11133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113322E[];
Class_Descriptor cd__ZN3aaa9GG1113322E = {  "_ZN3aaa9GG1113322E", // class name
  bases__ZN3aaa9GG1113322E, 6,
  &(vtc__ZN3aaa9GG1113322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113323  : ::aaa::EE111 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11133233fooEv
  virtual void  bar(); // _ZN3aaa9GG11133233barEv
  ~GG1113323(); // tgen
  GG1113323(); // tgen
};
//SIG(1 _ZN3aaa9GG1113323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11133233fooEv");}
void  aaa::GG1113323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11133233barEv");}
aaa::GG1113323 ::~GG1113323(){ note_dtor("_ZN3aaa9GG1113323E", this);} // tgen
aaa::GG1113323 ::GG1113323(){ note_ctor("_ZN3aaa9GG1113323E", this);} // tgen
}
static void Test__ZN3aaa9GG1113323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113323E, buf);
    ::aaa::GG1113323 *dp, &lv = *(dp=new (buf) ::aaa::GG1113323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113323E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1113323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1113323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1113323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113323E);
    dp->::aaa::GG1113323::~GG1113323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113323E(Test__ZN3aaa9GG1113323E, "_ZN3aaa9GG1113323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113323C1Ev();
extern void _ZN3aaa9GG1113323D1Ev();
Name_Map name_map__ZN3aaa9GG1113323E[] = {
  NSPAIR(_ZN3aaa9GG1113323C1Ev),
  NSPAIR(_ZN3aaa9GG1113323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1113323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113323E[];
extern void _ZN3aaa9GG11133233fooEv();
extern void _ZN3aaa9GG11133233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11133233fooEv,_ZThn8_N3aaa9GG11133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133233fooEv,_ZThn20_N3aaa9GG11133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133233barEv,_ZThn20_N3aaa9GG11133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11133233fooEv,_ZThn28_N3aaa9GG11133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11133233barEv,_ZThn28_N3aaa9GG11133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11133233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11133233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11133233fooEv,_ZThn8_N3aaa9GG11133233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133233fooEv,_ZThn20_N3aaa9GG11133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133233barEv,_ZThn20_N3aaa9GG11133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133233fooEv,_ZThn28_N3aaa9GG11133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133233barEv,_ZThn28_N3aaa9GG11133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113323E[];
Class_Descriptor cd__ZN3aaa9GG1113323E = {  "_ZN3aaa9GG1113323E", // class name
  bases__ZN3aaa9GG1113323E, 6,
  &(vtc__ZN3aaa9GG1113323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113331  : ::aaa::EE111 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11133313fooEv
  ~GG1113331(); // tgen
  GG1113331(); // tgen
};
//SIG(1 _ZN3aaa9GG1113331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11133313fooEv");}
aaa::GG1113331 ::~GG1113331(){ note_dtor("_ZN3aaa9GG1113331E", this);} // tgen
aaa::GG1113331 ::GG1113331(){ note_ctor("_ZN3aaa9GG1113331E", this);} // tgen
}
static void Test__ZN3aaa9GG1113331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113331E, buf);
    ::aaa::GG1113331 *dp, &lv = *(dp=new (buf) ::aaa::GG1113331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113331E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1113331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1113331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1113331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113331E);
    dp->::aaa::GG1113331::~GG1113331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113331E(Test__ZN3aaa9GG1113331E, "_ZN3aaa9GG1113331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113331C1Ev();
extern void _ZN3aaa9GG1113331D1Ev();
Name_Map name_map__ZN3aaa9GG1113331E[] = {
  NSPAIR(_ZN3aaa9GG1113331C1Ev),
  NSPAIR(_ZN3aaa9GG1113331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1113331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113331E[];
extern void _ZN3aaa9GG11133313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11133313fooEv,_ZThn8_N3aaa9GG11133313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133313fooEv,_ZThn20_N3aaa9GG11133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11133313fooEv,_ZThn28_N3aaa9GG11133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11133313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11133313fooEv,_ZThn8_N3aaa9GG11133313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133313fooEv,_ZThn20_N3aaa9GG11133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133313fooEv,_ZThn28_N3aaa9GG11133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113331E[];
Class_Descriptor cd__ZN3aaa9GG1113331E = {  "_ZN3aaa9GG1113331E", // class name
  bases__ZN3aaa9GG1113331E, 6,
  &(vtc__ZN3aaa9GG1113331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113331E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113332  : ::aaa::EE111 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11133323barEv
  ~GG1113332(); // tgen
  GG1113332(); // tgen
};
//SIG(1 _ZN3aaa9GG1113332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1113332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11133323barEv");}
aaa::GG1113332 ::~GG1113332(){ note_dtor("_ZN3aaa9GG1113332E", this);} // tgen
aaa::GG1113332 ::GG1113332(){ note_ctor("_ZN3aaa9GG1113332E", this);} // tgen
}
static void Test__ZN3aaa9GG1113332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113332E, buf);
    ::aaa::GG1113332 *dp, &lv = *(dp=new (buf) ::aaa::GG1113332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113332E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1113332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1113332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1113332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113332E);
    dp->::aaa::GG1113332::~GG1113332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113332E(Test__ZN3aaa9GG1113332E, "_ZN3aaa9GG1113332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113332C1Ev();
extern void _ZN3aaa9GG1113332D1Ev();
Name_Map name_map__ZN3aaa9GG1113332E[] = {
  NSPAIR(_ZN3aaa9GG1113332C1Ev),
  NSPAIR(_ZN3aaa9GG1113332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1113332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113332E[];
extern void _ZN3aaa5EE1113fooEv();
extern void _ZN3aaa9GG11133323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11133323barEv,_ZThn20_N3aaa9GG11133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11133323barEv,_ZThn28_N3aaa9GG11133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11133323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1113fooEv,_ZThn8_N3aaa5EE1113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133323barEv,_ZThn20_N3aaa9GG11133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133323barEv,_ZThn28_N3aaa9GG11133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113332E[];
Class_Descriptor cd__ZN3aaa9GG1113332E = {  "_ZN3aaa9GG1113332E", // class name
  bases__ZN3aaa9GG1113332E, 6,
  &(vtc__ZN3aaa9GG1113332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1113333  : ::aaa::EE111 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11133333fooEv
  virtual void  bar(); // _ZN3aaa9GG11133333barEv
  ~GG1113333(); // tgen
  GG1113333(); // tgen
};
//SIG(1 _ZN3aaa9GG1113333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1113333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11133333fooEv");}
void  aaa::GG1113333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11133333barEv");}
aaa::GG1113333 ::~GG1113333(){ note_dtor("_ZN3aaa9GG1113333E", this);} // tgen
aaa::GG1113333 ::GG1113333(){ note_ctor("_ZN3aaa9GG1113333E", this);} // tgen
}
static void Test__ZN3aaa9GG1113333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1113333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1113333E, buf);
    ::aaa::GG1113333 *dp, &lv = *(dp=new (buf) ::aaa::GG1113333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1113333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1113333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE111*), 0, "_ZN3aaa9GG1113333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE111*), ABISELECT(16,8), "_ZN3aaa9GG1113333E");
    check_base_class_offset(lv, (::aaa::EE111*), 0, "_ZN3aaa9GG1113333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1113333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1113333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1113333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1113333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1113333E);
    dp->::aaa::GG1113333::~GG1113333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1113333E(Test__ZN3aaa9GG1113333E, "_ZN3aaa9GG1113333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1113333C1Ev();
extern void _ZN3aaa9GG1113333D1Ev();
Name_Map name_map__ZN3aaa9GG1113333E[] = {
  NSPAIR(_ZN3aaa9GG1113333C1Ev),
  NSPAIR(_ZN3aaa9GG1113333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE111E;
extern VTBL_ENTRY _ZTIN3aaa5EE111E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE111E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1113333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE111E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1113333E[];
extern void _ZN3aaa9GG11133333fooEv();
extern void _ZN3aaa9GG11133333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11133333fooEv,_ZThn8_N3aaa9GG11133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133333fooEv,_ZThn20_N3aaa9GG11133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11133333barEv,_ZThn20_N3aaa9GG11133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11133333fooEv,_ZThn28_N3aaa9GG11133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11133333barEv,_ZThn28_N3aaa9GG11133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1113333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11133333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11133333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11133333fooEv,_ZThn8_N3aaa9GG11133333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133333fooEv,_ZThn20_N3aaa9GG11133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11133333barEv,_ZThn20_N3aaa9GG11133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133333fooEv,_ZThn28_N3aaa9GG11133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11133333barEv,_ZThn28_N3aaa9GG11133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1113333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1113333E[];
Class_Descriptor cd__ZN3aaa9GG1113333E = {  "_ZN3aaa9GG1113333E", // class name
  bases__ZN3aaa9GG1113333E, 6,
  &(vtc__ZN3aaa9GG1113333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1113333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1113333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121111  : ::aaa::EE112 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11211113fooEv
  ~GG1121111(); // tgen
  GG1121111(); // tgen
};
//SIG(1 _ZN3aaa9GG1121111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11211113fooEv");}
aaa::GG1121111 ::~GG1121111(){ note_dtor("_ZN3aaa9GG1121111E", this);} // tgen
aaa::GG1121111 ::GG1121111(){ note_ctor("_ZN3aaa9GG1121111E", this);} // tgen
}
static void Test__ZN3aaa9GG1121111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121111E, buf);
    ::aaa::GG1121111 *dp, &lv = *(dp=new (buf) ::aaa::GG1121111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121111E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1121111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1121111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1121111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121111E);
    dp->::aaa::GG1121111::~GG1121111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121111E(Test__ZN3aaa9GG1121111E, "_ZN3aaa9GG1121111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121111C1Ev();
extern void _ZN3aaa9GG1121111D1Ev();
Name_Map name_map__ZN3aaa9GG1121111E[] = {
  NSPAIR(_ZN3aaa9GG1121111C1Ev),
  NSPAIR(_ZN3aaa9GG1121111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1121111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121111E[];
extern void _ZN3aaa9GG11211113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11211113fooEv,_ZThn8_N3aaa9GG11211113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11211113fooEv,_ZThn20_N3aaa9GG11211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11211113fooEv,_ZThn28_N3aaa9GG11211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11211113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11211113fooEv,_ZThn8_N3aaa9GG11211113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211113fooEv,_ZThn20_N3aaa9GG11211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11211113fooEv,_ZThn28_N3aaa9GG11211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121111E[];
Class_Descriptor cd__ZN3aaa9GG1121111E = {  "_ZN3aaa9GG1121111E", // class name
  bases__ZN3aaa9GG1121111E, 6,
  &(vtc__ZN3aaa9GG1121111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121112  : ::aaa::EE112 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11211123barEv
  ~GG1121112(); // tgen
  GG1121112(); // tgen
};
//SIG(1 _ZN3aaa9GG1121112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11211123barEv");}
aaa::GG1121112 ::~GG1121112(){ note_dtor("_ZN3aaa9GG1121112E", this);} // tgen
aaa::GG1121112 ::GG1121112(){ note_ctor("_ZN3aaa9GG1121112E", this);} // tgen
}
static void Test__ZN3aaa9GG1121112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121112E, buf);
    ::aaa::GG1121112 *dp, &lv = *(dp=new (buf) ::aaa::GG1121112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121112E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1121112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1121112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1121112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121112E);
    dp->::aaa::GG1121112::~GG1121112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121112E(Test__ZN3aaa9GG1121112E, "_ZN3aaa9GG1121112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121112C1Ev();
extern void _ZN3aaa9GG1121112D1Ev();
Name_Map name_map__ZN3aaa9GG1121112E[] = {
  NSPAIR(_ZN3aaa9GG1121112C1Ev),
  NSPAIR(_ZN3aaa9GG1121112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1121112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11211123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121112E[];
Class_Descriptor cd__ZN3aaa9GG1121112E = {  "_ZN3aaa9GG1121112E", // class name
  bases__ZN3aaa9GG1121112E, 6,
  &(vtc__ZN3aaa9GG1121112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121113  : ::aaa::EE112 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11211133fooEv
  virtual void  bar(); // _ZN3aaa9GG11211133barEv
  ~GG1121113(); // tgen
  GG1121113(); // tgen
};
//SIG(1 _ZN3aaa9GG1121113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11211133fooEv");}
void  aaa::GG1121113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11211133barEv");}
aaa::GG1121113 ::~GG1121113(){ note_dtor("_ZN3aaa9GG1121113E", this);} // tgen
aaa::GG1121113 ::GG1121113(){ note_ctor("_ZN3aaa9GG1121113E", this);} // tgen
}
static void Test__ZN3aaa9GG1121113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121113E, buf);
    ::aaa::GG1121113 *dp, &lv = *(dp=new (buf) ::aaa::GG1121113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121113E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1121113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1121113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1121113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121113E);
    dp->::aaa::GG1121113::~GG1121113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121113E(Test__ZN3aaa9GG1121113E, "_ZN3aaa9GG1121113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121113C1Ev();
extern void _ZN3aaa9GG1121113D1Ev();
Name_Map name_map__ZN3aaa9GG1121113E[] = {
  NSPAIR(_ZN3aaa9GG1121113C1Ev),
  NSPAIR(_ZN3aaa9GG1121113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1121113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121113E[];
extern void _ZN3aaa9GG11211133fooEv();
extern void _ZN3aaa9GG11211133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11211133fooEv,_ZThn8_N3aaa9GG11211133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11211133fooEv,_ZThn20_N3aaa9GG11211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11211133fooEv,_ZThn28_N3aaa9GG11211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11211133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11211133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11211133fooEv,_ZThn8_N3aaa9GG11211133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211133fooEv,_ZThn20_N3aaa9GG11211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11211133fooEv,_ZThn28_N3aaa9GG11211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121113E[];
Class_Descriptor cd__ZN3aaa9GG1121113E = {  "_ZN3aaa9GG1121113E", // class name
  bases__ZN3aaa9GG1121113E, 6,
  &(vtc__ZN3aaa9GG1121113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121121  : ::aaa::EE112 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11211213fooEv
  ~GG1121121(); // tgen
  GG1121121(); // tgen
};
//SIG(1 _ZN3aaa9GG1121121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11211213fooEv");}
aaa::GG1121121 ::~GG1121121(){ note_dtor("_ZN3aaa9GG1121121E", this);} // tgen
aaa::GG1121121 ::GG1121121(){ note_ctor("_ZN3aaa9GG1121121E", this);} // tgen
}
static void Test__ZN3aaa9GG1121121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121121E, buf);
    ::aaa::GG1121121 *dp, &lv = *(dp=new (buf) ::aaa::GG1121121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121121E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1121121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1121121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1121121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121121E);
    dp->::aaa::GG1121121::~GG1121121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121121E(Test__ZN3aaa9GG1121121E, "_ZN3aaa9GG1121121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121121C1Ev();
extern void _ZN3aaa9GG1121121D1Ev();
Name_Map name_map__ZN3aaa9GG1121121E[] = {
  NSPAIR(_ZN3aaa9GG1121121C1Ev),
  NSPAIR(_ZN3aaa9GG1121121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1121121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121121E[];
extern void _ZN3aaa9GG11211213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11211213fooEv,_ZThn8_N3aaa9GG11211213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11211213fooEv,_ZThn20_N3aaa9GG11211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11211213fooEv,_ZThn28_N3aaa9GG11211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11211213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11211213fooEv,_ZThn8_N3aaa9GG11211213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211213fooEv,_ZThn20_N3aaa9GG11211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11211213fooEv,_ZThn28_N3aaa9GG11211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121121E[];
Class_Descriptor cd__ZN3aaa9GG1121121E = {  "_ZN3aaa9GG1121121E", // class name
  bases__ZN3aaa9GG1121121E, 6,
  &(vtc__ZN3aaa9GG1121121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121122  : ::aaa::EE112 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11211223barEv
  ~GG1121122(); // tgen
  GG1121122(); // tgen
};
//SIG(1 _ZN3aaa9GG1121122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11211223barEv");}
aaa::GG1121122 ::~GG1121122(){ note_dtor("_ZN3aaa9GG1121122E", this);} // tgen
aaa::GG1121122 ::GG1121122(){ note_ctor("_ZN3aaa9GG1121122E", this);} // tgen
}
static void Test__ZN3aaa9GG1121122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121122E, buf);
    ::aaa::GG1121122 *dp, &lv = *(dp=new (buf) ::aaa::GG1121122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121122E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1121122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1121122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1121122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121122E);
    dp->::aaa::GG1121122::~GG1121122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121122E(Test__ZN3aaa9GG1121122E, "_ZN3aaa9GG1121122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121122C1Ev();
extern void _ZN3aaa9GG1121122D1Ev();
Name_Map name_map__ZN3aaa9GG1121122E[] = {
  NSPAIR(_ZN3aaa9GG1121122C1Ev),
  NSPAIR(_ZN3aaa9GG1121122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1121122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11211223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11211223barEv,_ZThn20_N3aaa9GG11211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211223barEv,_ZThn20_N3aaa9GG11211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121122E[];
Class_Descriptor cd__ZN3aaa9GG1121122E = {  "_ZN3aaa9GG1121122E", // class name
  bases__ZN3aaa9GG1121122E, 6,
  &(vtc__ZN3aaa9GG1121122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121123  : ::aaa::EE112 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11211233fooEv
  virtual void  bar(); // _ZN3aaa9GG11211233barEv
  ~GG1121123(); // tgen
  GG1121123(); // tgen
};
//SIG(1 _ZN3aaa9GG1121123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11211233fooEv");}
void  aaa::GG1121123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11211233barEv");}
aaa::GG1121123 ::~GG1121123(){ note_dtor("_ZN3aaa9GG1121123E", this);} // tgen
aaa::GG1121123 ::GG1121123(){ note_ctor("_ZN3aaa9GG1121123E", this);} // tgen
}
static void Test__ZN3aaa9GG1121123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121123E, buf);
    ::aaa::GG1121123 *dp, &lv = *(dp=new (buf) ::aaa::GG1121123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121123E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1121123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1121123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1121123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121123E);
    dp->::aaa::GG1121123::~GG1121123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121123E(Test__ZN3aaa9GG1121123E, "_ZN3aaa9GG1121123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121123C1Ev();
extern void _ZN3aaa9GG1121123D1Ev();
Name_Map name_map__ZN3aaa9GG1121123E[] = {
  NSPAIR(_ZN3aaa9GG1121123C1Ev),
  NSPAIR(_ZN3aaa9GG1121123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1121123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121123E[];
extern void _ZN3aaa9GG11211233fooEv();
extern void _ZN3aaa9GG11211233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11211233fooEv,_ZThn8_N3aaa9GG11211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11211233fooEv,_ZThn20_N3aaa9GG11211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11211233barEv,_ZThn20_N3aaa9GG11211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11211233fooEv,_ZThn28_N3aaa9GG11211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11211233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11211233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11211233fooEv,_ZThn8_N3aaa9GG11211233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211233fooEv,_ZThn20_N3aaa9GG11211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211233barEv,_ZThn20_N3aaa9GG11211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11211233fooEv,_ZThn28_N3aaa9GG11211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121123E[];
Class_Descriptor cd__ZN3aaa9GG1121123E = {  "_ZN3aaa9GG1121123E", // class name
  bases__ZN3aaa9GG1121123E, 6,
  &(vtc__ZN3aaa9GG1121123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121131  : ::aaa::EE112 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11211313fooEv
  ~GG1121131(); // tgen
  GG1121131(); // tgen
};
//SIG(1 _ZN3aaa9GG1121131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11211313fooEv");}
aaa::GG1121131 ::~GG1121131(){ note_dtor("_ZN3aaa9GG1121131E", this);} // tgen
aaa::GG1121131 ::GG1121131(){ note_ctor("_ZN3aaa9GG1121131E", this);} // tgen
}
static void Test__ZN3aaa9GG1121131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121131E, buf);
    ::aaa::GG1121131 *dp, &lv = *(dp=new (buf) ::aaa::GG1121131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121131E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1121131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1121131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1121131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121131E);
    dp->::aaa::GG1121131::~GG1121131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121131E(Test__ZN3aaa9GG1121131E, "_ZN3aaa9GG1121131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121131C1Ev();
extern void _ZN3aaa9GG1121131D1Ev();
Name_Map name_map__ZN3aaa9GG1121131E[] = {
  NSPAIR(_ZN3aaa9GG1121131C1Ev),
  NSPAIR(_ZN3aaa9GG1121131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1121131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121131E[];
extern void _ZN3aaa9GG11211313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11211313fooEv,_ZThn8_N3aaa9GG11211313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11211313fooEv,_ZThn20_N3aaa9GG11211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11211313fooEv,_ZThn28_N3aaa9GG11211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11211313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11211313fooEv,_ZThn8_N3aaa9GG11211313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211313fooEv,_ZThn20_N3aaa9GG11211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11211313fooEv,_ZThn28_N3aaa9GG11211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121131E[];
Class_Descriptor cd__ZN3aaa9GG1121131E = {  "_ZN3aaa9GG1121131E", // class name
  bases__ZN3aaa9GG1121131E, 6,
  &(vtc__ZN3aaa9GG1121131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121132  : ::aaa::EE112 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11211323barEv
  ~GG1121132(); // tgen
  GG1121132(); // tgen
};
//SIG(1 _ZN3aaa9GG1121132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11211323barEv");}
aaa::GG1121132 ::~GG1121132(){ note_dtor("_ZN3aaa9GG1121132E", this);} // tgen
aaa::GG1121132 ::GG1121132(){ note_ctor("_ZN3aaa9GG1121132E", this);} // tgen
}
static void Test__ZN3aaa9GG1121132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121132E, buf);
    ::aaa::GG1121132 *dp, &lv = *(dp=new (buf) ::aaa::GG1121132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121132E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1121132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1121132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1121132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121132E);
    dp->::aaa::GG1121132::~GG1121132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121132E(Test__ZN3aaa9GG1121132E, "_ZN3aaa9GG1121132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121132C1Ev();
extern void _ZN3aaa9GG1121132D1Ev();
Name_Map name_map__ZN3aaa9GG1121132E[] = {
  NSPAIR(_ZN3aaa9GG1121132C1Ev),
  NSPAIR(_ZN3aaa9GG1121132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1121132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11211323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11211323barEv,_ZThn20_N3aaa9GG11211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211323barEv,_ZThn20_N3aaa9GG11211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121132E[];
Class_Descriptor cd__ZN3aaa9GG1121132E = {  "_ZN3aaa9GG1121132E", // class name
  bases__ZN3aaa9GG1121132E, 6,
  &(vtc__ZN3aaa9GG1121132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121133  : ::aaa::EE112 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11211333fooEv
  virtual void  bar(); // _ZN3aaa9GG11211333barEv
  ~GG1121133(); // tgen
  GG1121133(); // tgen
};
//SIG(1 _ZN3aaa9GG1121133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11211333fooEv");}
void  aaa::GG1121133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11211333barEv");}
aaa::GG1121133 ::~GG1121133(){ note_dtor("_ZN3aaa9GG1121133E", this);} // tgen
aaa::GG1121133 ::GG1121133(){ note_ctor("_ZN3aaa9GG1121133E", this);} // tgen
}
static void Test__ZN3aaa9GG1121133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121133E, buf);
    ::aaa::GG1121133 *dp, &lv = *(dp=new (buf) ::aaa::GG1121133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121133E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1121133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1121133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1121133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121133E);
    dp->::aaa::GG1121133::~GG1121133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121133E(Test__ZN3aaa9GG1121133E, "_ZN3aaa9GG1121133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121133C1Ev();
extern void _ZN3aaa9GG1121133D1Ev();
Name_Map name_map__ZN3aaa9GG1121133E[] = {
  NSPAIR(_ZN3aaa9GG1121133C1Ev),
  NSPAIR(_ZN3aaa9GG1121133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1121133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121133E[];
extern void _ZN3aaa9GG11211333fooEv();
extern void _ZN3aaa9GG11211333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11211333fooEv,_ZThn8_N3aaa9GG11211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11211333fooEv,_ZThn20_N3aaa9GG11211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11211333barEv,_ZThn20_N3aaa9GG11211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11211333fooEv,_ZThn28_N3aaa9GG11211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11211333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11211333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11211333fooEv,_ZThn8_N3aaa9GG11211333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211333fooEv,_ZThn20_N3aaa9GG11211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11211333barEv,_ZThn20_N3aaa9GG11211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11211333fooEv,_ZThn28_N3aaa9GG11211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121133E[];
Class_Descriptor cd__ZN3aaa9GG1121133E = {  "_ZN3aaa9GG1121133E", // class name
  bases__ZN3aaa9GG1121133E, 6,
  &(vtc__ZN3aaa9GG1121133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121211  : ::aaa::EE112 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11212113fooEv
  ~GG1121211(); // tgen
  GG1121211(); // tgen
};
//SIG(1 _ZN3aaa9GG1121211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11212113fooEv");}
aaa::GG1121211 ::~GG1121211(){ note_dtor("_ZN3aaa9GG1121211E", this);} // tgen
aaa::GG1121211 ::GG1121211(){ note_ctor("_ZN3aaa9GG1121211E", this);} // tgen
}
static void Test__ZN3aaa9GG1121211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121211E, buf);
    ::aaa::GG1121211 *dp, &lv = *(dp=new (buf) ::aaa::GG1121211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121211E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1121211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1121211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1121211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121211E);
    dp->::aaa::GG1121211::~GG1121211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121211E(Test__ZN3aaa9GG1121211E, "_ZN3aaa9GG1121211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121211C1Ev();
extern void _ZN3aaa9GG1121211D1Ev();
Name_Map name_map__ZN3aaa9GG1121211E[] = {
  NSPAIR(_ZN3aaa9GG1121211C1Ev),
  NSPAIR(_ZN3aaa9GG1121211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1121211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121211E[];
extern void _ZN3aaa9GG11212113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11212113fooEv,_ZThn8_N3aaa9GG11212113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11212113fooEv,_ZThn20_N3aaa9GG11212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11212113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11212113fooEv,_ZThn8_N3aaa9GG11212113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212113fooEv,_ZThn20_N3aaa9GG11212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121211E[];
Class_Descriptor cd__ZN3aaa9GG1121211E = {  "_ZN3aaa9GG1121211E", // class name
  bases__ZN3aaa9GG1121211E, 6,
  &(vtc__ZN3aaa9GG1121211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121212  : ::aaa::EE112 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11212123barEv
  ~GG1121212(); // tgen
  GG1121212(); // tgen
};
//SIG(1 _ZN3aaa9GG1121212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11212123barEv");}
aaa::GG1121212 ::~GG1121212(){ note_dtor("_ZN3aaa9GG1121212E", this);} // tgen
aaa::GG1121212 ::GG1121212(){ note_ctor("_ZN3aaa9GG1121212E", this);} // tgen
}
static void Test__ZN3aaa9GG1121212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121212E, buf);
    ::aaa::GG1121212 *dp, &lv = *(dp=new (buf) ::aaa::GG1121212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121212E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1121212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1121212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1121212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121212E);
    dp->::aaa::GG1121212::~GG1121212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121212E(Test__ZN3aaa9GG1121212E, "_ZN3aaa9GG1121212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121212C1Ev();
extern void _ZN3aaa9GG1121212D1Ev();
Name_Map name_map__ZN3aaa9GG1121212E[] = {
  NSPAIR(_ZN3aaa9GG1121212C1Ev),
  NSPAIR(_ZN3aaa9GG1121212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1121212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11212123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11212123barEv,_ZThn28_N3aaa9GG11212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11212123barEv,_ZThn28_N3aaa9GG11212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121212E[];
Class_Descriptor cd__ZN3aaa9GG1121212E = {  "_ZN3aaa9GG1121212E", // class name
  bases__ZN3aaa9GG1121212E, 6,
  &(vtc__ZN3aaa9GG1121212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121213  : ::aaa::EE112 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11212133fooEv
  virtual void  bar(); // _ZN3aaa9GG11212133barEv
  ~GG1121213(); // tgen
  GG1121213(); // tgen
};
//SIG(1 _ZN3aaa9GG1121213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11212133fooEv");}
void  aaa::GG1121213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11212133barEv");}
aaa::GG1121213 ::~GG1121213(){ note_dtor("_ZN3aaa9GG1121213E", this);} // tgen
aaa::GG1121213 ::GG1121213(){ note_ctor("_ZN3aaa9GG1121213E", this);} // tgen
}
static void Test__ZN3aaa9GG1121213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121213E, buf);
    ::aaa::GG1121213 *dp, &lv = *(dp=new (buf) ::aaa::GG1121213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121213E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1121213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1121213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1121213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121213E);
    dp->::aaa::GG1121213::~GG1121213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121213E(Test__ZN3aaa9GG1121213E, "_ZN3aaa9GG1121213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121213C1Ev();
extern void _ZN3aaa9GG1121213D1Ev();
Name_Map name_map__ZN3aaa9GG1121213E[] = {
  NSPAIR(_ZN3aaa9GG1121213C1Ev),
  NSPAIR(_ZN3aaa9GG1121213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1121213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121213E[];
extern void _ZN3aaa9GG11212133fooEv();
extern void _ZN3aaa9GG11212133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11212133fooEv,_ZThn8_N3aaa9GG11212133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11212133fooEv,_ZThn20_N3aaa9GG11212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11212133barEv,_ZThn28_N3aaa9GG11212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11212133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11212133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11212133fooEv,_ZThn8_N3aaa9GG11212133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212133fooEv,_ZThn20_N3aaa9GG11212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11212133barEv,_ZThn28_N3aaa9GG11212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121213E[];
Class_Descriptor cd__ZN3aaa9GG1121213E = {  "_ZN3aaa9GG1121213E", // class name
  bases__ZN3aaa9GG1121213E, 6,
  &(vtc__ZN3aaa9GG1121213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121221  : ::aaa::EE112 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11212213fooEv
  ~GG1121221(); // tgen
  GG1121221(); // tgen
};
//SIG(1 _ZN3aaa9GG1121221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11212213fooEv");}
aaa::GG1121221 ::~GG1121221(){ note_dtor("_ZN3aaa9GG1121221E", this);} // tgen
aaa::GG1121221 ::GG1121221(){ note_ctor("_ZN3aaa9GG1121221E", this);} // tgen
}
static void Test__ZN3aaa9GG1121221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121221E, buf);
    ::aaa::GG1121221 *dp, &lv = *(dp=new (buf) ::aaa::GG1121221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121221E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1121221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1121221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1121221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121221E);
    dp->::aaa::GG1121221::~GG1121221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121221E(Test__ZN3aaa9GG1121221E, "_ZN3aaa9GG1121221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121221C1Ev();
extern void _ZN3aaa9GG1121221D1Ev();
Name_Map name_map__ZN3aaa9GG1121221E[] = {
  NSPAIR(_ZN3aaa9GG1121221C1Ev),
  NSPAIR(_ZN3aaa9GG1121221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1121221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121221E[];
extern void _ZN3aaa9GG11212213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11212213fooEv,_ZThn8_N3aaa9GG11212213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11212213fooEv,_ZThn20_N3aaa9GG11212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11212213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11212213fooEv,_ZThn8_N3aaa9GG11212213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212213fooEv,_ZThn20_N3aaa9GG11212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121221E[];
Class_Descriptor cd__ZN3aaa9GG1121221E = {  "_ZN3aaa9GG1121221E", // class name
  bases__ZN3aaa9GG1121221E, 6,
  &(vtc__ZN3aaa9GG1121221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121222  : ::aaa::EE112 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11212223barEv
  ~GG1121222(); // tgen
  GG1121222(); // tgen
};
//SIG(1 _ZN3aaa9GG1121222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11212223barEv");}
aaa::GG1121222 ::~GG1121222(){ note_dtor("_ZN3aaa9GG1121222E", this);} // tgen
aaa::GG1121222 ::GG1121222(){ note_ctor("_ZN3aaa9GG1121222E", this);} // tgen
}
static void Test__ZN3aaa9GG1121222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121222E, buf);
    ::aaa::GG1121222 *dp, &lv = *(dp=new (buf) ::aaa::GG1121222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121222E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1121222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1121222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1121222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121222E);
    dp->::aaa::GG1121222::~GG1121222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121222E(Test__ZN3aaa9GG1121222E, "_ZN3aaa9GG1121222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121222C1Ev();
extern void _ZN3aaa9GG1121222D1Ev();
Name_Map name_map__ZN3aaa9GG1121222E[] = {
  NSPAIR(_ZN3aaa9GG1121222C1Ev),
  NSPAIR(_ZN3aaa9GG1121222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1121222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11212223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11212223barEv,_ZThn20_N3aaa9GG11212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11212223barEv,_ZThn28_N3aaa9GG11212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212223barEv,_ZThn20_N3aaa9GG11212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11212223barEv,_ZThn28_N3aaa9GG11212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121222E[];
Class_Descriptor cd__ZN3aaa9GG1121222E = {  "_ZN3aaa9GG1121222E", // class name
  bases__ZN3aaa9GG1121222E, 6,
  &(vtc__ZN3aaa9GG1121222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121223  : ::aaa::EE112 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11212233fooEv
  virtual void  bar(); // _ZN3aaa9GG11212233barEv
  ~GG1121223(); // tgen
  GG1121223(); // tgen
};
//SIG(1 _ZN3aaa9GG1121223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11212233fooEv");}
void  aaa::GG1121223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11212233barEv");}
aaa::GG1121223 ::~GG1121223(){ note_dtor("_ZN3aaa9GG1121223E", this);} // tgen
aaa::GG1121223 ::GG1121223(){ note_ctor("_ZN3aaa9GG1121223E", this);} // tgen
}
static void Test__ZN3aaa9GG1121223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121223E, buf);
    ::aaa::GG1121223 *dp, &lv = *(dp=new (buf) ::aaa::GG1121223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121223E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1121223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1121223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1121223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121223E);
    dp->::aaa::GG1121223::~GG1121223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121223E(Test__ZN3aaa9GG1121223E, "_ZN3aaa9GG1121223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121223C1Ev();
extern void _ZN3aaa9GG1121223D1Ev();
Name_Map name_map__ZN3aaa9GG1121223E[] = {
  NSPAIR(_ZN3aaa9GG1121223C1Ev),
  NSPAIR(_ZN3aaa9GG1121223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1121223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121223E[];
extern void _ZN3aaa9GG11212233fooEv();
extern void _ZN3aaa9GG11212233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11212233fooEv,_ZThn8_N3aaa9GG11212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11212233fooEv,_ZThn20_N3aaa9GG11212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11212233barEv,_ZThn20_N3aaa9GG11212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11212233barEv,_ZThn28_N3aaa9GG11212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11212233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11212233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11212233fooEv,_ZThn8_N3aaa9GG11212233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212233fooEv,_ZThn20_N3aaa9GG11212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212233barEv,_ZThn20_N3aaa9GG11212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11212233barEv,_ZThn28_N3aaa9GG11212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121223E[];
Class_Descriptor cd__ZN3aaa9GG1121223E = {  "_ZN3aaa9GG1121223E", // class name
  bases__ZN3aaa9GG1121223E, 6,
  &(vtc__ZN3aaa9GG1121223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121231  : ::aaa::EE112 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11212313fooEv
  ~GG1121231(); // tgen
  GG1121231(); // tgen
};
//SIG(1 _ZN3aaa9GG1121231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11212313fooEv");}
aaa::GG1121231 ::~GG1121231(){ note_dtor("_ZN3aaa9GG1121231E", this);} // tgen
aaa::GG1121231 ::GG1121231(){ note_ctor("_ZN3aaa9GG1121231E", this);} // tgen
}
static void Test__ZN3aaa9GG1121231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121231E, buf);
    ::aaa::GG1121231 *dp, &lv = *(dp=new (buf) ::aaa::GG1121231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121231E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1121231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1121231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1121231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121231E);
    dp->::aaa::GG1121231::~GG1121231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121231E(Test__ZN3aaa9GG1121231E, "_ZN3aaa9GG1121231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121231C1Ev();
extern void _ZN3aaa9GG1121231D1Ev();
Name_Map name_map__ZN3aaa9GG1121231E[] = {
  NSPAIR(_ZN3aaa9GG1121231C1Ev),
  NSPAIR(_ZN3aaa9GG1121231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1121231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121231E[];
extern void _ZN3aaa9GG11212313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11212313fooEv,_ZThn8_N3aaa9GG11212313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11212313fooEv,_ZThn20_N3aaa9GG11212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11212313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11212313fooEv,_ZThn8_N3aaa9GG11212313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212313fooEv,_ZThn20_N3aaa9GG11212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121231E[];
Class_Descriptor cd__ZN3aaa9GG1121231E = {  "_ZN3aaa9GG1121231E", // class name
  bases__ZN3aaa9GG1121231E, 6,
  &(vtc__ZN3aaa9GG1121231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121232  : ::aaa::EE112 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11212323barEv
  ~GG1121232(); // tgen
  GG1121232(); // tgen
};
//SIG(1 _ZN3aaa9GG1121232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11212323barEv");}
aaa::GG1121232 ::~GG1121232(){ note_dtor("_ZN3aaa9GG1121232E", this);} // tgen
aaa::GG1121232 ::GG1121232(){ note_ctor("_ZN3aaa9GG1121232E", this);} // tgen
}
static void Test__ZN3aaa9GG1121232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121232E, buf);
    ::aaa::GG1121232 *dp, &lv = *(dp=new (buf) ::aaa::GG1121232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121232E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1121232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1121232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1121232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121232E);
    dp->::aaa::GG1121232::~GG1121232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121232E(Test__ZN3aaa9GG1121232E, "_ZN3aaa9GG1121232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121232C1Ev();
extern void _ZN3aaa9GG1121232D1Ev();
Name_Map name_map__ZN3aaa9GG1121232E[] = {
  NSPAIR(_ZN3aaa9GG1121232C1Ev),
  NSPAIR(_ZN3aaa9GG1121232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1121232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11212323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11212323barEv,_ZThn20_N3aaa9GG11212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11212323barEv,_ZThn28_N3aaa9GG11212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212323barEv,_ZThn20_N3aaa9GG11212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11212323barEv,_ZThn28_N3aaa9GG11212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121232E[];
Class_Descriptor cd__ZN3aaa9GG1121232E = {  "_ZN3aaa9GG1121232E", // class name
  bases__ZN3aaa9GG1121232E, 6,
  &(vtc__ZN3aaa9GG1121232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121233  : ::aaa::EE112 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11212333fooEv
  virtual void  bar(); // _ZN3aaa9GG11212333barEv
  ~GG1121233(); // tgen
  GG1121233(); // tgen
};
//SIG(1 _ZN3aaa9GG1121233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11212333fooEv");}
void  aaa::GG1121233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11212333barEv");}
aaa::GG1121233 ::~GG1121233(){ note_dtor("_ZN3aaa9GG1121233E", this);} // tgen
aaa::GG1121233 ::GG1121233(){ note_ctor("_ZN3aaa9GG1121233E", this);} // tgen
}
static void Test__ZN3aaa9GG1121233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121233E, buf);
    ::aaa::GG1121233 *dp, &lv = *(dp=new (buf) ::aaa::GG1121233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121233E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1121233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1121233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1121233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121233E);
    dp->::aaa::GG1121233::~GG1121233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121233E(Test__ZN3aaa9GG1121233E, "_ZN3aaa9GG1121233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121233C1Ev();
extern void _ZN3aaa9GG1121233D1Ev();
Name_Map name_map__ZN3aaa9GG1121233E[] = {
  NSPAIR(_ZN3aaa9GG1121233C1Ev),
  NSPAIR(_ZN3aaa9GG1121233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1121233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121233E[];
extern void _ZN3aaa9GG11212333fooEv();
extern void _ZN3aaa9GG11212333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11212333fooEv,_ZThn8_N3aaa9GG11212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11212333fooEv,_ZThn20_N3aaa9GG11212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11212333barEv,_ZThn20_N3aaa9GG11212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11212333barEv,_ZThn28_N3aaa9GG11212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11212333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11212333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11212333fooEv,_ZThn8_N3aaa9GG11212333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212333fooEv,_ZThn20_N3aaa9GG11212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11212333barEv,_ZThn20_N3aaa9GG11212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11212333barEv,_ZThn28_N3aaa9GG11212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121233E[];
Class_Descriptor cd__ZN3aaa9GG1121233E = {  "_ZN3aaa9GG1121233E", // class name
  bases__ZN3aaa9GG1121233E, 6,
  &(vtc__ZN3aaa9GG1121233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121311  : ::aaa::EE112 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11213113fooEv
  ~GG1121311(); // tgen
  GG1121311(); // tgen
};
//SIG(1 _ZN3aaa9GG1121311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11213113fooEv");}
aaa::GG1121311 ::~GG1121311(){ note_dtor("_ZN3aaa9GG1121311E", this);} // tgen
aaa::GG1121311 ::GG1121311(){ note_ctor("_ZN3aaa9GG1121311E", this);} // tgen
}
static void Test__ZN3aaa9GG1121311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121311E, buf);
    ::aaa::GG1121311 *dp, &lv = *(dp=new (buf) ::aaa::GG1121311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121311E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1121311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1121311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1121311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121311E);
    dp->::aaa::GG1121311::~GG1121311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121311E(Test__ZN3aaa9GG1121311E, "_ZN3aaa9GG1121311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121311C1Ev();
extern void _ZN3aaa9GG1121311D1Ev();
Name_Map name_map__ZN3aaa9GG1121311E[] = {
  NSPAIR(_ZN3aaa9GG1121311C1Ev),
  NSPAIR(_ZN3aaa9GG1121311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1121311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121311E[];
extern void _ZN3aaa9GG11213113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11213113fooEv,_ZThn8_N3aaa9GG11213113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11213113fooEv,_ZThn20_N3aaa9GG11213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213113fooEv,_ZThn28_N3aaa9GG11213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11213113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11213113fooEv,_ZThn8_N3aaa9GG11213113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213113fooEv,_ZThn20_N3aaa9GG11213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213113fooEv,_ZThn28_N3aaa9GG11213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121311E[];
Class_Descriptor cd__ZN3aaa9GG1121311E = {  "_ZN3aaa9GG1121311E", // class name
  bases__ZN3aaa9GG1121311E, 6,
  &(vtc__ZN3aaa9GG1121311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121312  : ::aaa::EE112 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11213123barEv
  ~GG1121312(); // tgen
  GG1121312(); // tgen
};
//SIG(1 _ZN3aaa9GG1121312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11213123barEv");}
aaa::GG1121312 ::~GG1121312(){ note_dtor("_ZN3aaa9GG1121312E", this);} // tgen
aaa::GG1121312 ::GG1121312(){ note_ctor("_ZN3aaa9GG1121312E", this);} // tgen
}
static void Test__ZN3aaa9GG1121312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121312E, buf);
    ::aaa::GG1121312 *dp, &lv = *(dp=new (buf) ::aaa::GG1121312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121312E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1121312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1121312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1121312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121312E);
    dp->::aaa::GG1121312::~GG1121312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121312E(Test__ZN3aaa9GG1121312E, "_ZN3aaa9GG1121312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121312C1Ev();
extern void _ZN3aaa9GG1121312D1Ev();
Name_Map name_map__ZN3aaa9GG1121312E[] = {
  NSPAIR(_ZN3aaa9GG1121312C1Ev),
  NSPAIR(_ZN3aaa9GG1121312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1121312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11213123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213123barEv,_ZThn28_N3aaa9GG11213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213123barEv,_ZThn28_N3aaa9GG11213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121312E[];
Class_Descriptor cd__ZN3aaa9GG1121312E = {  "_ZN3aaa9GG1121312E", // class name
  bases__ZN3aaa9GG1121312E, 6,
  &(vtc__ZN3aaa9GG1121312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121313  : ::aaa::EE112 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11213133fooEv
  virtual void  bar(); // _ZN3aaa9GG11213133barEv
  ~GG1121313(); // tgen
  GG1121313(); // tgen
};
//SIG(1 _ZN3aaa9GG1121313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11213133fooEv");}
void  aaa::GG1121313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11213133barEv");}
aaa::GG1121313 ::~GG1121313(){ note_dtor("_ZN3aaa9GG1121313E", this);} // tgen
aaa::GG1121313 ::GG1121313(){ note_ctor("_ZN3aaa9GG1121313E", this);} // tgen
}
static void Test__ZN3aaa9GG1121313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121313E, buf);
    ::aaa::GG1121313 *dp, &lv = *(dp=new (buf) ::aaa::GG1121313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121313E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1121313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1121313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1121313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121313E);
    dp->::aaa::GG1121313::~GG1121313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121313E(Test__ZN3aaa9GG1121313E, "_ZN3aaa9GG1121313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121313C1Ev();
extern void _ZN3aaa9GG1121313D1Ev();
Name_Map name_map__ZN3aaa9GG1121313E[] = {
  NSPAIR(_ZN3aaa9GG1121313C1Ev),
  NSPAIR(_ZN3aaa9GG1121313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1121313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121313E[];
extern void _ZN3aaa9GG11213133fooEv();
extern void _ZN3aaa9GG11213133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11213133fooEv,_ZThn8_N3aaa9GG11213133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11213133fooEv,_ZThn20_N3aaa9GG11213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213133fooEv,_ZThn28_N3aaa9GG11213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213133barEv,_ZThn28_N3aaa9GG11213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11213133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11213133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11213133fooEv,_ZThn8_N3aaa9GG11213133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213133fooEv,_ZThn20_N3aaa9GG11213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213133fooEv,_ZThn28_N3aaa9GG11213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213133barEv,_ZThn28_N3aaa9GG11213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121313E[];
Class_Descriptor cd__ZN3aaa9GG1121313E = {  "_ZN3aaa9GG1121313E", // class name
  bases__ZN3aaa9GG1121313E, 6,
  &(vtc__ZN3aaa9GG1121313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121321  : ::aaa::EE112 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11213213fooEv
  ~GG1121321(); // tgen
  GG1121321(); // tgen
};
//SIG(1 _ZN3aaa9GG1121321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11213213fooEv");}
aaa::GG1121321 ::~GG1121321(){ note_dtor("_ZN3aaa9GG1121321E", this);} // tgen
aaa::GG1121321 ::GG1121321(){ note_ctor("_ZN3aaa9GG1121321E", this);} // tgen
}
static void Test__ZN3aaa9GG1121321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121321E, buf);
    ::aaa::GG1121321 *dp, &lv = *(dp=new (buf) ::aaa::GG1121321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121321E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1121321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1121321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1121321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121321E);
    dp->::aaa::GG1121321::~GG1121321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121321E(Test__ZN3aaa9GG1121321E, "_ZN3aaa9GG1121321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121321C1Ev();
extern void _ZN3aaa9GG1121321D1Ev();
Name_Map name_map__ZN3aaa9GG1121321E[] = {
  NSPAIR(_ZN3aaa9GG1121321C1Ev),
  NSPAIR(_ZN3aaa9GG1121321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1121321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121321E[];
extern void _ZN3aaa9GG11213213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11213213fooEv,_ZThn8_N3aaa9GG11213213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11213213fooEv,_ZThn20_N3aaa9GG11213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11213213fooEv,_ZThn28_N3aaa9GG11213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11213213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11213213fooEv,_ZThn8_N3aaa9GG11213213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213213fooEv,_ZThn20_N3aaa9GG11213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213213fooEv,_ZThn28_N3aaa9GG11213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121321E[];
Class_Descriptor cd__ZN3aaa9GG1121321E = {  "_ZN3aaa9GG1121321E", // class name
  bases__ZN3aaa9GG1121321E, 6,
  &(vtc__ZN3aaa9GG1121321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121322  : ::aaa::EE112 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11213223barEv
  ~GG1121322(); // tgen
  GG1121322(); // tgen
};
//SIG(1 _ZN3aaa9GG1121322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11213223barEv");}
aaa::GG1121322 ::~GG1121322(){ note_dtor("_ZN3aaa9GG1121322E", this);} // tgen
aaa::GG1121322 ::GG1121322(){ note_ctor("_ZN3aaa9GG1121322E", this);} // tgen
}
static void Test__ZN3aaa9GG1121322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121322E, buf);
    ::aaa::GG1121322 *dp, &lv = *(dp=new (buf) ::aaa::GG1121322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121322E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1121322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1121322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1121322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121322E);
    dp->::aaa::GG1121322::~GG1121322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121322E(Test__ZN3aaa9GG1121322E, "_ZN3aaa9GG1121322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121322C1Ev();
extern void _ZN3aaa9GG1121322D1Ev();
Name_Map name_map__ZN3aaa9GG1121322E[] = {
  NSPAIR(_ZN3aaa9GG1121322C1Ev),
  NSPAIR(_ZN3aaa9GG1121322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1121322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11213223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11213223barEv,_ZThn20_N3aaa9GG11213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11213223barEv,_ZThn28_N3aaa9GG11213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213223barEv,_ZThn20_N3aaa9GG11213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213223barEv,_ZThn28_N3aaa9GG11213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121322E[];
Class_Descriptor cd__ZN3aaa9GG1121322E = {  "_ZN3aaa9GG1121322E", // class name
  bases__ZN3aaa9GG1121322E, 6,
  &(vtc__ZN3aaa9GG1121322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121323  : ::aaa::EE112 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11213233fooEv
  virtual void  bar(); // _ZN3aaa9GG11213233barEv
  ~GG1121323(); // tgen
  GG1121323(); // tgen
};
//SIG(1 _ZN3aaa9GG1121323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11213233fooEv");}
void  aaa::GG1121323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11213233barEv");}
aaa::GG1121323 ::~GG1121323(){ note_dtor("_ZN3aaa9GG1121323E", this);} // tgen
aaa::GG1121323 ::GG1121323(){ note_ctor("_ZN3aaa9GG1121323E", this);} // tgen
}
static void Test__ZN3aaa9GG1121323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121323E, buf);
    ::aaa::GG1121323 *dp, &lv = *(dp=new (buf) ::aaa::GG1121323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121323E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1121323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1121323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1121323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121323E);
    dp->::aaa::GG1121323::~GG1121323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121323E(Test__ZN3aaa9GG1121323E, "_ZN3aaa9GG1121323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121323C1Ev();
extern void _ZN3aaa9GG1121323D1Ev();
Name_Map name_map__ZN3aaa9GG1121323E[] = {
  NSPAIR(_ZN3aaa9GG1121323C1Ev),
  NSPAIR(_ZN3aaa9GG1121323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1121323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121323E[];
extern void _ZN3aaa9GG11213233fooEv();
extern void _ZN3aaa9GG11213233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11213233fooEv,_ZThn8_N3aaa9GG11213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11213233fooEv,_ZThn20_N3aaa9GG11213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11213233barEv,_ZThn20_N3aaa9GG11213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213233fooEv,_ZThn28_N3aaa9GG11213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213233barEv,_ZThn28_N3aaa9GG11213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11213233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11213233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11213233fooEv,_ZThn8_N3aaa9GG11213233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213233fooEv,_ZThn20_N3aaa9GG11213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213233barEv,_ZThn20_N3aaa9GG11213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213233fooEv,_ZThn28_N3aaa9GG11213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213233barEv,_ZThn28_N3aaa9GG11213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121323E[];
Class_Descriptor cd__ZN3aaa9GG1121323E = {  "_ZN3aaa9GG1121323E", // class name
  bases__ZN3aaa9GG1121323E, 6,
  &(vtc__ZN3aaa9GG1121323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121331  : ::aaa::EE112 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11213313fooEv
  ~GG1121331(); // tgen
  GG1121331(); // tgen
};
//SIG(1 _ZN3aaa9GG1121331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11213313fooEv");}
aaa::GG1121331 ::~GG1121331(){ note_dtor("_ZN3aaa9GG1121331E", this);} // tgen
aaa::GG1121331 ::GG1121331(){ note_ctor("_ZN3aaa9GG1121331E", this);} // tgen
}
static void Test__ZN3aaa9GG1121331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121331E, buf);
    ::aaa::GG1121331 *dp, &lv = *(dp=new (buf) ::aaa::GG1121331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121331E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1121331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1121331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1121331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121331E);
    dp->::aaa::GG1121331::~GG1121331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121331E(Test__ZN3aaa9GG1121331E, "_ZN3aaa9GG1121331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121331C1Ev();
extern void _ZN3aaa9GG1121331D1Ev();
Name_Map name_map__ZN3aaa9GG1121331E[] = {
  NSPAIR(_ZN3aaa9GG1121331C1Ev),
  NSPAIR(_ZN3aaa9GG1121331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1121331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121331E[];
extern void _ZN3aaa9GG11213313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11213313fooEv,_ZThn8_N3aaa9GG11213313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11213313fooEv,_ZThn20_N3aaa9GG11213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11213313fooEv,_ZThn28_N3aaa9GG11213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11213313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11213313fooEv,_ZThn8_N3aaa9GG11213313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213313fooEv,_ZThn20_N3aaa9GG11213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213313fooEv,_ZThn28_N3aaa9GG11213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121331E[];
Class_Descriptor cd__ZN3aaa9GG1121331E = {  "_ZN3aaa9GG1121331E", // class name
  bases__ZN3aaa9GG1121331E, 6,
  &(vtc__ZN3aaa9GG1121331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121332  : ::aaa::EE112 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11213323barEv
  ~GG1121332(); // tgen
  GG1121332(); // tgen
};
//SIG(1 _ZN3aaa9GG1121332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1121332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11213323barEv");}
aaa::GG1121332 ::~GG1121332(){ note_dtor("_ZN3aaa9GG1121332E", this);} // tgen
aaa::GG1121332 ::GG1121332(){ note_ctor("_ZN3aaa9GG1121332E", this);} // tgen
}
static void Test__ZN3aaa9GG1121332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121332E, buf);
    ::aaa::GG1121332 *dp, &lv = *(dp=new (buf) ::aaa::GG1121332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121332E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1121332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1121332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1121332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121332E);
    dp->::aaa::GG1121332::~GG1121332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121332E(Test__ZN3aaa9GG1121332E, "_ZN3aaa9GG1121332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121332C1Ev();
extern void _ZN3aaa9GG1121332D1Ev();
Name_Map name_map__ZN3aaa9GG1121332E[] = {
  NSPAIR(_ZN3aaa9GG1121332C1Ev),
  NSPAIR(_ZN3aaa9GG1121332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1121332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11213323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11213323barEv,_ZThn20_N3aaa9GG11213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213323barEv,_ZThn28_N3aaa9GG11213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213323barEv,_ZThn20_N3aaa9GG11213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213323barEv,_ZThn28_N3aaa9GG11213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121332E[];
Class_Descriptor cd__ZN3aaa9GG1121332E = {  "_ZN3aaa9GG1121332E", // class name
  bases__ZN3aaa9GG1121332E, 6,
  &(vtc__ZN3aaa9GG1121332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1121333  : ::aaa::EE112 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11213333fooEv
  virtual void  bar(); // _ZN3aaa9GG11213333barEv
  ~GG1121333(); // tgen
  GG1121333(); // tgen
};
//SIG(1 _ZN3aaa9GG1121333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1121333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11213333fooEv");}
void  aaa::GG1121333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11213333barEv");}
aaa::GG1121333 ::~GG1121333(){ note_dtor("_ZN3aaa9GG1121333E", this);} // tgen
aaa::GG1121333 ::GG1121333(){ note_ctor("_ZN3aaa9GG1121333E", this);} // tgen
}
static void Test__ZN3aaa9GG1121333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1121333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1121333E, buf);
    ::aaa::GG1121333 *dp, &lv = *(dp=new (buf) ::aaa::GG1121333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1121333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1121333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1121333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1121333E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1121333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1121333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1121333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1121333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1121333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1121333E);
    dp->::aaa::GG1121333::~GG1121333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1121333E(Test__ZN3aaa9GG1121333E, "_ZN3aaa9GG1121333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1121333C1Ev();
extern void _ZN3aaa9GG1121333D1Ev();
Name_Map name_map__ZN3aaa9GG1121333E[] = {
  NSPAIR(_ZN3aaa9GG1121333C1Ev),
  NSPAIR(_ZN3aaa9GG1121333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1121333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1121333E[];
extern void _ZN3aaa9GG11213333fooEv();
extern void _ZN3aaa9GG11213333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11213333fooEv,_ZThn8_N3aaa9GG11213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11213333fooEv,_ZThn20_N3aaa9GG11213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11213333barEv,_ZThn20_N3aaa9GG11213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213333fooEv,_ZThn28_N3aaa9GG11213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11213333barEv,_ZThn28_N3aaa9GG11213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1121333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11213333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11213333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11213333fooEv,_ZThn8_N3aaa9GG11213333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213333fooEv,_ZThn20_N3aaa9GG11213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11213333barEv,_ZThn20_N3aaa9GG11213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213333fooEv,_ZThn28_N3aaa9GG11213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11213333barEv,_ZThn28_N3aaa9GG11213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1121333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1121333E[];
Class_Descriptor cd__ZN3aaa9GG1121333E = {  "_ZN3aaa9GG1121333E", // class name
  bases__ZN3aaa9GG1121333E, 6,
  &(vtc__ZN3aaa9GG1121333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1121333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1121333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122111  : ::aaa::EE112 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11221113fooEv
  ~GG1122111(); // tgen
  GG1122111(); // tgen
};
//SIG(1 _ZN3aaa9GG1122111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11221113fooEv");}
aaa::GG1122111 ::~GG1122111(){ note_dtor("_ZN3aaa9GG1122111E", this);} // tgen
aaa::GG1122111 ::GG1122111(){ note_ctor("_ZN3aaa9GG1122111E", this);} // tgen
}
static void Test__ZN3aaa9GG1122111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122111E, buf);
    ::aaa::GG1122111 *dp, &lv = *(dp=new (buf) ::aaa::GG1122111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122111E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1122111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1122111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1122111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122111E);
    dp->::aaa::GG1122111::~GG1122111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122111E(Test__ZN3aaa9GG1122111E, "_ZN3aaa9GG1122111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122111C1Ev();
extern void _ZN3aaa9GG1122111D1Ev();
Name_Map name_map__ZN3aaa9GG1122111E[] = {
  NSPAIR(_ZN3aaa9GG1122111C1Ev),
  NSPAIR(_ZN3aaa9GG1122111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1122111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122111E[];
extern void _ZN3aaa9GG11221113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11221113fooEv,_ZThn8_N3aaa9GG11221113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11221113fooEv,_ZThn20_N3aaa9GG11221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11221113fooEv,_ZThn28_N3aaa9GG11221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11221113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11221113fooEv,_ZThn8_N3aaa9GG11221113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221113fooEv,_ZThn20_N3aaa9GG11221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11221113fooEv,_ZThn28_N3aaa9GG11221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122111E[];
Class_Descriptor cd__ZN3aaa9GG1122111E = {  "_ZN3aaa9GG1122111E", // class name
  bases__ZN3aaa9GG1122111E, 6,
  &(vtc__ZN3aaa9GG1122111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122112  : ::aaa::EE112 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11221123barEv
  ~GG1122112(); // tgen
  GG1122112(); // tgen
};
//SIG(1 _ZN3aaa9GG1122112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11221123barEv");}
aaa::GG1122112 ::~GG1122112(){ note_dtor("_ZN3aaa9GG1122112E", this);} // tgen
aaa::GG1122112 ::GG1122112(){ note_ctor("_ZN3aaa9GG1122112E", this);} // tgen
}
static void Test__ZN3aaa9GG1122112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122112E, buf);
    ::aaa::GG1122112 *dp, &lv = *(dp=new (buf) ::aaa::GG1122112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122112E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1122112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1122112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1122112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122112E);
    dp->::aaa::GG1122112::~GG1122112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122112E(Test__ZN3aaa9GG1122112E, "_ZN3aaa9GG1122112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122112C1Ev();
extern void _ZN3aaa9GG1122112D1Ev();
Name_Map name_map__ZN3aaa9GG1122112E[] = {
  NSPAIR(_ZN3aaa9GG1122112C1Ev),
  NSPAIR(_ZN3aaa9GG1122112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1122112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11221123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11221123barEv,_ZThn20_N3aaa9GG11221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221123barEv,_ZThn20_N3aaa9GG11221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122112E[];
Class_Descriptor cd__ZN3aaa9GG1122112E = {  "_ZN3aaa9GG1122112E", // class name
  bases__ZN3aaa9GG1122112E, 6,
  &(vtc__ZN3aaa9GG1122112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122113  : ::aaa::EE112 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11221133fooEv
  virtual void  bar(); // _ZN3aaa9GG11221133barEv
  ~GG1122113(); // tgen
  GG1122113(); // tgen
};
//SIG(1 _ZN3aaa9GG1122113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11221133fooEv");}
void  aaa::GG1122113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11221133barEv");}
aaa::GG1122113 ::~GG1122113(){ note_dtor("_ZN3aaa9GG1122113E", this);} // tgen
aaa::GG1122113 ::GG1122113(){ note_ctor("_ZN3aaa9GG1122113E", this);} // tgen
}
static void Test__ZN3aaa9GG1122113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122113E, buf);
    ::aaa::GG1122113 *dp, &lv = *(dp=new (buf) ::aaa::GG1122113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122113E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1122113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1122113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1122113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122113E);
    dp->::aaa::GG1122113::~GG1122113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122113E(Test__ZN3aaa9GG1122113E, "_ZN3aaa9GG1122113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122113C1Ev();
extern void _ZN3aaa9GG1122113D1Ev();
Name_Map name_map__ZN3aaa9GG1122113E[] = {
  NSPAIR(_ZN3aaa9GG1122113C1Ev),
  NSPAIR(_ZN3aaa9GG1122113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1122113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122113E[];
extern void _ZN3aaa9GG11221133fooEv();
extern void _ZN3aaa9GG11221133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11221133fooEv,_ZThn8_N3aaa9GG11221133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11221133barEv,_ZThn20_N3aaa9GG11221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11221133fooEv,_ZThn20_N3aaa9GG11221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11221133fooEv,_ZThn28_N3aaa9GG11221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11221133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11221133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11221133fooEv,_ZThn8_N3aaa9GG11221133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221133barEv,_ZThn20_N3aaa9GG11221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221133fooEv,_ZThn20_N3aaa9GG11221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11221133fooEv,_ZThn28_N3aaa9GG11221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122113E[];
Class_Descriptor cd__ZN3aaa9GG1122113E = {  "_ZN3aaa9GG1122113E", // class name
  bases__ZN3aaa9GG1122113E, 6,
  &(vtc__ZN3aaa9GG1122113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122121  : ::aaa::EE112 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11221213fooEv
  ~GG1122121(); // tgen
  GG1122121(); // tgen
};
//SIG(1 _ZN3aaa9GG1122121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11221213fooEv");}
aaa::GG1122121 ::~GG1122121(){ note_dtor("_ZN3aaa9GG1122121E", this);} // tgen
aaa::GG1122121 ::GG1122121(){ note_ctor("_ZN3aaa9GG1122121E", this);} // tgen
}
static void Test__ZN3aaa9GG1122121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122121E, buf);
    ::aaa::GG1122121 *dp, &lv = *(dp=new (buf) ::aaa::GG1122121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122121E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1122121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1122121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1122121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122121E);
    dp->::aaa::GG1122121::~GG1122121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122121E(Test__ZN3aaa9GG1122121E, "_ZN3aaa9GG1122121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122121C1Ev();
extern void _ZN3aaa9GG1122121D1Ev();
Name_Map name_map__ZN3aaa9GG1122121E[] = {
  NSPAIR(_ZN3aaa9GG1122121C1Ev),
  NSPAIR(_ZN3aaa9GG1122121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1122121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122121E[];
extern void _ZN3aaa9GG11221213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11221213fooEv,_ZThn8_N3aaa9GG11221213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11221213fooEv,_ZThn28_N3aaa9GG11221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11221213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11221213fooEv,_ZThn8_N3aaa9GG11221213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11221213fooEv,_ZThn28_N3aaa9GG11221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122121E[];
Class_Descriptor cd__ZN3aaa9GG1122121E = {  "_ZN3aaa9GG1122121E", // class name
  bases__ZN3aaa9GG1122121E, 6,
  &(vtc__ZN3aaa9GG1122121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122122  : ::aaa::EE112 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11221223barEv
  ~GG1122122(); // tgen
  GG1122122(); // tgen
};
//SIG(1 _ZN3aaa9GG1122122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11221223barEv");}
aaa::GG1122122 ::~GG1122122(){ note_dtor("_ZN3aaa9GG1122122E", this);} // tgen
aaa::GG1122122 ::GG1122122(){ note_ctor("_ZN3aaa9GG1122122E", this);} // tgen
}
static void Test__ZN3aaa9GG1122122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122122E, buf);
    ::aaa::GG1122122 *dp, &lv = *(dp=new (buf) ::aaa::GG1122122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122122E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1122122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1122122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1122122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122122E);
    dp->::aaa::GG1122122::~GG1122122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122122E(Test__ZN3aaa9GG1122122E, "_ZN3aaa9GG1122122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122122C1Ev();
extern void _ZN3aaa9GG1122122D1Ev();
Name_Map name_map__ZN3aaa9GG1122122E[] = {
  NSPAIR(_ZN3aaa9GG1122122C1Ev),
  NSPAIR(_ZN3aaa9GG1122122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1122122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11221223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11221223barEv,_ZThn20_N3aaa9GG11221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221223barEv,_ZThn20_N3aaa9GG11221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122122E[];
Class_Descriptor cd__ZN3aaa9GG1122122E = {  "_ZN3aaa9GG1122122E", // class name
  bases__ZN3aaa9GG1122122E, 6,
  &(vtc__ZN3aaa9GG1122122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122123  : ::aaa::EE112 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11221233fooEv
  virtual void  bar(); // _ZN3aaa9GG11221233barEv
  ~GG1122123(); // tgen
  GG1122123(); // tgen
};
//SIG(1 _ZN3aaa9GG1122123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11221233fooEv");}
void  aaa::GG1122123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11221233barEv");}
aaa::GG1122123 ::~GG1122123(){ note_dtor("_ZN3aaa9GG1122123E", this);} // tgen
aaa::GG1122123 ::GG1122123(){ note_ctor("_ZN3aaa9GG1122123E", this);} // tgen
}
static void Test__ZN3aaa9GG1122123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122123E, buf);
    ::aaa::GG1122123 *dp, &lv = *(dp=new (buf) ::aaa::GG1122123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122123E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1122123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1122123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1122123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122123E);
    dp->::aaa::GG1122123::~GG1122123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122123E(Test__ZN3aaa9GG1122123E, "_ZN3aaa9GG1122123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122123C1Ev();
extern void _ZN3aaa9GG1122123D1Ev();
Name_Map name_map__ZN3aaa9GG1122123E[] = {
  NSPAIR(_ZN3aaa9GG1122123C1Ev),
  NSPAIR(_ZN3aaa9GG1122123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1122123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122123E[];
extern void _ZN3aaa9GG11221233fooEv();
extern void _ZN3aaa9GG11221233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11221233fooEv,_ZThn8_N3aaa9GG11221233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11221233barEv,_ZThn20_N3aaa9GG11221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11221233fooEv,_ZThn28_N3aaa9GG11221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11221233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11221233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11221233fooEv,_ZThn8_N3aaa9GG11221233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221233barEv,_ZThn20_N3aaa9GG11221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11221233fooEv,_ZThn28_N3aaa9GG11221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122123E[];
Class_Descriptor cd__ZN3aaa9GG1122123E = {  "_ZN3aaa9GG1122123E", // class name
  bases__ZN3aaa9GG1122123E, 6,
  &(vtc__ZN3aaa9GG1122123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122131  : ::aaa::EE112 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11221313fooEv
  ~GG1122131(); // tgen
  GG1122131(); // tgen
};
//SIG(1 _ZN3aaa9GG1122131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11221313fooEv");}
aaa::GG1122131 ::~GG1122131(){ note_dtor("_ZN3aaa9GG1122131E", this);} // tgen
aaa::GG1122131 ::GG1122131(){ note_ctor("_ZN3aaa9GG1122131E", this);} // tgen
}
static void Test__ZN3aaa9GG1122131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122131E, buf);
    ::aaa::GG1122131 *dp, &lv = *(dp=new (buf) ::aaa::GG1122131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122131E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1122131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1122131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1122131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122131E);
    dp->::aaa::GG1122131::~GG1122131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122131E(Test__ZN3aaa9GG1122131E, "_ZN3aaa9GG1122131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122131C1Ev();
extern void _ZN3aaa9GG1122131D1Ev();
Name_Map name_map__ZN3aaa9GG1122131E[] = {
  NSPAIR(_ZN3aaa9GG1122131C1Ev),
  NSPAIR(_ZN3aaa9GG1122131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1122131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122131E[];
extern void _ZN3aaa9GG11221313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11221313fooEv,_ZThn8_N3aaa9GG11221313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11221313fooEv,_ZThn20_N3aaa9GG11221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11221313fooEv,_ZThn28_N3aaa9GG11221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11221313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11221313fooEv,_ZThn8_N3aaa9GG11221313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221313fooEv,_ZThn20_N3aaa9GG11221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11221313fooEv,_ZThn28_N3aaa9GG11221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122131E[];
Class_Descriptor cd__ZN3aaa9GG1122131E = {  "_ZN3aaa9GG1122131E", // class name
  bases__ZN3aaa9GG1122131E, 6,
  &(vtc__ZN3aaa9GG1122131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122132  : ::aaa::EE112 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11221323barEv
  ~GG1122132(); // tgen
  GG1122132(); // tgen
};
//SIG(1 _ZN3aaa9GG1122132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11221323barEv");}
aaa::GG1122132 ::~GG1122132(){ note_dtor("_ZN3aaa9GG1122132E", this);} // tgen
aaa::GG1122132 ::GG1122132(){ note_ctor("_ZN3aaa9GG1122132E", this);} // tgen
}
static void Test__ZN3aaa9GG1122132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122132E, buf);
    ::aaa::GG1122132 *dp, &lv = *(dp=new (buf) ::aaa::GG1122132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122132E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1122132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1122132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1122132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122132E);
    dp->::aaa::GG1122132::~GG1122132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122132E(Test__ZN3aaa9GG1122132E, "_ZN3aaa9GG1122132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122132C1Ev();
extern void _ZN3aaa9GG1122132D1Ev();
Name_Map name_map__ZN3aaa9GG1122132E[] = {
  NSPAIR(_ZN3aaa9GG1122132C1Ev),
  NSPAIR(_ZN3aaa9GG1122132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1122132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11221323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11221323barEv,_ZThn20_N3aaa9GG11221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221323barEv,_ZThn20_N3aaa9GG11221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122132E[];
Class_Descriptor cd__ZN3aaa9GG1122132E = {  "_ZN3aaa9GG1122132E", // class name
  bases__ZN3aaa9GG1122132E, 6,
  &(vtc__ZN3aaa9GG1122132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122133  : ::aaa::EE112 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11221333fooEv
  virtual void  bar(); // _ZN3aaa9GG11221333barEv
  ~GG1122133(); // tgen
  GG1122133(); // tgen
};
//SIG(1 _ZN3aaa9GG1122133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11221333fooEv");}
void  aaa::GG1122133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11221333barEv");}
aaa::GG1122133 ::~GG1122133(){ note_dtor("_ZN3aaa9GG1122133E", this);} // tgen
aaa::GG1122133 ::GG1122133(){ note_ctor("_ZN3aaa9GG1122133E", this);} // tgen
}
static void Test__ZN3aaa9GG1122133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122133E, buf);
    ::aaa::GG1122133 *dp, &lv = *(dp=new (buf) ::aaa::GG1122133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122133E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1122133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1122133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1122133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122133E);
    dp->::aaa::GG1122133::~GG1122133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122133E(Test__ZN3aaa9GG1122133E, "_ZN3aaa9GG1122133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122133C1Ev();
extern void _ZN3aaa9GG1122133D1Ev();
Name_Map name_map__ZN3aaa9GG1122133E[] = {
  NSPAIR(_ZN3aaa9GG1122133C1Ev),
  NSPAIR(_ZN3aaa9GG1122133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1122133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122133E[];
extern void _ZN3aaa9GG11221333fooEv();
extern void _ZN3aaa9GG11221333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11221333fooEv,_ZThn8_N3aaa9GG11221333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11221333barEv,_ZThn20_N3aaa9GG11221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11221333fooEv,_ZThn20_N3aaa9GG11221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11221333fooEv,_ZThn28_N3aaa9GG11221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11221333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11221333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11221333fooEv,_ZThn8_N3aaa9GG11221333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221333barEv,_ZThn20_N3aaa9GG11221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11221333fooEv,_ZThn20_N3aaa9GG11221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11221333fooEv,_ZThn28_N3aaa9GG11221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122133E[];
Class_Descriptor cd__ZN3aaa9GG1122133E = {  "_ZN3aaa9GG1122133E", // class name
  bases__ZN3aaa9GG1122133E, 6,
  &(vtc__ZN3aaa9GG1122133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122211  : ::aaa::EE112 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11222113fooEv
  ~GG1122211(); // tgen
  GG1122211(); // tgen
};
//SIG(1 _ZN3aaa9GG1122211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11222113fooEv");}
aaa::GG1122211 ::~GG1122211(){ note_dtor("_ZN3aaa9GG1122211E", this);} // tgen
aaa::GG1122211 ::GG1122211(){ note_ctor("_ZN3aaa9GG1122211E", this);} // tgen
}
static void Test__ZN3aaa9GG1122211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122211E, buf);
    ::aaa::GG1122211 *dp, &lv = *(dp=new (buf) ::aaa::GG1122211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122211E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1122211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1122211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1122211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122211E);
    dp->::aaa::GG1122211::~GG1122211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122211E(Test__ZN3aaa9GG1122211E, "_ZN3aaa9GG1122211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122211C1Ev();
extern void _ZN3aaa9GG1122211D1Ev();
Name_Map name_map__ZN3aaa9GG1122211E[] = {
  NSPAIR(_ZN3aaa9GG1122211C1Ev),
  NSPAIR(_ZN3aaa9GG1122211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1122211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122211E[];
extern void _ZN3aaa9GG11222113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11222113fooEv,_ZThn8_N3aaa9GG11222113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11222113fooEv,_ZThn20_N3aaa9GG11222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11222113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11222113fooEv,_ZThn8_N3aaa9GG11222113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222113fooEv,_ZThn20_N3aaa9GG11222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122211E[];
Class_Descriptor cd__ZN3aaa9GG1122211E = {  "_ZN3aaa9GG1122211E", // class name
  bases__ZN3aaa9GG1122211E, 6,
  &(vtc__ZN3aaa9GG1122211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122212  : ::aaa::EE112 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11222123barEv
  ~GG1122212(); // tgen
  GG1122212(); // tgen
};
//SIG(1 _ZN3aaa9GG1122212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11222123barEv");}
aaa::GG1122212 ::~GG1122212(){ note_dtor("_ZN3aaa9GG1122212E", this);} // tgen
aaa::GG1122212 ::GG1122212(){ note_ctor("_ZN3aaa9GG1122212E", this);} // tgen
}
static void Test__ZN3aaa9GG1122212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122212E, buf);
    ::aaa::GG1122212 *dp, &lv = *(dp=new (buf) ::aaa::GG1122212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122212E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1122212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1122212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1122212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122212E);
    dp->::aaa::GG1122212::~GG1122212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122212E(Test__ZN3aaa9GG1122212E, "_ZN3aaa9GG1122212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122212C1Ev();
extern void _ZN3aaa9GG1122212D1Ev();
Name_Map name_map__ZN3aaa9GG1122212E[] = {
  NSPAIR(_ZN3aaa9GG1122212C1Ev),
  NSPAIR(_ZN3aaa9GG1122212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1122212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11222123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11222123barEv,_ZThn20_N3aaa9GG11222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11222123barEv,_ZThn28_N3aaa9GG11222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222123barEv,_ZThn20_N3aaa9GG11222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11222123barEv,_ZThn28_N3aaa9GG11222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122212E[];
Class_Descriptor cd__ZN3aaa9GG1122212E = {  "_ZN3aaa9GG1122212E", // class name
  bases__ZN3aaa9GG1122212E, 6,
  &(vtc__ZN3aaa9GG1122212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122213  : ::aaa::EE112 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11222133fooEv
  virtual void  bar(); // _ZN3aaa9GG11222133barEv
  ~GG1122213(); // tgen
  GG1122213(); // tgen
};
//SIG(1 _ZN3aaa9GG1122213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11222133fooEv");}
void  aaa::GG1122213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11222133barEv");}
aaa::GG1122213 ::~GG1122213(){ note_dtor("_ZN3aaa9GG1122213E", this);} // tgen
aaa::GG1122213 ::GG1122213(){ note_ctor("_ZN3aaa9GG1122213E", this);} // tgen
}
static void Test__ZN3aaa9GG1122213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122213E, buf);
    ::aaa::GG1122213 *dp, &lv = *(dp=new (buf) ::aaa::GG1122213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122213E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1122213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1122213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1122213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122213E);
    dp->::aaa::GG1122213::~GG1122213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122213E(Test__ZN3aaa9GG1122213E, "_ZN3aaa9GG1122213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122213C1Ev();
extern void _ZN3aaa9GG1122213D1Ev();
Name_Map name_map__ZN3aaa9GG1122213E[] = {
  NSPAIR(_ZN3aaa9GG1122213C1Ev),
  NSPAIR(_ZN3aaa9GG1122213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1122213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122213E[];
extern void _ZN3aaa9GG11222133fooEv();
extern void _ZN3aaa9GG11222133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11222133fooEv,_ZThn8_N3aaa9GG11222133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11222133barEv,_ZThn20_N3aaa9GG11222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11222133fooEv,_ZThn20_N3aaa9GG11222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11222133barEv,_ZThn28_N3aaa9GG11222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11222133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11222133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11222133fooEv,_ZThn8_N3aaa9GG11222133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222133barEv,_ZThn20_N3aaa9GG11222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222133fooEv,_ZThn20_N3aaa9GG11222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11222133barEv,_ZThn28_N3aaa9GG11222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122213E[];
Class_Descriptor cd__ZN3aaa9GG1122213E = {  "_ZN3aaa9GG1122213E", // class name
  bases__ZN3aaa9GG1122213E, 6,
  &(vtc__ZN3aaa9GG1122213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122221  : ::aaa::EE112 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11222213fooEv
  ~GG1122221(); // tgen
  GG1122221(); // tgen
};
//SIG(1 _ZN3aaa9GG1122221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11222213fooEv");}
aaa::GG1122221 ::~GG1122221(){ note_dtor("_ZN3aaa9GG1122221E", this);} // tgen
aaa::GG1122221 ::GG1122221(){ note_ctor("_ZN3aaa9GG1122221E", this);} // tgen
}
static void Test__ZN3aaa9GG1122221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122221E, buf);
    ::aaa::GG1122221 *dp, &lv = *(dp=new (buf) ::aaa::GG1122221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122221E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1122221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1122221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1122221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122221E);
    dp->::aaa::GG1122221::~GG1122221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122221E(Test__ZN3aaa9GG1122221E, "_ZN3aaa9GG1122221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122221C1Ev();
extern void _ZN3aaa9GG1122221D1Ev();
Name_Map name_map__ZN3aaa9GG1122221E[] = {
  NSPAIR(_ZN3aaa9GG1122221C1Ev),
  NSPAIR(_ZN3aaa9GG1122221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1122221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122221E[];
extern void _ZN3aaa9GG11222213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11222213fooEv,_ZThn8_N3aaa9GG11222213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11222213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11222213fooEv,_ZThn8_N3aaa9GG11222213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122221E[];
Class_Descriptor cd__ZN3aaa9GG1122221E = {  "_ZN3aaa9GG1122221E", // class name
  bases__ZN3aaa9GG1122221E, 6,
  &(vtc__ZN3aaa9GG1122221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122222  : ::aaa::EE112 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11222223barEv
  ~GG1122222(); // tgen
  GG1122222(); // tgen
};
//SIG(1 _ZN3aaa9GG1122222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11222223barEv");}
aaa::GG1122222 ::~GG1122222(){ note_dtor("_ZN3aaa9GG1122222E", this);} // tgen
aaa::GG1122222 ::GG1122222(){ note_ctor("_ZN3aaa9GG1122222E", this);} // tgen
}
static void Test__ZN3aaa9GG1122222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122222E, buf);
    ::aaa::GG1122222 *dp, &lv = *(dp=new (buf) ::aaa::GG1122222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122222E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1122222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1122222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1122222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122222E);
    dp->::aaa::GG1122222::~GG1122222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122222E(Test__ZN3aaa9GG1122222E, "_ZN3aaa9GG1122222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122222C1Ev();
extern void _ZN3aaa9GG1122222D1Ev();
Name_Map name_map__ZN3aaa9GG1122222E[] = {
  NSPAIR(_ZN3aaa9GG1122222C1Ev),
  NSPAIR(_ZN3aaa9GG1122222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1122222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11222223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11222223barEv,_ZThn20_N3aaa9GG11222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11222223barEv,_ZThn28_N3aaa9GG11222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222223barEv,_ZThn20_N3aaa9GG11222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11222223barEv,_ZThn28_N3aaa9GG11222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122222E[];
Class_Descriptor cd__ZN3aaa9GG1122222E = {  "_ZN3aaa9GG1122222E", // class name
  bases__ZN3aaa9GG1122222E, 6,
  &(vtc__ZN3aaa9GG1122222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122223  : ::aaa::EE112 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11222233fooEv
  virtual void  bar(); // _ZN3aaa9GG11222233barEv
  ~GG1122223(); // tgen
  GG1122223(); // tgen
};
//SIG(1 _ZN3aaa9GG1122223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11222233fooEv");}
void  aaa::GG1122223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11222233barEv");}
aaa::GG1122223 ::~GG1122223(){ note_dtor("_ZN3aaa9GG1122223E", this);} // tgen
aaa::GG1122223 ::GG1122223(){ note_ctor("_ZN3aaa9GG1122223E", this);} // tgen
}
static void Test__ZN3aaa9GG1122223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122223E, buf);
    ::aaa::GG1122223 *dp, &lv = *(dp=new (buf) ::aaa::GG1122223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122223E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1122223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1122223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1122223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122223E);
    dp->::aaa::GG1122223::~GG1122223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122223E(Test__ZN3aaa9GG1122223E, "_ZN3aaa9GG1122223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122223C1Ev();
extern void _ZN3aaa9GG1122223D1Ev();
Name_Map name_map__ZN3aaa9GG1122223E[] = {
  NSPAIR(_ZN3aaa9GG1122223C1Ev),
  NSPAIR(_ZN3aaa9GG1122223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1122223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122223E[];
extern void _ZN3aaa9GG11222233fooEv();
extern void _ZN3aaa9GG11222233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11222233fooEv,_ZThn8_N3aaa9GG11222233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11222233barEv,_ZThn20_N3aaa9GG11222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11222233barEv,_ZThn28_N3aaa9GG11222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11222233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11222233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11222233fooEv,_ZThn8_N3aaa9GG11222233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222233barEv,_ZThn20_N3aaa9GG11222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11222233barEv,_ZThn28_N3aaa9GG11222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122223E[];
Class_Descriptor cd__ZN3aaa9GG1122223E = {  "_ZN3aaa9GG1122223E", // class name
  bases__ZN3aaa9GG1122223E, 6,
  &(vtc__ZN3aaa9GG1122223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122231  : ::aaa::EE112 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11222313fooEv
  ~GG1122231(); // tgen
  GG1122231(); // tgen
};
//SIG(1 _ZN3aaa9GG1122231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11222313fooEv");}
aaa::GG1122231 ::~GG1122231(){ note_dtor("_ZN3aaa9GG1122231E", this);} // tgen
aaa::GG1122231 ::GG1122231(){ note_ctor("_ZN3aaa9GG1122231E", this);} // tgen
}
static void Test__ZN3aaa9GG1122231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122231E, buf);
    ::aaa::GG1122231 *dp, &lv = *(dp=new (buf) ::aaa::GG1122231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122231E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1122231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1122231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1122231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122231E);
    dp->::aaa::GG1122231::~GG1122231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122231E(Test__ZN3aaa9GG1122231E, "_ZN3aaa9GG1122231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122231C1Ev();
extern void _ZN3aaa9GG1122231D1Ev();
Name_Map name_map__ZN3aaa9GG1122231E[] = {
  NSPAIR(_ZN3aaa9GG1122231C1Ev),
  NSPAIR(_ZN3aaa9GG1122231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1122231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122231E[];
extern void _ZN3aaa9GG11222313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11222313fooEv,_ZThn8_N3aaa9GG11222313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11222313fooEv,_ZThn20_N3aaa9GG11222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11222313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11222313fooEv,_ZThn8_N3aaa9GG11222313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222313fooEv,_ZThn20_N3aaa9GG11222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122231E[];
Class_Descriptor cd__ZN3aaa9GG1122231E = {  "_ZN3aaa9GG1122231E", // class name
  bases__ZN3aaa9GG1122231E, 6,
  &(vtc__ZN3aaa9GG1122231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122232  : ::aaa::EE112 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11222323barEv
  ~GG1122232(); // tgen
  GG1122232(); // tgen
};
//SIG(1 _ZN3aaa9GG1122232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11222323barEv");}
aaa::GG1122232 ::~GG1122232(){ note_dtor("_ZN3aaa9GG1122232E", this);} // tgen
aaa::GG1122232 ::GG1122232(){ note_ctor("_ZN3aaa9GG1122232E", this);} // tgen
}
static void Test__ZN3aaa9GG1122232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122232E, buf);
    ::aaa::GG1122232 *dp, &lv = *(dp=new (buf) ::aaa::GG1122232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122232E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1122232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1122232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1122232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122232E);
    dp->::aaa::GG1122232::~GG1122232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122232E(Test__ZN3aaa9GG1122232E, "_ZN3aaa9GG1122232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122232C1Ev();
extern void _ZN3aaa9GG1122232D1Ev();
Name_Map name_map__ZN3aaa9GG1122232E[] = {
  NSPAIR(_ZN3aaa9GG1122232C1Ev),
  NSPAIR(_ZN3aaa9GG1122232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1122232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11222323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11222323barEv,_ZThn20_N3aaa9GG11222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11222323barEv,_ZThn28_N3aaa9GG11222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222323barEv,_ZThn20_N3aaa9GG11222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11222323barEv,_ZThn28_N3aaa9GG11222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122232E[];
Class_Descriptor cd__ZN3aaa9GG1122232E = {  "_ZN3aaa9GG1122232E", // class name
  bases__ZN3aaa9GG1122232E, 6,
  &(vtc__ZN3aaa9GG1122232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122233  : ::aaa::EE112 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11222333fooEv
  virtual void  bar(); // _ZN3aaa9GG11222333barEv
  ~GG1122233(); // tgen
  GG1122233(); // tgen
};
//SIG(1 _ZN3aaa9GG1122233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11222333fooEv");}
void  aaa::GG1122233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11222333barEv");}
aaa::GG1122233 ::~GG1122233(){ note_dtor("_ZN3aaa9GG1122233E", this);} // tgen
aaa::GG1122233 ::GG1122233(){ note_ctor("_ZN3aaa9GG1122233E", this);} // tgen
}
static void Test__ZN3aaa9GG1122233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122233E, buf);
    ::aaa::GG1122233 *dp, &lv = *(dp=new (buf) ::aaa::GG1122233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122233E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1122233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1122233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1122233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122233E);
    dp->::aaa::GG1122233::~GG1122233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122233E(Test__ZN3aaa9GG1122233E, "_ZN3aaa9GG1122233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122233C1Ev();
extern void _ZN3aaa9GG1122233D1Ev();
Name_Map name_map__ZN3aaa9GG1122233E[] = {
  NSPAIR(_ZN3aaa9GG1122233C1Ev),
  NSPAIR(_ZN3aaa9GG1122233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1122233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122233E[];
extern void _ZN3aaa9GG11222333fooEv();
extern void _ZN3aaa9GG11222333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11222333fooEv,_ZThn8_N3aaa9GG11222333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11222333barEv,_ZThn20_N3aaa9GG11222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11222333fooEv,_ZThn20_N3aaa9GG11222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11222333barEv,_ZThn28_N3aaa9GG11222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11222333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11222333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11222333fooEv,_ZThn8_N3aaa9GG11222333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222333barEv,_ZThn20_N3aaa9GG11222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11222333fooEv,_ZThn20_N3aaa9GG11222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11222333barEv,_ZThn28_N3aaa9GG11222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122233E[];
Class_Descriptor cd__ZN3aaa9GG1122233E = {  "_ZN3aaa9GG1122233E", // class name
  bases__ZN3aaa9GG1122233E, 6,
  &(vtc__ZN3aaa9GG1122233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122311  : ::aaa::EE112 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11223113fooEv
  ~GG1122311(); // tgen
  GG1122311(); // tgen
};
//SIG(1 _ZN3aaa9GG1122311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11223113fooEv");}
aaa::GG1122311 ::~GG1122311(){ note_dtor("_ZN3aaa9GG1122311E", this);} // tgen
aaa::GG1122311 ::GG1122311(){ note_ctor("_ZN3aaa9GG1122311E", this);} // tgen
}
static void Test__ZN3aaa9GG1122311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122311E, buf);
    ::aaa::GG1122311 *dp, &lv = *(dp=new (buf) ::aaa::GG1122311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122311E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1122311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1122311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1122311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122311E);
    dp->::aaa::GG1122311::~GG1122311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122311E(Test__ZN3aaa9GG1122311E, "_ZN3aaa9GG1122311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122311C1Ev();
extern void _ZN3aaa9GG1122311D1Ev();
Name_Map name_map__ZN3aaa9GG1122311E[] = {
  NSPAIR(_ZN3aaa9GG1122311C1Ev),
  NSPAIR(_ZN3aaa9GG1122311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1122311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122311E[];
extern void _ZN3aaa9GG11223113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11223113fooEv,_ZThn8_N3aaa9GG11223113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11223113fooEv,_ZThn20_N3aaa9GG11223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223113fooEv,_ZThn28_N3aaa9GG11223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11223113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11223113fooEv,_ZThn8_N3aaa9GG11223113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223113fooEv,_ZThn20_N3aaa9GG11223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223113fooEv,_ZThn28_N3aaa9GG11223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122311E[];
Class_Descriptor cd__ZN3aaa9GG1122311E = {  "_ZN3aaa9GG1122311E", // class name
  bases__ZN3aaa9GG1122311E, 6,
  &(vtc__ZN3aaa9GG1122311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122312  : ::aaa::EE112 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11223123barEv
  ~GG1122312(); // tgen
  GG1122312(); // tgen
};
//SIG(1 _ZN3aaa9GG1122312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11223123barEv");}
aaa::GG1122312 ::~GG1122312(){ note_dtor("_ZN3aaa9GG1122312E", this);} // tgen
aaa::GG1122312 ::GG1122312(){ note_ctor("_ZN3aaa9GG1122312E", this);} // tgen
}
static void Test__ZN3aaa9GG1122312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122312E, buf);
    ::aaa::GG1122312 *dp, &lv = *(dp=new (buf) ::aaa::GG1122312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122312E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1122312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1122312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1122312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122312E);
    dp->::aaa::GG1122312::~GG1122312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122312E(Test__ZN3aaa9GG1122312E, "_ZN3aaa9GG1122312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122312C1Ev();
extern void _ZN3aaa9GG1122312D1Ev();
Name_Map name_map__ZN3aaa9GG1122312E[] = {
  NSPAIR(_ZN3aaa9GG1122312C1Ev),
  NSPAIR(_ZN3aaa9GG1122312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1122312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11223123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11223123barEv,_ZThn20_N3aaa9GG11223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223123barEv,_ZThn28_N3aaa9GG11223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223123barEv,_ZThn20_N3aaa9GG11223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223123barEv,_ZThn28_N3aaa9GG11223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122312E[];
Class_Descriptor cd__ZN3aaa9GG1122312E = {  "_ZN3aaa9GG1122312E", // class name
  bases__ZN3aaa9GG1122312E, 6,
  &(vtc__ZN3aaa9GG1122312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122313  : ::aaa::EE112 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11223133fooEv
  virtual void  bar(); // _ZN3aaa9GG11223133barEv
  ~GG1122313(); // tgen
  GG1122313(); // tgen
};
//SIG(1 _ZN3aaa9GG1122313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11223133fooEv");}
void  aaa::GG1122313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11223133barEv");}
aaa::GG1122313 ::~GG1122313(){ note_dtor("_ZN3aaa9GG1122313E", this);} // tgen
aaa::GG1122313 ::GG1122313(){ note_ctor("_ZN3aaa9GG1122313E", this);} // tgen
}
static void Test__ZN3aaa9GG1122313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122313E, buf);
    ::aaa::GG1122313 *dp, &lv = *(dp=new (buf) ::aaa::GG1122313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122313E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1122313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1122313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1122313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122313E);
    dp->::aaa::GG1122313::~GG1122313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122313E(Test__ZN3aaa9GG1122313E, "_ZN3aaa9GG1122313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122313C1Ev();
extern void _ZN3aaa9GG1122313D1Ev();
Name_Map name_map__ZN3aaa9GG1122313E[] = {
  NSPAIR(_ZN3aaa9GG1122313C1Ev),
  NSPAIR(_ZN3aaa9GG1122313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1122313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122313E[];
extern void _ZN3aaa9GG11223133fooEv();
extern void _ZN3aaa9GG11223133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11223133fooEv,_ZThn8_N3aaa9GG11223133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11223133barEv,_ZThn20_N3aaa9GG11223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11223133fooEv,_ZThn20_N3aaa9GG11223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223133fooEv,_ZThn28_N3aaa9GG11223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223133barEv,_ZThn28_N3aaa9GG11223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11223133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11223133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11223133fooEv,_ZThn8_N3aaa9GG11223133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223133barEv,_ZThn20_N3aaa9GG11223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223133fooEv,_ZThn20_N3aaa9GG11223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223133fooEv,_ZThn28_N3aaa9GG11223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223133barEv,_ZThn28_N3aaa9GG11223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122313E[];
Class_Descriptor cd__ZN3aaa9GG1122313E = {  "_ZN3aaa9GG1122313E", // class name
  bases__ZN3aaa9GG1122313E, 6,
  &(vtc__ZN3aaa9GG1122313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122321  : ::aaa::EE112 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11223213fooEv
  ~GG1122321(); // tgen
  GG1122321(); // tgen
};
//SIG(1 _ZN3aaa9GG1122321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11223213fooEv");}
aaa::GG1122321 ::~GG1122321(){ note_dtor("_ZN3aaa9GG1122321E", this);} // tgen
aaa::GG1122321 ::GG1122321(){ note_ctor("_ZN3aaa9GG1122321E", this);} // tgen
}
static void Test__ZN3aaa9GG1122321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122321E, buf);
    ::aaa::GG1122321 *dp, &lv = *(dp=new (buf) ::aaa::GG1122321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122321E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1122321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1122321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1122321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122321E);
    dp->::aaa::GG1122321::~GG1122321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122321E(Test__ZN3aaa9GG1122321E, "_ZN3aaa9GG1122321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122321C1Ev();
extern void _ZN3aaa9GG1122321D1Ev();
Name_Map name_map__ZN3aaa9GG1122321E[] = {
  NSPAIR(_ZN3aaa9GG1122321C1Ev),
  NSPAIR(_ZN3aaa9GG1122321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1122321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122321E[];
extern void _ZN3aaa9GG11223213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11223213fooEv,_ZThn8_N3aaa9GG11223213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11223213fooEv,_ZThn28_N3aaa9GG11223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11223213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11223213fooEv,_ZThn8_N3aaa9GG11223213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223213fooEv,_ZThn28_N3aaa9GG11223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122321E[];
Class_Descriptor cd__ZN3aaa9GG1122321E = {  "_ZN3aaa9GG1122321E", // class name
  bases__ZN3aaa9GG1122321E, 6,
  &(vtc__ZN3aaa9GG1122321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122322  : ::aaa::EE112 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11223223barEv
  ~GG1122322(); // tgen
  GG1122322(); // tgen
};
//SIG(1 _ZN3aaa9GG1122322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11223223barEv");}
aaa::GG1122322 ::~GG1122322(){ note_dtor("_ZN3aaa9GG1122322E", this);} // tgen
aaa::GG1122322 ::GG1122322(){ note_ctor("_ZN3aaa9GG1122322E", this);} // tgen
}
static void Test__ZN3aaa9GG1122322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122322E, buf);
    ::aaa::GG1122322 *dp, &lv = *(dp=new (buf) ::aaa::GG1122322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122322E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1122322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1122322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1122322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122322E);
    dp->::aaa::GG1122322::~GG1122322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122322E(Test__ZN3aaa9GG1122322E, "_ZN3aaa9GG1122322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122322C1Ev();
extern void _ZN3aaa9GG1122322D1Ev();
Name_Map name_map__ZN3aaa9GG1122322E[] = {
  NSPAIR(_ZN3aaa9GG1122322C1Ev),
  NSPAIR(_ZN3aaa9GG1122322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1122322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11223223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11223223barEv,_ZThn20_N3aaa9GG11223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11223223barEv,_ZThn28_N3aaa9GG11223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223223barEv,_ZThn20_N3aaa9GG11223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223223barEv,_ZThn28_N3aaa9GG11223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122322E[];
Class_Descriptor cd__ZN3aaa9GG1122322E = {  "_ZN3aaa9GG1122322E", // class name
  bases__ZN3aaa9GG1122322E, 6,
  &(vtc__ZN3aaa9GG1122322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122323  : ::aaa::EE112 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11223233fooEv
  virtual void  bar(); // _ZN3aaa9GG11223233barEv
  ~GG1122323(); // tgen
  GG1122323(); // tgen
};
//SIG(1 _ZN3aaa9GG1122323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11223233fooEv");}
void  aaa::GG1122323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11223233barEv");}
aaa::GG1122323 ::~GG1122323(){ note_dtor("_ZN3aaa9GG1122323E", this);} // tgen
aaa::GG1122323 ::GG1122323(){ note_ctor("_ZN3aaa9GG1122323E", this);} // tgen
}
static void Test__ZN3aaa9GG1122323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122323E, buf);
    ::aaa::GG1122323 *dp, &lv = *(dp=new (buf) ::aaa::GG1122323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122323E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1122323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1122323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1122323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122323E);
    dp->::aaa::GG1122323::~GG1122323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122323E(Test__ZN3aaa9GG1122323E, "_ZN3aaa9GG1122323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122323C1Ev();
extern void _ZN3aaa9GG1122323D1Ev();
Name_Map name_map__ZN3aaa9GG1122323E[] = {
  NSPAIR(_ZN3aaa9GG1122323C1Ev),
  NSPAIR(_ZN3aaa9GG1122323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1122323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122323E[];
extern void _ZN3aaa9GG11223233fooEv();
extern void _ZN3aaa9GG11223233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11223233fooEv,_ZThn8_N3aaa9GG11223233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11223233barEv,_ZThn20_N3aaa9GG11223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223233fooEv,_ZThn28_N3aaa9GG11223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223233barEv,_ZThn28_N3aaa9GG11223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11223233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11223233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11223233fooEv,_ZThn8_N3aaa9GG11223233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223233barEv,_ZThn20_N3aaa9GG11223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223233fooEv,_ZThn28_N3aaa9GG11223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223233barEv,_ZThn28_N3aaa9GG11223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122323E[];
Class_Descriptor cd__ZN3aaa9GG1122323E = {  "_ZN3aaa9GG1122323E", // class name
  bases__ZN3aaa9GG1122323E, 6,
  &(vtc__ZN3aaa9GG1122323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122331  : ::aaa::EE112 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11223313fooEv
  ~GG1122331(); // tgen
  GG1122331(); // tgen
};
//SIG(1 _ZN3aaa9GG1122331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11223313fooEv");}
aaa::GG1122331 ::~GG1122331(){ note_dtor("_ZN3aaa9GG1122331E", this);} // tgen
aaa::GG1122331 ::GG1122331(){ note_ctor("_ZN3aaa9GG1122331E", this);} // tgen
}
static void Test__ZN3aaa9GG1122331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122331E, buf);
    ::aaa::GG1122331 *dp, &lv = *(dp=new (buf) ::aaa::GG1122331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122331E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1122331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1122331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1122331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122331E);
    dp->::aaa::GG1122331::~GG1122331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122331E(Test__ZN3aaa9GG1122331E, "_ZN3aaa9GG1122331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122331C1Ev();
extern void _ZN3aaa9GG1122331D1Ev();
Name_Map name_map__ZN3aaa9GG1122331E[] = {
  NSPAIR(_ZN3aaa9GG1122331C1Ev),
  NSPAIR(_ZN3aaa9GG1122331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1122331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122331E[];
extern void _ZN3aaa9GG11223313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11223313fooEv,_ZThn8_N3aaa9GG11223313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11223313fooEv,_ZThn20_N3aaa9GG11223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223313fooEv,_ZThn28_N3aaa9GG11223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11223313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11223313fooEv,_ZThn8_N3aaa9GG11223313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223313fooEv,_ZThn20_N3aaa9GG11223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223313fooEv,_ZThn28_N3aaa9GG11223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122331E[];
Class_Descriptor cd__ZN3aaa9GG1122331E = {  "_ZN3aaa9GG1122331E", // class name
  bases__ZN3aaa9GG1122331E, 6,
  &(vtc__ZN3aaa9GG1122331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122332  : ::aaa::EE112 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11223323barEv
  ~GG1122332(); // tgen
  GG1122332(); // tgen
};
//SIG(1 _ZN3aaa9GG1122332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1122332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11223323barEv");}
aaa::GG1122332 ::~GG1122332(){ note_dtor("_ZN3aaa9GG1122332E", this);} // tgen
aaa::GG1122332 ::GG1122332(){ note_ctor("_ZN3aaa9GG1122332E", this);} // tgen
}
static void Test__ZN3aaa9GG1122332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122332E, buf);
    ::aaa::GG1122332 *dp, &lv = *(dp=new (buf) ::aaa::GG1122332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122332E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1122332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1122332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1122332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122332E);
    dp->::aaa::GG1122332::~GG1122332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122332E(Test__ZN3aaa9GG1122332E, "_ZN3aaa9GG1122332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122332C1Ev();
extern void _ZN3aaa9GG1122332D1Ev();
Name_Map name_map__ZN3aaa9GG1122332E[] = {
  NSPAIR(_ZN3aaa9GG1122332C1Ev),
  NSPAIR(_ZN3aaa9GG1122332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1122332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11223323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11223323barEv,_ZThn20_N3aaa9GG11223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223323barEv,_ZThn28_N3aaa9GG11223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223323barEv,_ZThn20_N3aaa9GG11223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223323barEv,_ZThn28_N3aaa9GG11223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122332E[];
Class_Descriptor cd__ZN3aaa9GG1122332E = {  "_ZN3aaa9GG1122332E", // class name
  bases__ZN3aaa9GG1122332E, 6,
  &(vtc__ZN3aaa9GG1122332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1122333  : ::aaa::EE112 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11223333fooEv
  virtual void  bar(); // _ZN3aaa9GG11223333barEv
  ~GG1122333(); // tgen
  GG1122333(); // tgen
};
//SIG(1 _ZN3aaa9GG1122333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1122333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11223333fooEv");}
void  aaa::GG1122333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11223333barEv");}
aaa::GG1122333 ::~GG1122333(){ note_dtor("_ZN3aaa9GG1122333E", this);} // tgen
aaa::GG1122333 ::GG1122333(){ note_ctor("_ZN3aaa9GG1122333E", this);} // tgen
}
static void Test__ZN3aaa9GG1122333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1122333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1122333E, buf);
    ::aaa::GG1122333 *dp, &lv = *(dp=new (buf) ::aaa::GG1122333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1122333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1122333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1122333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1122333E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1122333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1122333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1122333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1122333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1122333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1122333E);
    dp->::aaa::GG1122333::~GG1122333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1122333E(Test__ZN3aaa9GG1122333E, "_ZN3aaa9GG1122333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1122333C1Ev();
extern void _ZN3aaa9GG1122333D1Ev();
Name_Map name_map__ZN3aaa9GG1122333E[] = {
  NSPAIR(_ZN3aaa9GG1122333C1Ev),
  NSPAIR(_ZN3aaa9GG1122333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1122333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1122333E[];
extern void _ZN3aaa9GG11223333fooEv();
extern void _ZN3aaa9GG11223333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11223333fooEv,_ZThn8_N3aaa9GG11223333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11223333barEv,_ZThn20_N3aaa9GG11223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11223333fooEv,_ZThn20_N3aaa9GG11223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223333fooEv,_ZThn28_N3aaa9GG11223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11223333barEv,_ZThn28_N3aaa9GG11223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1122333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11223333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11223333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11223333fooEv,_ZThn8_N3aaa9GG11223333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223333barEv,_ZThn20_N3aaa9GG11223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11223333fooEv,_ZThn20_N3aaa9GG11223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223333fooEv,_ZThn28_N3aaa9GG11223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11223333barEv,_ZThn28_N3aaa9GG11223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1122333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1122333E[];
Class_Descriptor cd__ZN3aaa9GG1122333E = {  "_ZN3aaa9GG1122333E", // class name
  bases__ZN3aaa9GG1122333E, 6,
  &(vtc__ZN3aaa9GG1122333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1122333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1122333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123111  : ::aaa::EE112 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11231113fooEv
  ~GG1123111(); // tgen
  GG1123111(); // tgen
};
//SIG(1 _ZN3aaa9GG1123111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11231113fooEv");}
aaa::GG1123111 ::~GG1123111(){ note_dtor("_ZN3aaa9GG1123111E", this);} // tgen
aaa::GG1123111 ::GG1123111(){ note_ctor("_ZN3aaa9GG1123111E", this);} // tgen
}
static void Test__ZN3aaa9GG1123111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123111E, buf);
    ::aaa::GG1123111 *dp, &lv = *(dp=new (buf) ::aaa::GG1123111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123111E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1123111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1123111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1123111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123111E);
    dp->::aaa::GG1123111::~GG1123111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123111E(Test__ZN3aaa9GG1123111E, "_ZN3aaa9GG1123111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123111C1Ev();
extern void _ZN3aaa9GG1123111D1Ev();
Name_Map name_map__ZN3aaa9GG1123111E[] = {
  NSPAIR(_ZN3aaa9GG1123111C1Ev),
  NSPAIR(_ZN3aaa9GG1123111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1123111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123111E[];
extern void _ZN3aaa9GG11231113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11231113fooEv,_ZThn8_N3aaa9GG11231113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231113fooEv,_ZThn20_N3aaa9GG11231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11231113fooEv,_ZThn28_N3aaa9GG11231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11231113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11231113fooEv,_ZThn8_N3aaa9GG11231113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231113fooEv,_ZThn20_N3aaa9GG11231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11231113fooEv,_ZThn28_N3aaa9GG11231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123111E[];
Class_Descriptor cd__ZN3aaa9GG1123111E = {  "_ZN3aaa9GG1123111E", // class name
  bases__ZN3aaa9GG1123111E, 6,
  &(vtc__ZN3aaa9GG1123111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123112  : ::aaa::EE112 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11231123barEv
  ~GG1123112(); // tgen
  GG1123112(); // tgen
};
//SIG(1 _ZN3aaa9GG1123112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11231123barEv");}
aaa::GG1123112 ::~GG1123112(){ note_dtor("_ZN3aaa9GG1123112E", this);} // tgen
aaa::GG1123112 ::GG1123112(){ note_ctor("_ZN3aaa9GG1123112E", this);} // tgen
}
static void Test__ZN3aaa9GG1123112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123112E, buf);
    ::aaa::GG1123112 *dp, &lv = *(dp=new (buf) ::aaa::GG1123112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123112E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1123112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1123112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1123112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123112E);
    dp->::aaa::GG1123112::~GG1123112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123112E(Test__ZN3aaa9GG1123112E, "_ZN3aaa9GG1123112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123112C1Ev();
extern void _ZN3aaa9GG1123112D1Ev();
Name_Map name_map__ZN3aaa9GG1123112E[] = {
  NSPAIR(_ZN3aaa9GG1123112C1Ev),
  NSPAIR(_ZN3aaa9GG1123112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1123112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11231123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11231123barEv,_ZThn20_N3aaa9GG11231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231123barEv,_ZThn20_N3aaa9GG11231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123112E[];
Class_Descriptor cd__ZN3aaa9GG1123112E = {  "_ZN3aaa9GG1123112E", // class name
  bases__ZN3aaa9GG1123112E, 6,
  &(vtc__ZN3aaa9GG1123112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123113  : ::aaa::EE112 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11231133fooEv
  virtual void  bar(); // _ZN3aaa9GG11231133barEv
  ~GG1123113(); // tgen
  GG1123113(); // tgen
};
//SIG(1 _ZN3aaa9GG1123113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11231133fooEv");}
void  aaa::GG1123113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11231133barEv");}
aaa::GG1123113 ::~GG1123113(){ note_dtor("_ZN3aaa9GG1123113E", this);} // tgen
aaa::GG1123113 ::GG1123113(){ note_ctor("_ZN3aaa9GG1123113E", this);} // tgen
}
static void Test__ZN3aaa9GG1123113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123113E, buf);
    ::aaa::GG1123113 *dp, &lv = *(dp=new (buf) ::aaa::GG1123113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123113E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1123113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1123113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1123113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123113E);
    dp->::aaa::GG1123113::~GG1123113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123113E(Test__ZN3aaa9GG1123113E, "_ZN3aaa9GG1123113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123113C1Ev();
extern void _ZN3aaa9GG1123113D1Ev();
Name_Map name_map__ZN3aaa9GG1123113E[] = {
  NSPAIR(_ZN3aaa9GG1123113C1Ev),
  NSPAIR(_ZN3aaa9GG1123113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1123113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123113E[];
extern void _ZN3aaa9GG11231133fooEv();
extern void _ZN3aaa9GG11231133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11231133fooEv,_ZThn8_N3aaa9GG11231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231133fooEv,_ZThn20_N3aaa9GG11231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231133barEv,_ZThn20_N3aaa9GG11231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11231133fooEv,_ZThn28_N3aaa9GG11231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11231133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11231133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11231133fooEv,_ZThn8_N3aaa9GG11231133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231133fooEv,_ZThn20_N3aaa9GG11231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231133barEv,_ZThn20_N3aaa9GG11231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11231133fooEv,_ZThn28_N3aaa9GG11231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123113E[];
Class_Descriptor cd__ZN3aaa9GG1123113E = {  "_ZN3aaa9GG1123113E", // class name
  bases__ZN3aaa9GG1123113E, 6,
  &(vtc__ZN3aaa9GG1123113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123121  : ::aaa::EE112 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11231213fooEv
  ~GG1123121(); // tgen
  GG1123121(); // tgen
};
//SIG(1 _ZN3aaa9GG1123121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11231213fooEv");}
aaa::GG1123121 ::~GG1123121(){ note_dtor("_ZN3aaa9GG1123121E", this);} // tgen
aaa::GG1123121 ::GG1123121(){ note_ctor("_ZN3aaa9GG1123121E", this);} // tgen
}
static void Test__ZN3aaa9GG1123121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123121E, buf);
    ::aaa::GG1123121 *dp, &lv = *(dp=new (buf) ::aaa::GG1123121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123121E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1123121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1123121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1123121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123121E);
    dp->::aaa::GG1123121::~GG1123121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123121E(Test__ZN3aaa9GG1123121E, "_ZN3aaa9GG1123121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123121C1Ev();
extern void _ZN3aaa9GG1123121D1Ev();
Name_Map name_map__ZN3aaa9GG1123121E[] = {
  NSPAIR(_ZN3aaa9GG1123121C1Ev),
  NSPAIR(_ZN3aaa9GG1123121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1123121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123121E[];
extern void _ZN3aaa9GG11231213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11231213fooEv,_ZThn8_N3aaa9GG11231213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231213fooEv,_ZThn20_N3aaa9GG11231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11231213fooEv,_ZThn28_N3aaa9GG11231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11231213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11231213fooEv,_ZThn8_N3aaa9GG11231213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231213fooEv,_ZThn20_N3aaa9GG11231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11231213fooEv,_ZThn28_N3aaa9GG11231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123121E[];
Class_Descriptor cd__ZN3aaa9GG1123121E = {  "_ZN3aaa9GG1123121E", // class name
  bases__ZN3aaa9GG1123121E, 6,
  &(vtc__ZN3aaa9GG1123121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123122  : ::aaa::EE112 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11231223barEv
  ~GG1123122(); // tgen
  GG1123122(); // tgen
};
//SIG(1 _ZN3aaa9GG1123122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11231223barEv");}
aaa::GG1123122 ::~GG1123122(){ note_dtor("_ZN3aaa9GG1123122E", this);} // tgen
aaa::GG1123122 ::GG1123122(){ note_ctor("_ZN3aaa9GG1123122E", this);} // tgen
}
static void Test__ZN3aaa9GG1123122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123122E, buf);
    ::aaa::GG1123122 *dp, &lv = *(dp=new (buf) ::aaa::GG1123122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123122E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1123122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1123122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1123122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123122E);
    dp->::aaa::GG1123122::~GG1123122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123122E(Test__ZN3aaa9GG1123122E, "_ZN3aaa9GG1123122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123122C1Ev();
extern void _ZN3aaa9GG1123122D1Ev();
Name_Map name_map__ZN3aaa9GG1123122E[] = {
  NSPAIR(_ZN3aaa9GG1123122C1Ev),
  NSPAIR(_ZN3aaa9GG1123122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1123122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11231223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11231223barEv,_ZThn20_N3aaa9GG11231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231223barEv,_ZThn20_N3aaa9GG11231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123122E[];
Class_Descriptor cd__ZN3aaa9GG1123122E = {  "_ZN3aaa9GG1123122E", // class name
  bases__ZN3aaa9GG1123122E, 6,
  &(vtc__ZN3aaa9GG1123122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123123  : ::aaa::EE112 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11231233fooEv
  virtual void  bar(); // _ZN3aaa9GG11231233barEv
  ~GG1123123(); // tgen
  GG1123123(); // tgen
};
//SIG(1 _ZN3aaa9GG1123123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11231233fooEv");}
void  aaa::GG1123123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11231233barEv");}
aaa::GG1123123 ::~GG1123123(){ note_dtor("_ZN3aaa9GG1123123E", this);} // tgen
aaa::GG1123123 ::GG1123123(){ note_ctor("_ZN3aaa9GG1123123E", this);} // tgen
}
static void Test__ZN3aaa9GG1123123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123123E, buf);
    ::aaa::GG1123123 *dp, &lv = *(dp=new (buf) ::aaa::GG1123123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123123E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1123123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1123123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1123123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123123E);
    dp->::aaa::GG1123123::~GG1123123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123123E(Test__ZN3aaa9GG1123123E, "_ZN3aaa9GG1123123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123123C1Ev();
extern void _ZN3aaa9GG1123123D1Ev();
Name_Map name_map__ZN3aaa9GG1123123E[] = {
  NSPAIR(_ZN3aaa9GG1123123C1Ev),
  NSPAIR(_ZN3aaa9GG1123123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1123123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123123E[];
extern void _ZN3aaa9GG11231233fooEv();
extern void _ZN3aaa9GG11231233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11231233fooEv,_ZThn8_N3aaa9GG11231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231233fooEv,_ZThn20_N3aaa9GG11231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231233barEv,_ZThn20_N3aaa9GG11231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11231233fooEv,_ZThn28_N3aaa9GG11231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11231233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11231233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11231233fooEv,_ZThn8_N3aaa9GG11231233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231233fooEv,_ZThn20_N3aaa9GG11231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231233barEv,_ZThn20_N3aaa9GG11231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11231233fooEv,_ZThn28_N3aaa9GG11231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123123E[];
Class_Descriptor cd__ZN3aaa9GG1123123E = {  "_ZN3aaa9GG1123123E", // class name
  bases__ZN3aaa9GG1123123E, 6,
  &(vtc__ZN3aaa9GG1123123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123131  : ::aaa::EE112 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11231313fooEv
  ~GG1123131(); // tgen
  GG1123131(); // tgen
};
//SIG(1 _ZN3aaa9GG1123131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11231313fooEv");}
aaa::GG1123131 ::~GG1123131(){ note_dtor("_ZN3aaa9GG1123131E", this);} // tgen
aaa::GG1123131 ::GG1123131(){ note_ctor("_ZN3aaa9GG1123131E", this);} // tgen
}
static void Test__ZN3aaa9GG1123131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123131E, buf);
    ::aaa::GG1123131 *dp, &lv = *(dp=new (buf) ::aaa::GG1123131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123131E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1123131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1123131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1123131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123131E);
    dp->::aaa::GG1123131::~GG1123131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123131E(Test__ZN3aaa9GG1123131E, "_ZN3aaa9GG1123131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123131C1Ev();
extern void _ZN3aaa9GG1123131D1Ev();
Name_Map name_map__ZN3aaa9GG1123131E[] = {
  NSPAIR(_ZN3aaa9GG1123131C1Ev),
  NSPAIR(_ZN3aaa9GG1123131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1123131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123131E[];
extern void _ZN3aaa9GG11231313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11231313fooEv,_ZThn8_N3aaa9GG11231313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231313fooEv,_ZThn20_N3aaa9GG11231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11231313fooEv,_ZThn28_N3aaa9GG11231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11231313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11231313fooEv,_ZThn8_N3aaa9GG11231313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231313fooEv,_ZThn20_N3aaa9GG11231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11231313fooEv,_ZThn28_N3aaa9GG11231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123131E[];
Class_Descriptor cd__ZN3aaa9GG1123131E = {  "_ZN3aaa9GG1123131E", // class name
  bases__ZN3aaa9GG1123131E, 6,
  &(vtc__ZN3aaa9GG1123131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123132  : ::aaa::EE112 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11231323barEv
  ~GG1123132(); // tgen
  GG1123132(); // tgen
};
//SIG(1 _ZN3aaa9GG1123132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11231323barEv");}
aaa::GG1123132 ::~GG1123132(){ note_dtor("_ZN3aaa9GG1123132E", this);} // tgen
aaa::GG1123132 ::GG1123132(){ note_ctor("_ZN3aaa9GG1123132E", this);} // tgen
}
static void Test__ZN3aaa9GG1123132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123132E, buf);
    ::aaa::GG1123132 *dp, &lv = *(dp=new (buf) ::aaa::GG1123132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123132E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1123132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1123132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1123132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123132E);
    dp->::aaa::GG1123132::~GG1123132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123132E(Test__ZN3aaa9GG1123132E, "_ZN3aaa9GG1123132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123132C1Ev();
extern void _ZN3aaa9GG1123132D1Ev();
Name_Map name_map__ZN3aaa9GG1123132E[] = {
  NSPAIR(_ZN3aaa9GG1123132C1Ev),
  NSPAIR(_ZN3aaa9GG1123132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1123132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11231323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11231323barEv,_ZThn20_N3aaa9GG11231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231323barEv,_ZThn20_N3aaa9GG11231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123132E[];
Class_Descriptor cd__ZN3aaa9GG1123132E = {  "_ZN3aaa9GG1123132E", // class name
  bases__ZN3aaa9GG1123132E, 6,
  &(vtc__ZN3aaa9GG1123132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123133  : ::aaa::EE112 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11231333fooEv
  virtual void  bar(); // _ZN3aaa9GG11231333barEv
  ~GG1123133(); // tgen
  GG1123133(); // tgen
};
//SIG(1 _ZN3aaa9GG1123133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11231333fooEv");}
void  aaa::GG1123133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11231333barEv");}
aaa::GG1123133 ::~GG1123133(){ note_dtor("_ZN3aaa9GG1123133E", this);} // tgen
aaa::GG1123133 ::GG1123133(){ note_ctor("_ZN3aaa9GG1123133E", this);} // tgen
}
static void Test__ZN3aaa9GG1123133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123133E, buf);
    ::aaa::GG1123133 *dp, &lv = *(dp=new (buf) ::aaa::GG1123133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123133E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1123133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1123133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1123133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123133E);
    dp->::aaa::GG1123133::~GG1123133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123133E(Test__ZN3aaa9GG1123133E, "_ZN3aaa9GG1123133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123133C1Ev();
extern void _ZN3aaa9GG1123133D1Ev();
Name_Map name_map__ZN3aaa9GG1123133E[] = {
  NSPAIR(_ZN3aaa9GG1123133C1Ev),
  NSPAIR(_ZN3aaa9GG1123133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1123133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123133E[];
extern void _ZN3aaa9GG11231333fooEv();
extern void _ZN3aaa9GG11231333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11231333fooEv,_ZThn8_N3aaa9GG11231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231333fooEv,_ZThn20_N3aaa9GG11231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11231333barEv,_ZThn20_N3aaa9GG11231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11231333fooEv,_ZThn28_N3aaa9GG11231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11231333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11231333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11231333fooEv,_ZThn8_N3aaa9GG11231333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231333fooEv,_ZThn20_N3aaa9GG11231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11231333barEv,_ZThn20_N3aaa9GG11231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11231333fooEv,_ZThn28_N3aaa9GG11231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123133E[];
Class_Descriptor cd__ZN3aaa9GG1123133E = {  "_ZN3aaa9GG1123133E", // class name
  bases__ZN3aaa9GG1123133E, 6,
  &(vtc__ZN3aaa9GG1123133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123211  : ::aaa::EE112 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11232113fooEv
  ~GG1123211(); // tgen
  GG1123211(); // tgen
};
//SIG(1 _ZN3aaa9GG1123211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11232113fooEv");}
aaa::GG1123211 ::~GG1123211(){ note_dtor("_ZN3aaa9GG1123211E", this);} // tgen
aaa::GG1123211 ::GG1123211(){ note_ctor("_ZN3aaa9GG1123211E", this);} // tgen
}
static void Test__ZN3aaa9GG1123211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123211E, buf);
    ::aaa::GG1123211 *dp, &lv = *(dp=new (buf) ::aaa::GG1123211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123211E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1123211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1123211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1123211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123211E);
    dp->::aaa::GG1123211::~GG1123211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123211E(Test__ZN3aaa9GG1123211E, "_ZN3aaa9GG1123211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123211C1Ev();
extern void _ZN3aaa9GG1123211D1Ev();
Name_Map name_map__ZN3aaa9GG1123211E[] = {
  NSPAIR(_ZN3aaa9GG1123211C1Ev),
  NSPAIR(_ZN3aaa9GG1123211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1123211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123211E[];
extern void _ZN3aaa9GG11232113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11232113fooEv,_ZThn8_N3aaa9GG11232113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232113fooEv,_ZThn20_N3aaa9GG11232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11232113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11232113fooEv,_ZThn8_N3aaa9GG11232113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232113fooEv,_ZThn20_N3aaa9GG11232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123211E[];
Class_Descriptor cd__ZN3aaa9GG1123211E = {  "_ZN3aaa9GG1123211E", // class name
  bases__ZN3aaa9GG1123211E, 6,
  &(vtc__ZN3aaa9GG1123211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123212  : ::aaa::EE112 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11232123barEv
  ~GG1123212(); // tgen
  GG1123212(); // tgen
};
//SIG(1 _ZN3aaa9GG1123212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11232123barEv");}
aaa::GG1123212 ::~GG1123212(){ note_dtor("_ZN3aaa9GG1123212E", this);} // tgen
aaa::GG1123212 ::GG1123212(){ note_ctor("_ZN3aaa9GG1123212E", this);} // tgen
}
static void Test__ZN3aaa9GG1123212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123212E, buf);
    ::aaa::GG1123212 *dp, &lv = *(dp=new (buf) ::aaa::GG1123212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123212E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1123212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1123212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1123212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123212E);
    dp->::aaa::GG1123212::~GG1123212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123212E(Test__ZN3aaa9GG1123212E, "_ZN3aaa9GG1123212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123212C1Ev();
extern void _ZN3aaa9GG1123212D1Ev();
Name_Map name_map__ZN3aaa9GG1123212E[] = {
  NSPAIR(_ZN3aaa9GG1123212C1Ev),
  NSPAIR(_ZN3aaa9GG1123212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1123212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11232123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11232123barEv,_ZThn20_N3aaa9GG11232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11232123barEv,_ZThn28_N3aaa9GG11232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232123barEv,_ZThn20_N3aaa9GG11232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11232123barEv,_ZThn28_N3aaa9GG11232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123212E[];
Class_Descriptor cd__ZN3aaa9GG1123212E = {  "_ZN3aaa9GG1123212E", // class name
  bases__ZN3aaa9GG1123212E, 6,
  &(vtc__ZN3aaa9GG1123212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123213  : ::aaa::EE112 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11232133fooEv
  virtual void  bar(); // _ZN3aaa9GG11232133barEv
  ~GG1123213(); // tgen
  GG1123213(); // tgen
};
//SIG(1 _ZN3aaa9GG1123213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11232133fooEv");}
void  aaa::GG1123213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11232133barEv");}
aaa::GG1123213 ::~GG1123213(){ note_dtor("_ZN3aaa9GG1123213E", this);} // tgen
aaa::GG1123213 ::GG1123213(){ note_ctor("_ZN3aaa9GG1123213E", this);} // tgen
}
static void Test__ZN3aaa9GG1123213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123213E, buf);
    ::aaa::GG1123213 *dp, &lv = *(dp=new (buf) ::aaa::GG1123213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123213E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1123213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1123213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1123213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123213E);
    dp->::aaa::GG1123213::~GG1123213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123213E(Test__ZN3aaa9GG1123213E, "_ZN3aaa9GG1123213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123213C1Ev();
extern void _ZN3aaa9GG1123213D1Ev();
Name_Map name_map__ZN3aaa9GG1123213E[] = {
  NSPAIR(_ZN3aaa9GG1123213C1Ev),
  NSPAIR(_ZN3aaa9GG1123213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1123213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123213E[];
extern void _ZN3aaa9GG11232133fooEv();
extern void _ZN3aaa9GG11232133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11232133fooEv,_ZThn8_N3aaa9GG11232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232133fooEv,_ZThn20_N3aaa9GG11232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232133barEv,_ZThn20_N3aaa9GG11232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11232133barEv,_ZThn28_N3aaa9GG11232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11232133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11232133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11232133fooEv,_ZThn8_N3aaa9GG11232133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232133fooEv,_ZThn20_N3aaa9GG11232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232133barEv,_ZThn20_N3aaa9GG11232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11232133barEv,_ZThn28_N3aaa9GG11232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123213E[];
Class_Descriptor cd__ZN3aaa9GG1123213E = {  "_ZN3aaa9GG1123213E", // class name
  bases__ZN3aaa9GG1123213E, 6,
  &(vtc__ZN3aaa9GG1123213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123221  : ::aaa::EE112 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11232213fooEv
  ~GG1123221(); // tgen
  GG1123221(); // tgen
};
//SIG(1 _ZN3aaa9GG1123221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11232213fooEv");}
aaa::GG1123221 ::~GG1123221(){ note_dtor("_ZN3aaa9GG1123221E", this);} // tgen
aaa::GG1123221 ::GG1123221(){ note_ctor("_ZN3aaa9GG1123221E", this);} // tgen
}
static void Test__ZN3aaa9GG1123221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123221E, buf);
    ::aaa::GG1123221 *dp, &lv = *(dp=new (buf) ::aaa::GG1123221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123221E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1123221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1123221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1123221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123221E);
    dp->::aaa::GG1123221::~GG1123221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123221E(Test__ZN3aaa9GG1123221E, "_ZN3aaa9GG1123221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123221C1Ev();
extern void _ZN3aaa9GG1123221D1Ev();
Name_Map name_map__ZN3aaa9GG1123221E[] = {
  NSPAIR(_ZN3aaa9GG1123221C1Ev),
  NSPAIR(_ZN3aaa9GG1123221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1123221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123221E[];
extern void _ZN3aaa9GG11232213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11232213fooEv,_ZThn8_N3aaa9GG11232213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232213fooEv,_ZThn20_N3aaa9GG11232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11232213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11232213fooEv,_ZThn8_N3aaa9GG11232213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232213fooEv,_ZThn20_N3aaa9GG11232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123221E[];
Class_Descriptor cd__ZN3aaa9GG1123221E = {  "_ZN3aaa9GG1123221E", // class name
  bases__ZN3aaa9GG1123221E, 6,
  &(vtc__ZN3aaa9GG1123221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123222  : ::aaa::EE112 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11232223barEv
  ~GG1123222(); // tgen
  GG1123222(); // tgen
};
//SIG(1 _ZN3aaa9GG1123222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11232223barEv");}
aaa::GG1123222 ::~GG1123222(){ note_dtor("_ZN3aaa9GG1123222E", this);} // tgen
aaa::GG1123222 ::GG1123222(){ note_ctor("_ZN3aaa9GG1123222E", this);} // tgen
}
static void Test__ZN3aaa9GG1123222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123222E, buf);
    ::aaa::GG1123222 *dp, &lv = *(dp=new (buf) ::aaa::GG1123222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123222E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1123222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1123222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1123222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123222E);
    dp->::aaa::GG1123222::~GG1123222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123222E(Test__ZN3aaa9GG1123222E, "_ZN3aaa9GG1123222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123222C1Ev();
extern void _ZN3aaa9GG1123222D1Ev();
Name_Map name_map__ZN3aaa9GG1123222E[] = {
  NSPAIR(_ZN3aaa9GG1123222C1Ev),
  NSPAIR(_ZN3aaa9GG1123222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1123222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11232223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11232223barEv,_ZThn20_N3aaa9GG11232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11232223barEv,_ZThn28_N3aaa9GG11232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232223barEv,_ZThn20_N3aaa9GG11232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11232223barEv,_ZThn28_N3aaa9GG11232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123222E[];
Class_Descriptor cd__ZN3aaa9GG1123222E = {  "_ZN3aaa9GG1123222E", // class name
  bases__ZN3aaa9GG1123222E, 6,
  &(vtc__ZN3aaa9GG1123222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123223  : ::aaa::EE112 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11232233fooEv
  virtual void  bar(); // _ZN3aaa9GG11232233barEv
  ~GG1123223(); // tgen
  GG1123223(); // tgen
};
//SIG(1 _ZN3aaa9GG1123223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11232233fooEv");}
void  aaa::GG1123223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11232233barEv");}
aaa::GG1123223 ::~GG1123223(){ note_dtor("_ZN3aaa9GG1123223E", this);} // tgen
aaa::GG1123223 ::GG1123223(){ note_ctor("_ZN3aaa9GG1123223E", this);} // tgen
}
static void Test__ZN3aaa9GG1123223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123223E, buf);
    ::aaa::GG1123223 *dp, &lv = *(dp=new (buf) ::aaa::GG1123223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123223E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1123223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1123223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1123223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123223E);
    dp->::aaa::GG1123223::~GG1123223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123223E(Test__ZN3aaa9GG1123223E, "_ZN3aaa9GG1123223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123223C1Ev();
extern void _ZN3aaa9GG1123223D1Ev();
Name_Map name_map__ZN3aaa9GG1123223E[] = {
  NSPAIR(_ZN3aaa9GG1123223C1Ev),
  NSPAIR(_ZN3aaa9GG1123223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1123223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123223E[];
extern void _ZN3aaa9GG11232233fooEv();
extern void _ZN3aaa9GG11232233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11232233fooEv,_ZThn8_N3aaa9GG11232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232233fooEv,_ZThn20_N3aaa9GG11232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232233barEv,_ZThn20_N3aaa9GG11232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11232233barEv,_ZThn28_N3aaa9GG11232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11232233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11232233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11232233fooEv,_ZThn8_N3aaa9GG11232233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232233fooEv,_ZThn20_N3aaa9GG11232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232233barEv,_ZThn20_N3aaa9GG11232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11232233barEv,_ZThn28_N3aaa9GG11232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123223E[];
Class_Descriptor cd__ZN3aaa9GG1123223E = {  "_ZN3aaa9GG1123223E", // class name
  bases__ZN3aaa9GG1123223E, 6,
  &(vtc__ZN3aaa9GG1123223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123231  : ::aaa::EE112 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11232313fooEv
  ~GG1123231(); // tgen
  GG1123231(); // tgen
};
//SIG(1 _ZN3aaa9GG1123231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11232313fooEv");}
aaa::GG1123231 ::~GG1123231(){ note_dtor("_ZN3aaa9GG1123231E", this);} // tgen
aaa::GG1123231 ::GG1123231(){ note_ctor("_ZN3aaa9GG1123231E", this);} // tgen
}
static void Test__ZN3aaa9GG1123231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123231E, buf);
    ::aaa::GG1123231 *dp, &lv = *(dp=new (buf) ::aaa::GG1123231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123231E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1123231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1123231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1123231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123231E);
    dp->::aaa::GG1123231::~GG1123231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123231E(Test__ZN3aaa9GG1123231E, "_ZN3aaa9GG1123231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123231C1Ev();
extern void _ZN3aaa9GG1123231D1Ev();
Name_Map name_map__ZN3aaa9GG1123231E[] = {
  NSPAIR(_ZN3aaa9GG1123231C1Ev),
  NSPAIR(_ZN3aaa9GG1123231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1123231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123231E[];
extern void _ZN3aaa9GG11232313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11232313fooEv,_ZThn8_N3aaa9GG11232313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232313fooEv,_ZThn20_N3aaa9GG11232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11232313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11232313fooEv,_ZThn8_N3aaa9GG11232313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232313fooEv,_ZThn20_N3aaa9GG11232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123231E[];
Class_Descriptor cd__ZN3aaa9GG1123231E = {  "_ZN3aaa9GG1123231E", // class name
  bases__ZN3aaa9GG1123231E, 6,
  &(vtc__ZN3aaa9GG1123231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123232  : ::aaa::EE112 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11232323barEv
  ~GG1123232(); // tgen
  GG1123232(); // tgen
};
//SIG(1 _ZN3aaa9GG1123232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11232323barEv");}
aaa::GG1123232 ::~GG1123232(){ note_dtor("_ZN3aaa9GG1123232E", this);} // tgen
aaa::GG1123232 ::GG1123232(){ note_ctor("_ZN3aaa9GG1123232E", this);} // tgen
}
static void Test__ZN3aaa9GG1123232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123232E, buf);
    ::aaa::GG1123232 *dp, &lv = *(dp=new (buf) ::aaa::GG1123232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123232E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1123232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1123232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1123232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123232E);
    dp->::aaa::GG1123232::~GG1123232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123232E(Test__ZN3aaa9GG1123232E, "_ZN3aaa9GG1123232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123232C1Ev();
extern void _ZN3aaa9GG1123232D1Ev();
Name_Map name_map__ZN3aaa9GG1123232E[] = {
  NSPAIR(_ZN3aaa9GG1123232C1Ev),
  NSPAIR(_ZN3aaa9GG1123232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1123232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11232323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11232323barEv,_ZThn20_N3aaa9GG11232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11232323barEv,_ZThn28_N3aaa9GG11232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232323barEv,_ZThn20_N3aaa9GG11232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11232323barEv,_ZThn28_N3aaa9GG11232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123232E[];
Class_Descriptor cd__ZN3aaa9GG1123232E = {  "_ZN3aaa9GG1123232E", // class name
  bases__ZN3aaa9GG1123232E, 6,
  &(vtc__ZN3aaa9GG1123232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123233  : ::aaa::EE112 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11232333fooEv
  virtual void  bar(); // _ZN3aaa9GG11232333barEv
  ~GG1123233(); // tgen
  GG1123233(); // tgen
};
//SIG(1 _ZN3aaa9GG1123233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11232333fooEv");}
void  aaa::GG1123233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11232333barEv");}
aaa::GG1123233 ::~GG1123233(){ note_dtor("_ZN3aaa9GG1123233E", this);} // tgen
aaa::GG1123233 ::GG1123233(){ note_ctor("_ZN3aaa9GG1123233E", this);} // tgen
}
static void Test__ZN3aaa9GG1123233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123233E, buf);
    ::aaa::GG1123233 *dp, &lv = *(dp=new (buf) ::aaa::GG1123233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123233E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1123233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1123233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1123233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123233E);
    dp->::aaa::GG1123233::~GG1123233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123233E(Test__ZN3aaa9GG1123233E, "_ZN3aaa9GG1123233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123233C1Ev();
extern void _ZN3aaa9GG1123233D1Ev();
Name_Map name_map__ZN3aaa9GG1123233E[] = {
  NSPAIR(_ZN3aaa9GG1123233C1Ev),
  NSPAIR(_ZN3aaa9GG1123233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1123233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123233E[];
extern void _ZN3aaa9GG11232333fooEv();
extern void _ZN3aaa9GG11232333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11232333fooEv,_ZThn8_N3aaa9GG11232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232333fooEv,_ZThn20_N3aaa9GG11232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11232333barEv,_ZThn20_N3aaa9GG11232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11232333barEv,_ZThn28_N3aaa9GG11232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11232333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11232333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11232333fooEv,_ZThn8_N3aaa9GG11232333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232333fooEv,_ZThn20_N3aaa9GG11232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11232333barEv,_ZThn20_N3aaa9GG11232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11232333barEv,_ZThn28_N3aaa9GG11232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123233E[];
Class_Descriptor cd__ZN3aaa9GG1123233E = {  "_ZN3aaa9GG1123233E", // class name
  bases__ZN3aaa9GG1123233E, 6,
  &(vtc__ZN3aaa9GG1123233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123311  : ::aaa::EE112 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11233113fooEv
  ~GG1123311(); // tgen
  GG1123311(); // tgen
};
//SIG(1 _ZN3aaa9GG1123311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11233113fooEv");}
aaa::GG1123311 ::~GG1123311(){ note_dtor("_ZN3aaa9GG1123311E", this);} // tgen
aaa::GG1123311 ::GG1123311(){ note_ctor("_ZN3aaa9GG1123311E", this);} // tgen
}
static void Test__ZN3aaa9GG1123311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123311E, buf);
    ::aaa::GG1123311 *dp, &lv = *(dp=new (buf) ::aaa::GG1123311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123311E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1123311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1123311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1123311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123311E);
    dp->::aaa::GG1123311::~GG1123311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123311E(Test__ZN3aaa9GG1123311E, "_ZN3aaa9GG1123311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123311C1Ev();
extern void _ZN3aaa9GG1123311D1Ev();
Name_Map name_map__ZN3aaa9GG1123311E[] = {
  NSPAIR(_ZN3aaa9GG1123311C1Ev),
  NSPAIR(_ZN3aaa9GG1123311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1123311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123311E[];
extern void _ZN3aaa9GG11233113fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11233113fooEv,_ZThn8_N3aaa9GG11233113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233113fooEv,_ZThn20_N3aaa9GG11233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11233113fooEv,_ZThn28_N3aaa9GG11233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11233113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11233113fooEv,_ZThn8_N3aaa9GG11233113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233113fooEv,_ZThn20_N3aaa9GG11233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233113fooEv,_ZThn28_N3aaa9GG11233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123311E[];
Class_Descriptor cd__ZN3aaa9GG1123311E = {  "_ZN3aaa9GG1123311E", // class name
  bases__ZN3aaa9GG1123311E, 6,
  &(vtc__ZN3aaa9GG1123311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123312  : ::aaa::EE112 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11233123barEv
  ~GG1123312(); // tgen
  GG1123312(); // tgen
};
//SIG(1 _ZN3aaa9GG1123312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v4 v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11233123barEv");}
aaa::GG1123312 ::~GG1123312(){ note_dtor("_ZN3aaa9GG1123312E", this);} // tgen
aaa::GG1123312 ::GG1123312(){ note_ctor("_ZN3aaa9GG1123312E", this);} // tgen
}
static void Test__ZN3aaa9GG1123312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123312E, buf);
    ::aaa::GG1123312 *dp, &lv = *(dp=new (buf) ::aaa::GG1123312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123312E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1123312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1123312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1123312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123312E);
    dp->::aaa::GG1123312::~GG1123312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123312E(Test__ZN3aaa9GG1123312E, "_ZN3aaa9GG1123312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123312C1Ev();
extern void _ZN3aaa9GG1123312D1Ev();
Name_Map name_map__ZN3aaa9GG1123312E[] = {
  NSPAIR(_ZN3aaa9GG1123312C1Ev),
  NSPAIR(_ZN3aaa9GG1123312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1123312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11233123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11233123barEv,_ZThn20_N3aaa9GG11233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11233123barEv,_ZThn28_N3aaa9GG11233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233123barEv,_ZThn20_N3aaa9GG11233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233123barEv,_ZThn28_N3aaa9GG11233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123312E[];
Class_Descriptor cd__ZN3aaa9GG1123312E = {  "_ZN3aaa9GG1123312E", // class name
  bases__ZN3aaa9GG1123312E, 6,
  &(vtc__ZN3aaa9GG1123312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123313  : ::aaa::EE112 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11233133fooEv
  virtual void  bar(); // _ZN3aaa9GG11233133barEv
  ~GG1123313(); // tgen
  GG1123313(); // tgen
};
//SIG(1 _ZN3aaa9GG1123313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11233133fooEv");}
void  aaa::GG1123313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11233133barEv");}
aaa::GG1123313 ::~GG1123313(){ note_dtor("_ZN3aaa9GG1123313E", this);} // tgen
aaa::GG1123313 ::GG1123313(){ note_ctor("_ZN3aaa9GG1123313E", this);} // tgen
}
static void Test__ZN3aaa9GG1123313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123313E, buf);
    ::aaa::GG1123313 *dp, &lv = *(dp=new (buf) ::aaa::GG1123313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123313E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1123313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1123313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1123313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123313E);
    dp->::aaa::GG1123313::~GG1123313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123313E(Test__ZN3aaa9GG1123313E, "_ZN3aaa9GG1123313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123313C1Ev();
extern void _ZN3aaa9GG1123313D1Ev();
Name_Map name_map__ZN3aaa9GG1123313E[] = {
  NSPAIR(_ZN3aaa9GG1123313C1Ev),
  NSPAIR(_ZN3aaa9GG1123313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1123313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123313E[];
extern void _ZN3aaa9GG11233133fooEv();
extern void _ZN3aaa9GG11233133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11233133fooEv,_ZThn8_N3aaa9GG11233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233133fooEv,_ZThn20_N3aaa9GG11233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233133barEv,_ZThn20_N3aaa9GG11233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11233133fooEv,_ZThn28_N3aaa9GG11233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11233133barEv,_ZThn28_N3aaa9GG11233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11233133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11233133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11233133fooEv,_ZThn8_N3aaa9GG11233133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233133fooEv,_ZThn20_N3aaa9GG11233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233133barEv,_ZThn20_N3aaa9GG11233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233133fooEv,_ZThn28_N3aaa9GG11233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233133barEv,_ZThn28_N3aaa9GG11233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123313E[];
Class_Descriptor cd__ZN3aaa9GG1123313E = {  "_ZN3aaa9GG1123313E", // class name
  bases__ZN3aaa9GG1123313E, 6,
  &(vtc__ZN3aaa9GG1123313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123321  : ::aaa::EE112 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11233213fooEv
  ~GG1123321(); // tgen
  GG1123321(); // tgen
};
//SIG(1 _ZN3aaa9GG1123321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11233213fooEv");}
aaa::GG1123321 ::~GG1123321(){ note_dtor("_ZN3aaa9GG1123321E", this);} // tgen
aaa::GG1123321 ::GG1123321(){ note_ctor("_ZN3aaa9GG1123321E", this);} // tgen
}
static void Test__ZN3aaa9GG1123321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123321E, buf);
    ::aaa::GG1123321 *dp, &lv = *(dp=new (buf) ::aaa::GG1123321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123321E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1123321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1123321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1123321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123321E);
    dp->::aaa::GG1123321::~GG1123321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123321E(Test__ZN3aaa9GG1123321E, "_ZN3aaa9GG1123321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123321C1Ev();
extern void _ZN3aaa9GG1123321D1Ev();
Name_Map name_map__ZN3aaa9GG1123321E[] = {
  NSPAIR(_ZN3aaa9GG1123321C1Ev),
  NSPAIR(_ZN3aaa9GG1123321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1123321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123321E[];
extern void _ZN3aaa9GG11233213fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11233213fooEv,_ZThn8_N3aaa9GG11233213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233213fooEv,_ZThn20_N3aaa9GG11233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11233213fooEv,_ZThn28_N3aaa9GG11233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11233213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11233213fooEv,_ZThn8_N3aaa9GG11233213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233213fooEv,_ZThn20_N3aaa9GG11233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233213fooEv,_ZThn28_N3aaa9GG11233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123321E[];
Class_Descriptor cd__ZN3aaa9GG1123321E = {  "_ZN3aaa9GG1123321E", // class name
  bases__ZN3aaa9GG1123321E, 6,
  &(vtc__ZN3aaa9GG1123321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123322  : ::aaa::EE112 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11233223barEv
  ~GG1123322(); // tgen
  GG1123322(); // tgen
};
//SIG(1 _ZN3aaa9GG1123322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v5 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11233223barEv");}
aaa::GG1123322 ::~GG1123322(){ note_dtor("_ZN3aaa9GG1123322E", this);} // tgen
aaa::GG1123322 ::GG1123322(){ note_ctor("_ZN3aaa9GG1123322E", this);} // tgen
}
static void Test__ZN3aaa9GG1123322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123322E, buf);
    ::aaa::GG1123322 *dp, &lv = *(dp=new (buf) ::aaa::GG1123322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123322E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1123322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1123322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1123322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123322E);
    dp->::aaa::GG1123322::~GG1123322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123322E(Test__ZN3aaa9GG1123322E, "_ZN3aaa9GG1123322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123322C1Ev();
extern void _ZN3aaa9GG1123322D1Ev();
Name_Map name_map__ZN3aaa9GG1123322E[] = {
  NSPAIR(_ZN3aaa9GG1123322C1Ev),
  NSPAIR(_ZN3aaa9GG1123322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1123322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11233223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11233223barEv,_ZThn20_N3aaa9GG11233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11233223barEv,_ZThn28_N3aaa9GG11233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233223barEv,_ZThn20_N3aaa9GG11233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233223barEv,_ZThn28_N3aaa9GG11233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123322E[];
Class_Descriptor cd__ZN3aaa9GG1123322E = {  "_ZN3aaa9GG1123322E", // class name
  bases__ZN3aaa9GG1123322E, 6,
  &(vtc__ZN3aaa9GG1123322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123323  : ::aaa::EE112 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11233233fooEv
  virtual void  bar(); // _ZN3aaa9GG11233233barEv
  ~GG1123323(); // tgen
  GG1123323(); // tgen
};
//SIG(1 _ZN3aaa9GG1123323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11233233fooEv");}
void  aaa::GG1123323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11233233barEv");}
aaa::GG1123323 ::~GG1123323(){ note_dtor("_ZN3aaa9GG1123323E", this);} // tgen
aaa::GG1123323 ::GG1123323(){ note_ctor("_ZN3aaa9GG1123323E", this);} // tgen
}
static void Test__ZN3aaa9GG1123323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123323E, buf);
    ::aaa::GG1123323 *dp, &lv = *(dp=new (buf) ::aaa::GG1123323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123323E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1123323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1123323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1123323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123323E);
    dp->::aaa::GG1123323::~GG1123323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123323E(Test__ZN3aaa9GG1123323E, "_ZN3aaa9GG1123323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123323C1Ev();
extern void _ZN3aaa9GG1123323D1Ev();
Name_Map name_map__ZN3aaa9GG1123323E[] = {
  NSPAIR(_ZN3aaa9GG1123323C1Ev),
  NSPAIR(_ZN3aaa9GG1123323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1123323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123323E[];
extern void _ZN3aaa9GG11233233fooEv();
extern void _ZN3aaa9GG11233233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11233233fooEv,_ZThn8_N3aaa9GG11233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233233fooEv,_ZThn20_N3aaa9GG11233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233233barEv,_ZThn20_N3aaa9GG11233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11233233fooEv,_ZThn28_N3aaa9GG11233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11233233barEv,_ZThn28_N3aaa9GG11233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11233233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11233233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11233233fooEv,_ZThn8_N3aaa9GG11233233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233233fooEv,_ZThn20_N3aaa9GG11233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233233barEv,_ZThn20_N3aaa9GG11233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233233fooEv,_ZThn28_N3aaa9GG11233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233233barEv,_ZThn28_N3aaa9GG11233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123323E[];
Class_Descriptor cd__ZN3aaa9GG1123323E = {  "_ZN3aaa9GG1123323E", // class name
  bases__ZN3aaa9GG1123323E, 6,
  &(vtc__ZN3aaa9GG1123323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123331  : ::aaa::EE112 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11233313fooEv
  ~GG1123331(); // tgen
  GG1123331(); // tgen
};
//SIG(1 _ZN3aaa9GG1123331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11233313fooEv");}
aaa::GG1123331 ::~GG1123331(){ note_dtor("_ZN3aaa9GG1123331E", this);} // tgen
aaa::GG1123331 ::GG1123331(){ note_ctor("_ZN3aaa9GG1123331E", this);} // tgen
}
static void Test__ZN3aaa9GG1123331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123331E, buf);
    ::aaa::GG1123331 *dp, &lv = *(dp=new (buf) ::aaa::GG1123331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123331E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1123331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1123331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1123331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123331E);
    dp->::aaa::GG1123331::~GG1123331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123331E(Test__ZN3aaa9GG1123331E, "_ZN3aaa9GG1123331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123331C1Ev();
extern void _ZN3aaa9GG1123331D1Ev();
Name_Map name_map__ZN3aaa9GG1123331E[] = {
  NSPAIR(_ZN3aaa9GG1123331C1Ev),
  NSPAIR(_ZN3aaa9GG1123331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1123331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123331E[];
extern void _ZN3aaa9GG11233313fooEv();
extern void _ZN3aaa5EE1123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11233313fooEv,_ZThn8_N3aaa9GG11233313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233313fooEv,_ZThn20_N3aaa9GG11233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11233313fooEv,_ZThn28_N3aaa9GG11233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11233313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11233313fooEv,_ZThn8_N3aaa9GG11233313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233313fooEv,_ZThn20_N3aaa9GG11233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233313fooEv,_ZThn28_N3aaa9GG11233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123331E[];
Class_Descriptor cd__ZN3aaa9GG1123331E = {  "_ZN3aaa9GG1123331E", // class name
  bases__ZN3aaa9GG1123331E, 6,
  &(vtc__ZN3aaa9GG1123331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123332  : ::aaa::EE112 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11233323barEv
  ~GG1123332(); // tgen
  GG1123332(); // tgen
};
//SIG(1 _ZN3aaa9GG1123332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v4 v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1123332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11233323barEv");}
aaa::GG1123332 ::~GG1123332(){ note_dtor("_ZN3aaa9GG1123332E", this);} // tgen
aaa::GG1123332 ::GG1123332(){ note_ctor("_ZN3aaa9GG1123332E", this);} // tgen
}
static void Test__ZN3aaa9GG1123332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123332E, buf);
    ::aaa::GG1123332 *dp, &lv = *(dp=new (buf) ::aaa::GG1123332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123332E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1123332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1123332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1123332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123332E);
    dp->::aaa::GG1123332::~GG1123332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123332E(Test__ZN3aaa9GG1123332E, "_ZN3aaa9GG1123332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123332C1Ev();
extern void _ZN3aaa9GG1123332D1Ev();
Name_Map name_map__ZN3aaa9GG1123332E[] = {
  NSPAIR(_ZN3aaa9GG1123332C1Ev),
  NSPAIR(_ZN3aaa9GG1123332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1123332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG11233323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11233323barEv,_ZThn20_N3aaa9GG11233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11233323barEv,_ZThn28_N3aaa9GG11233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233323barEv,_ZThn20_N3aaa9GG11233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233323barEv,_ZThn28_N3aaa9GG11233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123332E[];
Class_Descriptor cd__ZN3aaa9GG1123332E = {  "_ZN3aaa9GG1123332E", // class name
  bases__ZN3aaa9GG1123332E, 6,
  &(vtc__ZN3aaa9GG1123332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1123333  : ::aaa::EE112 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11233333fooEv
  virtual void  bar(); // _ZN3aaa9GG11233333barEv
  ~GG1123333(); // tgen
  GG1123333(); // tgen
};
//SIG(1 _ZN3aaa9GG1123333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1123333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11233333fooEv");}
void  aaa::GG1123333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11233333barEv");}
aaa::GG1123333 ::~GG1123333(){ note_dtor("_ZN3aaa9GG1123333E", this);} // tgen
aaa::GG1123333 ::GG1123333(){ note_ctor("_ZN3aaa9GG1123333E", this);} // tgen
}
static void Test__ZN3aaa9GG1123333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1123333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1123333E, buf);
    ::aaa::GG1123333 *dp, &lv = *(dp=new (buf) ::aaa::GG1123333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1123333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1123333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE112*), 0, "_ZN3aaa9GG1123333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE112*), ABISELECT(16,8), "_ZN3aaa9GG1123333E");
    check_base_class_offset(lv, (::aaa::EE112*), 0, "_ZN3aaa9GG1123333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1123333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1123333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1123333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1123333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1123333E);
    dp->::aaa::GG1123333::~GG1123333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1123333E(Test__ZN3aaa9GG1123333E, "_ZN3aaa9GG1123333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1123333C1Ev();
extern void _ZN3aaa9GG1123333D1Ev();
Name_Map name_map__ZN3aaa9GG1123333E[] = {
  NSPAIR(_ZN3aaa9GG1123333C1Ev),
  NSPAIR(_ZN3aaa9GG1123333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE112E;
extern VTBL_ENTRY _ZTIN3aaa5EE112E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE112E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1123333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE112E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1123333E[];
extern void _ZN3aaa9GG11233333fooEv();
extern void _ZN3aaa9GG11233333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11233333fooEv,_ZThn8_N3aaa9GG11233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233333fooEv,_ZThn20_N3aaa9GG11233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11233333barEv,_ZThn20_N3aaa9GG11233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11233333fooEv,_ZThn28_N3aaa9GG11233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11233333barEv,_ZThn28_N3aaa9GG11233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1123333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11233333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11233333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11233333fooEv,_ZThn8_N3aaa9GG11233333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233333fooEv,_ZThn20_N3aaa9GG11233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11233333barEv,_ZThn20_N3aaa9GG11233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233333fooEv,_ZThn28_N3aaa9GG11233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11233333barEv,_ZThn28_N3aaa9GG11233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1123333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1123333E[];
Class_Descriptor cd__ZN3aaa9GG1123333E = {  "_ZN3aaa9GG1123333E", // class name
  bases__ZN3aaa9GG1123333E, 6,
  &(vtc__ZN3aaa9GG1123333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1123333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1123333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131111  : ::aaa::EE113 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11311113fooEv
  ~GG1131111(); // tgen
  GG1131111(); // tgen
};
//SIG(1 _ZN3aaa9GG1131111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11311113fooEv");}
aaa::GG1131111 ::~GG1131111(){ note_dtor("_ZN3aaa9GG1131111E", this);} // tgen
aaa::GG1131111 ::GG1131111(){ note_ctor("_ZN3aaa9GG1131111E", this);} // tgen
}
static void Test__ZN3aaa9GG1131111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131111E, buf);
    ::aaa::GG1131111 *dp, &lv = *(dp=new (buf) ::aaa::GG1131111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131111E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1131111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1131111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1131111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131111E);
    dp->::aaa::GG1131111::~GG1131111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131111E(Test__ZN3aaa9GG1131111E, "_ZN3aaa9GG1131111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131111C1Ev();
extern void _ZN3aaa9GG1131111D1Ev();
Name_Map name_map__ZN3aaa9GG1131111E[] = {
  NSPAIR(_ZN3aaa9GG1131111C1Ev),
  NSPAIR(_ZN3aaa9GG1131111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1131111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131111E[];
extern void _ZN3aaa9GG11311113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11311113fooEv,_ZThn8_N3aaa9GG11311113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11311113fooEv,_ZThn20_N3aaa9GG11311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11311113fooEv,_ZThn28_N3aaa9GG11311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11311113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11311113fooEv,_ZThn8_N3aaa9GG11311113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311113fooEv,_ZThn20_N3aaa9GG11311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11311113fooEv,_ZThn28_N3aaa9GG11311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131111E[];
Class_Descriptor cd__ZN3aaa9GG1131111E = {  "_ZN3aaa9GG1131111E", // class name
  bases__ZN3aaa9GG1131111E, 6,
  &(vtc__ZN3aaa9GG1131111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131112  : ::aaa::EE113 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11311123barEv
  ~GG1131112(); // tgen
  GG1131112(); // tgen
};
//SIG(1 _ZN3aaa9GG1131112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11311123barEv");}
aaa::GG1131112 ::~GG1131112(){ note_dtor("_ZN3aaa9GG1131112E", this);} // tgen
aaa::GG1131112 ::GG1131112(){ note_ctor("_ZN3aaa9GG1131112E", this);} // tgen
}
static void Test__ZN3aaa9GG1131112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131112E, buf);
    ::aaa::GG1131112 *dp, &lv = *(dp=new (buf) ::aaa::GG1131112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131112E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1131112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1131112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1131112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131112E);
    dp->::aaa::GG1131112::~GG1131112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131112E(Test__ZN3aaa9GG1131112E, "_ZN3aaa9GG1131112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131112C1Ev();
extern void _ZN3aaa9GG1131112D1Ev();
Name_Map name_map__ZN3aaa9GG1131112E[] = {
  NSPAIR(_ZN3aaa9GG1131112C1Ev),
  NSPAIR(_ZN3aaa9GG1131112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1131112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131112E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11311123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11311123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131112E[];
Class_Descriptor cd__ZN3aaa9GG1131112E = {  "_ZN3aaa9GG1131112E", // class name
  bases__ZN3aaa9GG1131112E, 6,
  &(vtc__ZN3aaa9GG1131112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131113  : ::aaa::EE113 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11311133fooEv
  virtual void  bar(); // _ZN3aaa9GG11311133barEv
  ~GG1131113(); // tgen
  GG1131113(); // tgen
};
//SIG(1 _ZN3aaa9GG1131113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11311133fooEv");}
void  aaa::GG1131113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11311133barEv");}
aaa::GG1131113 ::~GG1131113(){ note_dtor("_ZN3aaa9GG1131113E", this);} // tgen
aaa::GG1131113 ::GG1131113(){ note_ctor("_ZN3aaa9GG1131113E", this);} // tgen
}
static void Test__ZN3aaa9GG1131113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131113E, buf);
    ::aaa::GG1131113 *dp, &lv = *(dp=new (buf) ::aaa::GG1131113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131113E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1131113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1131113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1131113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131113E);
    dp->::aaa::GG1131113::~GG1131113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131113E(Test__ZN3aaa9GG1131113E, "_ZN3aaa9GG1131113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131113C1Ev();
extern void _ZN3aaa9GG1131113D1Ev();
Name_Map name_map__ZN3aaa9GG1131113E[] = {
  NSPAIR(_ZN3aaa9GG1131113C1Ev),
  NSPAIR(_ZN3aaa9GG1131113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1131113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131113E[];
extern void _ZN3aaa9GG11311133fooEv();
extern void _ZN3aaa9GG11311133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11311133fooEv,_ZThn8_N3aaa9GG11311133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11311133fooEv,_ZThn20_N3aaa9GG11311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11311133fooEv,_ZThn28_N3aaa9GG11311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11311133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11311133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11311133fooEv,_ZThn8_N3aaa9GG11311133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311133fooEv,_ZThn20_N3aaa9GG11311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11311133fooEv,_ZThn28_N3aaa9GG11311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131113E[];
Class_Descriptor cd__ZN3aaa9GG1131113E = {  "_ZN3aaa9GG1131113E", // class name
  bases__ZN3aaa9GG1131113E, 6,
  &(vtc__ZN3aaa9GG1131113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131121  : ::aaa::EE113 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11311213fooEv
  ~GG1131121(); // tgen
  GG1131121(); // tgen
};
//SIG(1 _ZN3aaa9GG1131121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11311213fooEv");}
aaa::GG1131121 ::~GG1131121(){ note_dtor("_ZN3aaa9GG1131121E", this);} // tgen
aaa::GG1131121 ::GG1131121(){ note_ctor("_ZN3aaa9GG1131121E", this);} // tgen
}
static void Test__ZN3aaa9GG1131121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131121E, buf);
    ::aaa::GG1131121 *dp, &lv = *(dp=new (buf) ::aaa::GG1131121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131121E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1131121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1131121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1131121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131121E);
    dp->::aaa::GG1131121::~GG1131121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131121E(Test__ZN3aaa9GG1131121E, "_ZN3aaa9GG1131121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131121C1Ev();
extern void _ZN3aaa9GG1131121D1Ev();
Name_Map name_map__ZN3aaa9GG1131121E[] = {
  NSPAIR(_ZN3aaa9GG1131121C1Ev),
  NSPAIR(_ZN3aaa9GG1131121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1131121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131121E[];
extern void _ZN3aaa9GG11311213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11311213fooEv,_ZThn8_N3aaa9GG11311213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11311213fooEv,_ZThn20_N3aaa9GG11311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11311213fooEv,_ZThn28_N3aaa9GG11311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11311213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11311213fooEv,_ZThn8_N3aaa9GG11311213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311213fooEv,_ZThn20_N3aaa9GG11311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11311213fooEv,_ZThn28_N3aaa9GG11311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131121E[];
Class_Descriptor cd__ZN3aaa9GG1131121E = {  "_ZN3aaa9GG1131121E", // class name
  bases__ZN3aaa9GG1131121E, 6,
  &(vtc__ZN3aaa9GG1131121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131122  : ::aaa::EE113 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11311223barEv
  ~GG1131122(); // tgen
  GG1131122(); // tgen
};
//SIG(1 _ZN3aaa9GG1131122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11311223barEv");}
aaa::GG1131122 ::~GG1131122(){ note_dtor("_ZN3aaa9GG1131122E", this);} // tgen
aaa::GG1131122 ::GG1131122(){ note_ctor("_ZN3aaa9GG1131122E", this);} // tgen
}
static void Test__ZN3aaa9GG1131122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131122E, buf);
    ::aaa::GG1131122 *dp, &lv = *(dp=new (buf) ::aaa::GG1131122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131122E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1131122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1131122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1131122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131122E);
    dp->::aaa::GG1131122::~GG1131122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131122E(Test__ZN3aaa9GG1131122E, "_ZN3aaa9GG1131122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131122C1Ev();
extern void _ZN3aaa9GG1131122D1Ev();
Name_Map name_map__ZN3aaa9GG1131122E[] = {
  NSPAIR(_ZN3aaa9GG1131122C1Ev),
  NSPAIR(_ZN3aaa9GG1131122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1131122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131122E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11311223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11311223barEv,_ZThn20_N3aaa9GG11311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11311223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311223barEv,_ZThn20_N3aaa9GG11311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131122E[];
Class_Descriptor cd__ZN3aaa9GG1131122E = {  "_ZN3aaa9GG1131122E", // class name
  bases__ZN3aaa9GG1131122E, 6,
  &(vtc__ZN3aaa9GG1131122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131123  : ::aaa::EE113 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11311233fooEv
  virtual void  bar(); // _ZN3aaa9GG11311233barEv
  ~GG1131123(); // tgen
  GG1131123(); // tgen
};
//SIG(1 _ZN3aaa9GG1131123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11311233fooEv");}
void  aaa::GG1131123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11311233barEv");}
aaa::GG1131123 ::~GG1131123(){ note_dtor("_ZN3aaa9GG1131123E", this);} // tgen
aaa::GG1131123 ::GG1131123(){ note_ctor("_ZN3aaa9GG1131123E", this);} // tgen
}
static void Test__ZN3aaa9GG1131123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131123E, buf);
    ::aaa::GG1131123 *dp, &lv = *(dp=new (buf) ::aaa::GG1131123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131123E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1131123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1131123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1131123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131123E);
    dp->::aaa::GG1131123::~GG1131123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131123E(Test__ZN3aaa9GG1131123E, "_ZN3aaa9GG1131123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131123C1Ev();
extern void _ZN3aaa9GG1131123D1Ev();
Name_Map name_map__ZN3aaa9GG1131123E[] = {
  NSPAIR(_ZN3aaa9GG1131123C1Ev),
  NSPAIR(_ZN3aaa9GG1131123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1131123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131123E[];
extern void _ZN3aaa9GG11311233fooEv();
extern void _ZN3aaa9GG11311233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11311233fooEv,_ZThn8_N3aaa9GG11311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11311233fooEv,_ZThn20_N3aaa9GG11311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11311233barEv,_ZThn20_N3aaa9GG11311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11311233fooEv,_ZThn28_N3aaa9GG11311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11311233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11311233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11311233fooEv,_ZThn8_N3aaa9GG11311233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311233fooEv,_ZThn20_N3aaa9GG11311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311233barEv,_ZThn20_N3aaa9GG11311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11311233fooEv,_ZThn28_N3aaa9GG11311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131123E[];
Class_Descriptor cd__ZN3aaa9GG1131123E = {  "_ZN3aaa9GG1131123E", // class name
  bases__ZN3aaa9GG1131123E, 6,
  &(vtc__ZN3aaa9GG1131123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131131  : ::aaa::EE113 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11311313fooEv
  ~GG1131131(); // tgen
  GG1131131(); // tgen
};
//SIG(1 _ZN3aaa9GG1131131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11311313fooEv");}
aaa::GG1131131 ::~GG1131131(){ note_dtor("_ZN3aaa9GG1131131E", this);} // tgen
aaa::GG1131131 ::GG1131131(){ note_ctor("_ZN3aaa9GG1131131E", this);} // tgen
}
static void Test__ZN3aaa9GG1131131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131131E, buf);
    ::aaa::GG1131131 *dp, &lv = *(dp=new (buf) ::aaa::GG1131131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131131E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1131131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1131131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1131131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131131E);
    dp->::aaa::GG1131131::~GG1131131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131131E(Test__ZN3aaa9GG1131131E, "_ZN3aaa9GG1131131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131131C1Ev();
extern void _ZN3aaa9GG1131131D1Ev();
Name_Map name_map__ZN3aaa9GG1131131E[] = {
  NSPAIR(_ZN3aaa9GG1131131C1Ev),
  NSPAIR(_ZN3aaa9GG1131131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1131131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131131E[];
extern void _ZN3aaa9GG11311313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11311313fooEv,_ZThn8_N3aaa9GG11311313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11311313fooEv,_ZThn20_N3aaa9GG11311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11311313fooEv,_ZThn28_N3aaa9GG11311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11311313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11311313fooEv,_ZThn8_N3aaa9GG11311313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311313fooEv,_ZThn20_N3aaa9GG11311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11311313fooEv,_ZThn28_N3aaa9GG11311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131131E[];
Class_Descriptor cd__ZN3aaa9GG1131131E = {  "_ZN3aaa9GG1131131E", // class name
  bases__ZN3aaa9GG1131131E, 6,
  &(vtc__ZN3aaa9GG1131131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131132  : ::aaa::EE113 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11311323barEv
  ~GG1131132(); // tgen
  GG1131132(); // tgen
};
//SIG(1 _ZN3aaa9GG1131132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11311323barEv");}
aaa::GG1131132 ::~GG1131132(){ note_dtor("_ZN3aaa9GG1131132E", this);} // tgen
aaa::GG1131132 ::GG1131132(){ note_ctor("_ZN3aaa9GG1131132E", this);} // tgen
}
static void Test__ZN3aaa9GG1131132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131132E, buf);
    ::aaa::GG1131132 *dp, &lv = *(dp=new (buf) ::aaa::GG1131132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131132E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1131132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1131132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1131132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131132E);
    dp->::aaa::GG1131132::~GG1131132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131132E(Test__ZN3aaa9GG1131132E, "_ZN3aaa9GG1131132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131132C1Ev();
extern void _ZN3aaa9GG1131132D1Ev();
Name_Map name_map__ZN3aaa9GG1131132E[] = {
  NSPAIR(_ZN3aaa9GG1131132C1Ev),
  NSPAIR(_ZN3aaa9GG1131132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1131132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131132E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11311323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11311323barEv,_ZThn20_N3aaa9GG11311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11311323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311323barEv,_ZThn20_N3aaa9GG11311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131132E[];
Class_Descriptor cd__ZN3aaa9GG1131132E = {  "_ZN3aaa9GG1131132E", // class name
  bases__ZN3aaa9GG1131132E, 6,
  &(vtc__ZN3aaa9GG1131132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131133  : ::aaa::EE113 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11311333fooEv
  virtual void  bar(); // _ZN3aaa9GG11311333barEv
  ~GG1131133(); // tgen
  GG1131133(); // tgen
};
//SIG(1 _ZN3aaa9GG1131133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11311333fooEv");}
void  aaa::GG1131133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11311333barEv");}
aaa::GG1131133 ::~GG1131133(){ note_dtor("_ZN3aaa9GG1131133E", this);} // tgen
aaa::GG1131133 ::GG1131133(){ note_ctor("_ZN3aaa9GG1131133E", this);} // tgen
}
static void Test__ZN3aaa9GG1131133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131133E, buf);
    ::aaa::GG1131133 *dp, &lv = *(dp=new (buf) ::aaa::GG1131133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131133E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1131133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1131133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1131133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131133E);
    dp->::aaa::GG1131133::~GG1131133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131133E(Test__ZN3aaa9GG1131133E, "_ZN3aaa9GG1131133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131133C1Ev();
extern void _ZN3aaa9GG1131133D1Ev();
Name_Map name_map__ZN3aaa9GG1131133E[] = {
  NSPAIR(_ZN3aaa9GG1131133C1Ev),
  NSPAIR(_ZN3aaa9GG1131133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1131133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131133E[];
extern void _ZN3aaa9GG11311333fooEv();
extern void _ZN3aaa9GG11311333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11311333fooEv,_ZThn8_N3aaa9GG11311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11311333fooEv,_ZThn20_N3aaa9GG11311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11311333barEv,_ZThn20_N3aaa9GG11311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11311333fooEv,_ZThn28_N3aaa9GG11311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11311333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11311333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11311333fooEv,_ZThn8_N3aaa9GG11311333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311333fooEv,_ZThn20_N3aaa9GG11311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11311333barEv,_ZThn20_N3aaa9GG11311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11311333fooEv,_ZThn28_N3aaa9GG11311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131133E[];
Class_Descriptor cd__ZN3aaa9GG1131133E = {  "_ZN3aaa9GG1131133E", // class name
  bases__ZN3aaa9GG1131133E, 6,
  &(vtc__ZN3aaa9GG1131133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131211  : ::aaa::EE113 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11312113fooEv
  ~GG1131211(); // tgen
  GG1131211(); // tgen
};
//SIG(1 _ZN3aaa9GG1131211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11312113fooEv");}
aaa::GG1131211 ::~GG1131211(){ note_dtor("_ZN3aaa9GG1131211E", this);} // tgen
aaa::GG1131211 ::GG1131211(){ note_ctor("_ZN3aaa9GG1131211E", this);} // tgen
}
static void Test__ZN3aaa9GG1131211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131211E, buf);
    ::aaa::GG1131211 *dp, &lv = *(dp=new (buf) ::aaa::GG1131211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131211E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1131211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1131211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1131211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131211E);
    dp->::aaa::GG1131211::~GG1131211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131211E(Test__ZN3aaa9GG1131211E, "_ZN3aaa9GG1131211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131211C1Ev();
extern void _ZN3aaa9GG1131211D1Ev();
Name_Map name_map__ZN3aaa9GG1131211E[] = {
  NSPAIR(_ZN3aaa9GG1131211C1Ev),
  NSPAIR(_ZN3aaa9GG1131211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1131211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131211E[];
extern void _ZN3aaa9GG11312113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11312113fooEv,_ZThn8_N3aaa9GG11312113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11312113fooEv,_ZThn20_N3aaa9GG11312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11312113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11312113fooEv,_ZThn8_N3aaa9GG11312113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312113fooEv,_ZThn20_N3aaa9GG11312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131211E[];
Class_Descriptor cd__ZN3aaa9GG1131211E = {  "_ZN3aaa9GG1131211E", // class name
  bases__ZN3aaa9GG1131211E, 6,
  &(vtc__ZN3aaa9GG1131211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131212  : ::aaa::EE113 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11312123barEv
  ~GG1131212(); // tgen
  GG1131212(); // tgen
};
//SIG(1 _ZN3aaa9GG1131212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11312123barEv");}
aaa::GG1131212 ::~GG1131212(){ note_dtor("_ZN3aaa9GG1131212E", this);} // tgen
aaa::GG1131212 ::GG1131212(){ note_ctor("_ZN3aaa9GG1131212E", this);} // tgen
}
static void Test__ZN3aaa9GG1131212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131212E, buf);
    ::aaa::GG1131212 *dp, &lv = *(dp=new (buf) ::aaa::GG1131212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131212E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1131212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1131212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1131212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131212E);
    dp->::aaa::GG1131212::~GG1131212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131212E(Test__ZN3aaa9GG1131212E, "_ZN3aaa9GG1131212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131212C1Ev();
extern void _ZN3aaa9GG1131212D1Ev();
Name_Map name_map__ZN3aaa9GG1131212E[] = {
  NSPAIR(_ZN3aaa9GG1131212C1Ev),
  NSPAIR(_ZN3aaa9GG1131212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1131212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131212E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11312123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11312123barEv,_ZThn28_N3aaa9GG11312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11312123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11312123barEv,_ZThn28_N3aaa9GG11312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131212E[];
Class_Descriptor cd__ZN3aaa9GG1131212E = {  "_ZN3aaa9GG1131212E", // class name
  bases__ZN3aaa9GG1131212E, 6,
  &(vtc__ZN3aaa9GG1131212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131213  : ::aaa::EE113 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11312133fooEv
  virtual void  bar(); // _ZN3aaa9GG11312133barEv
  ~GG1131213(); // tgen
  GG1131213(); // tgen
};
//SIG(1 _ZN3aaa9GG1131213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11312133fooEv");}
void  aaa::GG1131213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11312133barEv");}
aaa::GG1131213 ::~GG1131213(){ note_dtor("_ZN3aaa9GG1131213E", this);} // tgen
aaa::GG1131213 ::GG1131213(){ note_ctor("_ZN3aaa9GG1131213E", this);} // tgen
}
static void Test__ZN3aaa9GG1131213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131213E, buf);
    ::aaa::GG1131213 *dp, &lv = *(dp=new (buf) ::aaa::GG1131213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131213E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1131213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1131213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1131213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131213E);
    dp->::aaa::GG1131213::~GG1131213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131213E(Test__ZN3aaa9GG1131213E, "_ZN3aaa9GG1131213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131213C1Ev();
extern void _ZN3aaa9GG1131213D1Ev();
Name_Map name_map__ZN3aaa9GG1131213E[] = {
  NSPAIR(_ZN3aaa9GG1131213C1Ev),
  NSPAIR(_ZN3aaa9GG1131213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1131213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131213E[];
extern void _ZN3aaa9GG11312133fooEv();
extern void _ZN3aaa9GG11312133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11312133fooEv,_ZThn8_N3aaa9GG11312133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11312133fooEv,_ZThn20_N3aaa9GG11312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11312133barEv,_ZThn28_N3aaa9GG11312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11312133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11312133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11312133fooEv,_ZThn8_N3aaa9GG11312133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312133fooEv,_ZThn20_N3aaa9GG11312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11312133barEv,_ZThn28_N3aaa9GG11312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131213E[];
Class_Descriptor cd__ZN3aaa9GG1131213E = {  "_ZN3aaa9GG1131213E", // class name
  bases__ZN3aaa9GG1131213E, 6,
  &(vtc__ZN3aaa9GG1131213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131221  : ::aaa::EE113 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11312213fooEv
  ~GG1131221(); // tgen
  GG1131221(); // tgen
};
//SIG(1 _ZN3aaa9GG1131221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11312213fooEv");}
aaa::GG1131221 ::~GG1131221(){ note_dtor("_ZN3aaa9GG1131221E", this);} // tgen
aaa::GG1131221 ::GG1131221(){ note_ctor("_ZN3aaa9GG1131221E", this);} // tgen
}
static void Test__ZN3aaa9GG1131221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131221E, buf);
    ::aaa::GG1131221 *dp, &lv = *(dp=new (buf) ::aaa::GG1131221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131221E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1131221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1131221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1131221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131221E);
    dp->::aaa::GG1131221::~GG1131221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131221E(Test__ZN3aaa9GG1131221E, "_ZN3aaa9GG1131221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131221C1Ev();
extern void _ZN3aaa9GG1131221D1Ev();
Name_Map name_map__ZN3aaa9GG1131221E[] = {
  NSPAIR(_ZN3aaa9GG1131221C1Ev),
  NSPAIR(_ZN3aaa9GG1131221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1131221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131221E[];
extern void _ZN3aaa9GG11312213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11312213fooEv,_ZThn8_N3aaa9GG11312213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11312213fooEv,_ZThn20_N3aaa9GG11312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11312213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11312213fooEv,_ZThn8_N3aaa9GG11312213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312213fooEv,_ZThn20_N3aaa9GG11312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131221E[];
Class_Descriptor cd__ZN3aaa9GG1131221E = {  "_ZN3aaa9GG1131221E", // class name
  bases__ZN3aaa9GG1131221E, 6,
  &(vtc__ZN3aaa9GG1131221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131222  : ::aaa::EE113 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11312223barEv
  ~GG1131222(); // tgen
  GG1131222(); // tgen
};
//SIG(1 _ZN3aaa9GG1131222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11312223barEv");}
aaa::GG1131222 ::~GG1131222(){ note_dtor("_ZN3aaa9GG1131222E", this);} // tgen
aaa::GG1131222 ::GG1131222(){ note_ctor("_ZN3aaa9GG1131222E", this);} // tgen
}
static void Test__ZN3aaa9GG1131222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131222E, buf);
    ::aaa::GG1131222 *dp, &lv = *(dp=new (buf) ::aaa::GG1131222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131222E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1131222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1131222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1131222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131222E);
    dp->::aaa::GG1131222::~GG1131222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131222E(Test__ZN3aaa9GG1131222E, "_ZN3aaa9GG1131222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131222C1Ev();
extern void _ZN3aaa9GG1131222D1Ev();
Name_Map name_map__ZN3aaa9GG1131222E[] = {
  NSPAIR(_ZN3aaa9GG1131222C1Ev),
  NSPAIR(_ZN3aaa9GG1131222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1131222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131222E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11312223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11312223barEv,_ZThn20_N3aaa9GG11312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11312223barEv,_ZThn28_N3aaa9GG11312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11312223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312223barEv,_ZThn20_N3aaa9GG11312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11312223barEv,_ZThn28_N3aaa9GG11312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131222E[];
Class_Descriptor cd__ZN3aaa9GG1131222E = {  "_ZN3aaa9GG1131222E", // class name
  bases__ZN3aaa9GG1131222E, 6,
  &(vtc__ZN3aaa9GG1131222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131223  : ::aaa::EE113 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11312233fooEv
  virtual void  bar(); // _ZN3aaa9GG11312233barEv
  ~GG1131223(); // tgen
  GG1131223(); // tgen
};
//SIG(1 _ZN3aaa9GG1131223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11312233fooEv");}
void  aaa::GG1131223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11312233barEv");}
aaa::GG1131223 ::~GG1131223(){ note_dtor("_ZN3aaa9GG1131223E", this);} // tgen
aaa::GG1131223 ::GG1131223(){ note_ctor("_ZN3aaa9GG1131223E", this);} // tgen
}
static void Test__ZN3aaa9GG1131223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131223E, buf);
    ::aaa::GG1131223 *dp, &lv = *(dp=new (buf) ::aaa::GG1131223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131223E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1131223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1131223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1131223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131223E);
    dp->::aaa::GG1131223::~GG1131223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131223E(Test__ZN3aaa9GG1131223E, "_ZN3aaa9GG1131223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131223C1Ev();
extern void _ZN3aaa9GG1131223D1Ev();
Name_Map name_map__ZN3aaa9GG1131223E[] = {
  NSPAIR(_ZN3aaa9GG1131223C1Ev),
  NSPAIR(_ZN3aaa9GG1131223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1131223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131223E[];
extern void _ZN3aaa9GG11312233fooEv();
extern void _ZN3aaa9GG11312233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11312233fooEv,_ZThn8_N3aaa9GG11312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11312233fooEv,_ZThn20_N3aaa9GG11312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11312233barEv,_ZThn20_N3aaa9GG11312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11312233barEv,_ZThn28_N3aaa9GG11312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11312233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11312233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11312233fooEv,_ZThn8_N3aaa9GG11312233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312233fooEv,_ZThn20_N3aaa9GG11312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312233barEv,_ZThn20_N3aaa9GG11312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11312233barEv,_ZThn28_N3aaa9GG11312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131223E[];
Class_Descriptor cd__ZN3aaa9GG1131223E = {  "_ZN3aaa9GG1131223E", // class name
  bases__ZN3aaa9GG1131223E, 6,
  &(vtc__ZN3aaa9GG1131223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131231  : ::aaa::EE113 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11312313fooEv
  ~GG1131231(); // tgen
  GG1131231(); // tgen
};
//SIG(1 _ZN3aaa9GG1131231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11312313fooEv");}
aaa::GG1131231 ::~GG1131231(){ note_dtor("_ZN3aaa9GG1131231E", this);} // tgen
aaa::GG1131231 ::GG1131231(){ note_ctor("_ZN3aaa9GG1131231E", this);} // tgen
}
static void Test__ZN3aaa9GG1131231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131231E, buf);
    ::aaa::GG1131231 *dp, &lv = *(dp=new (buf) ::aaa::GG1131231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131231E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1131231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1131231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1131231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131231E);
    dp->::aaa::GG1131231::~GG1131231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131231E(Test__ZN3aaa9GG1131231E, "_ZN3aaa9GG1131231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131231C1Ev();
extern void _ZN3aaa9GG1131231D1Ev();
Name_Map name_map__ZN3aaa9GG1131231E[] = {
  NSPAIR(_ZN3aaa9GG1131231C1Ev),
  NSPAIR(_ZN3aaa9GG1131231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1131231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131231E[];
extern void _ZN3aaa9GG11312313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11312313fooEv,_ZThn8_N3aaa9GG11312313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11312313fooEv,_ZThn20_N3aaa9GG11312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11312313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11312313fooEv,_ZThn8_N3aaa9GG11312313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312313fooEv,_ZThn20_N3aaa9GG11312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131231E[];
Class_Descriptor cd__ZN3aaa9GG1131231E = {  "_ZN3aaa9GG1131231E", // class name
  bases__ZN3aaa9GG1131231E, 6,
  &(vtc__ZN3aaa9GG1131231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131232  : ::aaa::EE113 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11312323barEv
  ~GG1131232(); // tgen
  GG1131232(); // tgen
};
//SIG(1 _ZN3aaa9GG1131232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11312323barEv");}
aaa::GG1131232 ::~GG1131232(){ note_dtor("_ZN3aaa9GG1131232E", this);} // tgen
aaa::GG1131232 ::GG1131232(){ note_ctor("_ZN3aaa9GG1131232E", this);} // tgen
}
static void Test__ZN3aaa9GG1131232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131232E, buf);
    ::aaa::GG1131232 *dp, &lv = *(dp=new (buf) ::aaa::GG1131232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131232E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1131232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1131232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1131232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131232E);
    dp->::aaa::GG1131232::~GG1131232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131232E(Test__ZN3aaa9GG1131232E, "_ZN3aaa9GG1131232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131232C1Ev();
extern void _ZN3aaa9GG1131232D1Ev();
Name_Map name_map__ZN3aaa9GG1131232E[] = {
  NSPAIR(_ZN3aaa9GG1131232C1Ev),
  NSPAIR(_ZN3aaa9GG1131232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1131232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131232E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11312323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11312323barEv,_ZThn20_N3aaa9GG11312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11312323barEv,_ZThn28_N3aaa9GG11312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11312323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312323barEv,_ZThn20_N3aaa9GG11312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11312323barEv,_ZThn28_N3aaa9GG11312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131232E[];
Class_Descriptor cd__ZN3aaa9GG1131232E = {  "_ZN3aaa9GG1131232E", // class name
  bases__ZN3aaa9GG1131232E, 6,
  &(vtc__ZN3aaa9GG1131232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131233  : ::aaa::EE113 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11312333fooEv
  virtual void  bar(); // _ZN3aaa9GG11312333barEv
  ~GG1131233(); // tgen
  GG1131233(); // tgen
};
//SIG(1 _ZN3aaa9GG1131233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11312333fooEv");}
void  aaa::GG1131233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11312333barEv");}
aaa::GG1131233 ::~GG1131233(){ note_dtor("_ZN3aaa9GG1131233E", this);} // tgen
aaa::GG1131233 ::GG1131233(){ note_ctor("_ZN3aaa9GG1131233E", this);} // tgen
}
static void Test__ZN3aaa9GG1131233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131233E, buf);
    ::aaa::GG1131233 *dp, &lv = *(dp=new (buf) ::aaa::GG1131233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131233E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1131233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1131233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1131233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131233E);
    dp->::aaa::GG1131233::~GG1131233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131233E(Test__ZN3aaa9GG1131233E, "_ZN3aaa9GG1131233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131233C1Ev();
extern void _ZN3aaa9GG1131233D1Ev();
Name_Map name_map__ZN3aaa9GG1131233E[] = {
  NSPAIR(_ZN3aaa9GG1131233C1Ev),
  NSPAIR(_ZN3aaa9GG1131233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1131233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131233E[];
extern void _ZN3aaa9GG11312333fooEv();
extern void _ZN3aaa9GG11312333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11312333fooEv,_ZThn8_N3aaa9GG11312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11312333fooEv,_ZThn20_N3aaa9GG11312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11312333barEv,_ZThn20_N3aaa9GG11312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11312333barEv,_ZThn28_N3aaa9GG11312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11312333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11312333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11312333fooEv,_ZThn8_N3aaa9GG11312333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312333fooEv,_ZThn20_N3aaa9GG11312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11312333barEv,_ZThn20_N3aaa9GG11312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11312333barEv,_ZThn28_N3aaa9GG11312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131233E[];
Class_Descriptor cd__ZN3aaa9GG1131233E = {  "_ZN3aaa9GG1131233E", // class name
  bases__ZN3aaa9GG1131233E, 6,
  &(vtc__ZN3aaa9GG1131233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131311  : ::aaa::EE113 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11313113fooEv
  ~GG1131311(); // tgen
  GG1131311(); // tgen
};
//SIG(1 _ZN3aaa9GG1131311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11313113fooEv");}
aaa::GG1131311 ::~GG1131311(){ note_dtor("_ZN3aaa9GG1131311E", this);} // tgen
aaa::GG1131311 ::GG1131311(){ note_ctor("_ZN3aaa9GG1131311E", this);} // tgen
}
static void Test__ZN3aaa9GG1131311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131311E, buf);
    ::aaa::GG1131311 *dp, &lv = *(dp=new (buf) ::aaa::GG1131311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131311E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1131311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1131311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1131311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131311E);
    dp->::aaa::GG1131311::~GG1131311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131311E(Test__ZN3aaa9GG1131311E, "_ZN3aaa9GG1131311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131311C1Ev();
extern void _ZN3aaa9GG1131311D1Ev();
Name_Map name_map__ZN3aaa9GG1131311E[] = {
  NSPAIR(_ZN3aaa9GG1131311C1Ev),
  NSPAIR(_ZN3aaa9GG1131311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1131311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131311E[];
extern void _ZN3aaa9GG11313113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11313113fooEv,_ZThn8_N3aaa9GG11313113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11313113fooEv,_ZThn20_N3aaa9GG11313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313113fooEv,_ZThn28_N3aaa9GG11313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11313113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11313113fooEv,_ZThn8_N3aaa9GG11313113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313113fooEv,_ZThn20_N3aaa9GG11313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313113fooEv,_ZThn28_N3aaa9GG11313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131311E[];
Class_Descriptor cd__ZN3aaa9GG1131311E = {  "_ZN3aaa9GG1131311E", // class name
  bases__ZN3aaa9GG1131311E, 6,
  &(vtc__ZN3aaa9GG1131311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131312  : ::aaa::EE113 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11313123barEv
  ~GG1131312(); // tgen
  GG1131312(); // tgen
};
//SIG(1 _ZN3aaa9GG1131312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11313123barEv");}
aaa::GG1131312 ::~GG1131312(){ note_dtor("_ZN3aaa9GG1131312E", this);} // tgen
aaa::GG1131312 ::GG1131312(){ note_ctor("_ZN3aaa9GG1131312E", this);} // tgen
}
static void Test__ZN3aaa9GG1131312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131312E, buf);
    ::aaa::GG1131312 *dp, &lv = *(dp=new (buf) ::aaa::GG1131312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131312E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1131312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1131312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1131312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131312E);
    dp->::aaa::GG1131312::~GG1131312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131312E(Test__ZN3aaa9GG1131312E, "_ZN3aaa9GG1131312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131312C1Ev();
extern void _ZN3aaa9GG1131312D1Ev();
Name_Map name_map__ZN3aaa9GG1131312E[] = {
  NSPAIR(_ZN3aaa9GG1131312C1Ev),
  NSPAIR(_ZN3aaa9GG1131312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1131312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131312E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11313123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313123barEv,_ZThn28_N3aaa9GG11313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11313123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313123barEv,_ZThn28_N3aaa9GG11313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131312E[];
Class_Descriptor cd__ZN3aaa9GG1131312E = {  "_ZN3aaa9GG1131312E", // class name
  bases__ZN3aaa9GG1131312E, 6,
  &(vtc__ZN3aaa9GG1131312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131313  : ::aaa::EE113 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11313133fooEv
  virtual void  bar(); // _ZN3aaa9GG11313133barEv
  ~GG1131313(); // tgen
  GG1131313(); // tgen
};
//SIG(1 _ZN3aaa9GG1131313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11313133fooEv");}
void  aaa::GG1131313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11313133barEv");}
aaa::GG1131313 ::~GG1131313(){ note_dtor("_ZN3aaa9GG1131313E", this);} // tgen
aaa::GG1131313 ::GG1131313(){ note_ctor("_ZN3aaa9GG1131313E", this);} // tgen
}
static void Test__ZN3aaa9GG1131313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131313E, buf);
    ::aaa::GG1131313 *dp, &lv = *(dp=new (buf) ::aaa::GG1131313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131313E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1131313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1131313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1131313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131313E);
    dp->::aaa::GG1131313::~GG1131313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131313E(Test__ZN3aaa9GG1131313E, "_ZN3aaa9GG1131313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131313C1Ev();
extern void _ZN3aaa9GG1131313D1Ev();
Name_Map name_map__ZN3aaa9GG1131313E[] = {
  NSPAIR(_ZN3aaa9GG1131313C1Ev),
  NSPAIR(_ZN3aaa9GG1131313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1131313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131313E[];
extern void _ZN3aaa9GG11313133fooEv();
extern void _ZN3aaa9GG11313133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11313133fooEv,_ZThn8_N3aaa9GG11313133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11313133fooEv,_ZThn20_N3aaa9GG11313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313133fooEv,_ZThn28_N3aaa9GG11313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313133barEv,_ZThn28_N3aaa9GG11313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11313133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11313133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11313133fooEv,_ZThn8_N3aaa9GG11313133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313133fooEv,_ZThn20_N3aaa9GG11313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313133fooEv,_ZThn28_N3aaa9GG11313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313133barEv,_ZThn28_N3aaa9GG11313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131313E[];
Class_Descriptor cd__ZN3aaa9GG1131313E = {  "_ZN3aaa9GG1131313E", // class name
  bases__ZN3aaa9GG1131313E, 6,
  &(vtc__ZN3aaa9GG1131313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131321  : ::aaa::EE113 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11313213fooEv
  ~GG1131321(); // tgen
  GG1131321(); // tgen
};
//SIG(1 _ZN3aaa9GG1131321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11313213fooEv");}
aaa::GG1131321 ::~GG1131321(){ note_dtor("_ZN3aaa9GG1131321E", this);} // tgen
aaa::GG1131321 ::GG1131321(){ note_ctor("_ZN3aaa9GG1131321E", this);} // tgen
}
static void Test__ZN3aaa9GG1131321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131321E, buf);
    ::aaa::GG1131321 *dp, &lv = *(dp=new (buf) ::aaa::GG1131321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131321E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1131321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1131321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1131321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131321E);
    dp->::aaa::GG1131321::~GG1131321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131321E(Test__ZN3aaa9GG1131321E, "_ZN3aaa9GG1131321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131321C1Ev();
extern void _ZN3aaa9GG1131321D1Ev();
Name_Map name_map__ZN3aaa9GG1131321E[] = {
  NSPAIR(_ZN3aaa9GG1131321C1Ev),
  NSPAIR(_ZN3aaa9GG1131321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1131321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131321E[];
extern void _ZN3aaa9GG11313213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11313213fooEv,_ZThn8_N3aaa9GG11313213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11313213fooEv,_ZThn20_N3aaa9GG11313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11313213fooEv,_ZThn28_N3aaa9GG11313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11313213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11313213fooEv,_ZThn8_N3aaa9GG11313213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313213fooEv,_ZThn20_N3aaa9GG11313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313213fooEv,_ZThn28_N3aaa9GG11313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131321E[];
Class_Descriptor cd__ZN3aaa9GG1131321E = {  "_ZN3aaa9GG1131321E", // class name
  bases__ZN3aaa9GG1131321E, 6,
  &(vtc__ZN3aaa9GG1131321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131322  : ::aaa::EE113 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11313223barEv
  ~GG1131322(); // tgen
  GG1131322(); // tgen
};
//SIG(1 _ZN3aaa9GG1131322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11313223barEv");}
aaa::GG1131322 ::~GG1131322(){ note_dtor("_ZN3aaa9GG1131322E", this);} // tgen
aaa::GG1131322 ::GG1131322(){ note_ctor("_ZN3aaa9GG1131322E", this);} // tgen
}
static void Test__ZN3aaa9GG1131322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131322E, buf);
    ::aaa::GG1131322 *dp, &lv = *(dp=new (buf) ::aaa::GG1131322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131322E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1131322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1131322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1131322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131322E);
    dp->::aaa::GG1131322::~GG1131322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131322E(Test__ZN3aaa9GG1131322E, "_ZN3aaa9GG1131322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131322C1Ev();
extern void _ZN3aaa9GG1131322D1Ev();
Name_Map name_map__ZN3aaa9GG1131322E[] = {
  NSPAIR(_ZN3aaa9GG1131322C1Ev),
  NSPAIR(_ZN3aaa9GG1131322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1131322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131322E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11313223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11313223barEv,_ZThn20_N3aaa9GG11313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11313223barEv,_ZThn28_N3aaa9GG11313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11313223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313223barEv,_ZThn20_N3aaa9GG11313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313223barEv,_ZThn28_N3aaa9GG11313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131322E[];
Class_Descriptor cd__ZN3aaa9GG1131322E = {  "_ZN3aaa9GG1131322E", // class name
  bases__ZN3aaa9GG1131322E, 6,
  &(vtc__ZN3aaa9GG1131322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131323  : ::aaa::EE113 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11313233fooEv
  virtual void  bar(); // _ZN3aaa9GG11313233barEv
  ~GG1131323(); // tgen
  GG1131323(); // tgen
};
//SIG(1 _ZN3aaa9GG1131323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11313233fooEv");}
void  aaa::GG1131323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11313233barEv");}
aaa::GG1131323 ::~GG1131323(){ note_dtor("_ZN3aaa9GG1131323E", this);} // tgen
aaa::GG1131323 ::GG1131323(){ note_ctor("_ZN3aaa9GG1131323E", this);} // tgen
}
static void Test__ZN3aaa9GG1131323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131323E, buf);
    ::aaa::GG1131323 *dp, &lv = *(dp=new (buf) ::aaa::GG1131323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131323E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1131323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1131323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1131323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131323E);
    dp->::aaa::GG1131323::~GG1131323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131323E(Test__ZN3aaa9GG1131323E, "_ZN3aaa9GG1131323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131323C1Ev();
extern void _ZN3aaa9GG1131323D1Ev();
Name_Map name_map__ZN3aaa9GG1131323E[] = {
  NSPAIR(_ZN3aaa9GG1131323C1Ev),
  NSPAIR(_ZN3aaa9GG1131323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1131323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131323E[];
extern void _ZN3aaa9GG11313233fooEv();
extern void _ZN3aaa9GG11313233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11313233fooEv,_ZThn8_N3aaa9GG11313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11313233fooEv,_ZThn20_N3aaa9GG11313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11313233barEv,_ZThn20_N3aaa9GG11313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313233fooEv,_ZThn28_N3aaa9GG11313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313233barEv,_ZThn28_N3aaa9GG11313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11313233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11313233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11313233fooEv,_ZThn8_N3aaa9GG11313233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313233fooEv,_ZThn20_N3aaa9GG11313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313233barEv,_ZThn20_N3aaa9GG11313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313233fooEv,_ZThn28_N3aaa9GG11313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313233barEv,_ZThn28_N3aaa9GG11313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131323E[];
Class_Descriptor cd__ZN3aaa9GG1131323E = {  "_ZN3aaa9GG1131323E", // class name
  bases__ZN3aaa9GG1131323E, 6,
  &(vtc__ZN3aaa9GG1131323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131331  : ::aaa::EE113 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11313313fooEv
  ~GG1131331(); // tgen
  GG1131331(); // tgen
};
//SIG(1 _ZN3aaa9GG1131331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11313313fooEv");}
aaa::GG1131331 ::~GG1131331(){ note_dtor("_ZN3aaa9GG1131331E", this);} // tgen
aaa::GG1131331 ::GG1131331(){ note_ctor("_ZN3aaa9GG1131331E", this);} // tgen
}
static void Test__ZN3aaa9GG1131331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131331E, buf);
    ::aaa::GG1131331 *dp, &lv = *(dp=new (buf) ::aaa::GG1131331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131331E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1131331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1131331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1131331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131331E);
    dp->::aaa::GG1131331::~GG1131331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131331E(Test__ZN3aaa9GG1131331E, "_ZN3aaa9GG1131331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131331C1Ev();
extern void _ZN3aaa9GG1131331D1Ev();
Name_Map name_map__ZN3aaa9GG1131331E[] = {
  NSPAIR(_ZN3aaa9GG1131331C1Ev),
  NSPAIR(_ZN3aaa9GG1131331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1131331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131331E[];
extern void _ZN3aaa9GG11313313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11313313fooEv,_ZThn8_N3aaa9GG11313313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11313313fooEv,_ZThn20_N3aaa9GG11313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11313313fooEv,_ZThn28_N3aaa9GG11313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11313313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11313313fooEv,_ZThn8_N3aaa9GG11313313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313313fooEv,_ZThn20_N3aaa9GG11313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313313fooEv,_ZThn28_N3aaa9GG11313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131331E[];
Class_Descriptor cd__ZN3aaa9GG1131331E = {  "_ZN3aaa9GG1131331E", // class name
  bases__ZN3aaa9GG1131331E, 6,
  &(vtc__ZN3aaa9GG1131331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131332  : ::aaa::EE113 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11313323barEv
  ~GG1131332(); // tgen
  GG1131332(); // tgen
};
//SIG(1 _ZN3aaa9GG1131332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1131332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11313323barEv");}
aaa::GG1131332 ::~GG1131332(){ note_dtor("_ZN3aaa9GG1131332E", this);} // tgen
aaa::GG1131332 ::GG1131332(){ note_ctor("_ZN3aaa9GG1131332E", this);} // tgen
}
static void Test__ZN3aaa9GG1131332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131332E, buf);
    ::aaa::GG1131332 *dp, &lv = *(dp=new (buf) ::aaa::GG1131332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131332E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1131332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1131332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1131332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131332E);
    dp->::aaa::GG1131332::~GG1131332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131332E(Test__ZN3aaa9GG1131332E, "_ZN3aaa9GG1131332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131332C1Ev();
extern void _ZN3aaa9GG1131332D1Ev();
Name_Map name_map__ZN3aaa9GG1131332E[] = {
  NSPAIR(_ZN3aaa9GG1131332C1Ev),
  NSPAIR(_ZN3aaa9GG1131332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1131332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131332E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11313323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11313323barEv,_ZThn20_N3aaa9GG11313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313323barEv,_ZThn28_N3aaa9GG11313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11313323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313323barEv,_ZThn20_N3aaa9GG11313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313323barEv,_ZThn28_N3aaa9GG11313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131332E[];
Class_Descriptor cd__ZN3aaa9GG1131332E = {  "_ZN3aaa9GG1131332E", // class name
  bases__ZN3aaa9GG1131332E, 6,
  &(vtc__ZN3aaa9GG1131332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1131333  : ::aaa::EE113 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11313333fooEv
  virtual void  bar(); // _ZN3aaa9GG11313333barEv
  ~GG1131333(); // tgen
  GG1131333(); // tgen
};
//SIG(1 _ZN3aaa9GG1131333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1131333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11313333fooEv");}
void  aaa::GG1131333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11313333barEv");}
aaa::GG1131333 ::~GG1131333(){ note_dtor("_ZN3aaa9GG1131333E", this);} // tgen
aaa::GG1131333 ::GG1131333(){ note_ctor("_ZN3aaa9GG1131333E", this);} // tgen
}
static void Test__ZN3aaa9GG1131333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1131333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1131333E, buf);
    ::aaa::GG1131333 *dp, &lv = *(dp=new (buf) ::aaa::GG1131333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1131333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1131333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1131333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1131333E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1131333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1131333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1131333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1131333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1131333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1131333E);
    dp->::aaa::GG1131333::~GG1131333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1131333E(Test__ZN3aaa9GG1131333E, "_ZN3aaa9GG1131333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1131333C1Ev();
extern void _ZN3aaa9GG1131333D1Ev();
Name_Map name_map__ZN3aaa9GG1131333E[] = {
  NSPAIR(_ZN3aaa9GG1131333C1Ev),
  NSPAIR(_ZN3aaa9GG1131333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1131333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1131333E[];
extern void _ZN3aaa9GG11313333fooEv();
extern void _ZN3aaa9GG11313333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11313333fooEv,_ZThn8_N3aaa9GG11313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11313333fooEv,_ZThn20_N3aaa9GG11313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11313333barEv,_ZThn20_N3aaa9GG11313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313333fooEv,_ZThn28_N3aaa9GG11313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11313333barEv,_ZThn28_N3aaa9GG11313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1131333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11313333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11313333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11313333fooEv,_ZThn8_N3aaa9GG11313333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313333fooEv,_ZThn20_N3aaa9GG11313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11313333barEv,_ZThn20_N3aaa9GG11313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313333fooEv,_ZThn28_N3aaa9GG11313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11313333barEv,_ZThn28_N3aaa9GG11313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1131333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1131333E[];
Class_Descriptor cd__ZN3aaa9GG1131333E = {  "_ZN3aaa9GG1131333E", // class name
  bases__ZN3aaa9GG1131333E, 6,
  &(vtc__ZN3aaa9GG1131333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1131333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1131333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132111  : ::aaa::EE113 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11321113fooEv
  ~GG1132111(); // tgen
  GG1132111(); // tgen
};
//SIG(1 _ZN3aaa9GG1132111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11321113fooEv");}
aaa::GG1132111 ::~GG1132111(){ note_dtor("_ZN3aaa9GG1132111E", this);} // tgen
aaa::GG1132111 ::GG1132111(){ note_ctor("_ZN3aaa9GG1132111E", this);} // tgen
}
static void Test__ZN3aaa9GG1132111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132111E, buf);
    ::aaa::GG1132111 *dp, &lv = *(dp=new (buf) ::aaa::GG1132111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132111E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1132111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1132111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1132111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132111E);
    dp->::aaa::GG1132111::~GG1132111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132111E(Test__ZN3aaa9GG1132111E, "_ZN3aaa9GG1132111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132111C1Ev();
extern void _ZN3aaa9GG1132111D1Ev();
Name_Map name_map__ZN3aaa9GG1132111E[] = {
  NSPAIR(_ZN3aaa9GG1132111C1Ev),
  NSPAIR(_ZN3aaa9GG1132111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1132111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132111E[];
extern void _ZN3aaa9GG11321113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11321113fooEv,_ZThn8_N3aaa9GG11321113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11321113fooEv,_ZThn20_N3aaa9GG11321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11321113fooEv,_ZThn28_N3aaa9GG11321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11321113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11321113fooEv,_ZThn8_N3aaa9GG11321113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321113fooEv,_ZThn20_N3aaa9GG11321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11321113fooEv,_ZThn28_N3aaa9GG11321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132111E[];
Class_Descriptor cd__ZN3aaa9GG1132111E = {  "_ZN3aaa9GG1132111E", // class name
  bases__ZN3aaa9GG1132111E, 6,
  &(vtc__ZN3aaa9GG1132111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132112  : ::aaa::EE113 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11321123barEv
  ~GG1132112(); // tgen
  GG1132112(); // tgen
};
//SIG(1 _ZN3aaa9GG1132112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11321123barEv");}
aaa::GG1132112 ::~GG1132112(){ note_dtor("_ZN3aaa9GG1132112E", this);} // tgen
aaa::GG1132112 ::GG1132112(){ note_ctor("_ZN3aaa9GG1132112E", this);} // tgen
}
static void Test__ZN3aaa9GG1132112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132112E, buf);
    ::aaa::GG1132112 *dp, &lv = *(dp=new (buf) ::aaa::GG1132112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132112E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1132112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1132112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1132112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132112E);
    dp->::aaa::GG1132112::~GG1132112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132112E(Test__ZN3aaa9GG1132112E, "_ZN3aaa9GG1132112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132112C1Ev();
extern void _ZN3aaa9GG1132112D1Ev();
Name_Map name_map__ZN3aaa9GG1132112E[] = {
  NSPAIR(_ZN3aaa9GG1132112C1Ev),
  NSPAIR(_ZN3aaa9GG1132112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1132112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132112E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11321123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11321123barEv,_ZThn20_N3aaa9GG11321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11321123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321123barEv,_ZThn20_N3aaa9GG11321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132112E[];
Class_Descriptor cd__ZN3aaa9GG1132112E = {  "_ZN3aaa9GG1132112E", // class name
  bases__ZN3aaa9GG1132112E, 6,
  &(vtc__ZN3aaa9GG1132112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132113  : ::aaa::EE113 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11321133fooEv
  virtual void  bar(); // _ZN3aaa9GG11321133barEv
  ~GG1132113(); // tgen
  GG1132113(); // tgen
};
//SIG(1 _ZN3aaa9GG1132113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11321133fooEv");}
void  aaa::GG1132113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11321133barEv");}
aaa::GG1132113 ::~GG1132113(){ note_dtor("_ZN3aaa9GG1132113E", this);} // tgen
aaa::GG1132113 ::GG1132113(){ note_ctor("_ZN3aaa9GG1132113E", this);} // tgen
}
static void Test__ZN3aaa9GG1132113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132113E, buf);
    ::aaa::GG1132113 *dp, &lv = *(dp=new (buf) ::aaa::GG1132113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132113E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1132113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1132113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1132113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132113E);
    dp->::aaa::GG1132113::~GG1132113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132113E(Test__ZN3aaa9GG1132113E, "_ZN3aaa9GG1132113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132113C1Ev();
extern void _ZN3aaa9GG1132113D1Ev();
Name_Map name_map__ZN3aaa9GG1132113E[] = {
  NSPAIR(_ZN3aaa9GG1132113C1Ev),
  NSPAIR(_ZN3aaa9GG1132113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1132113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132113E[];
extern void _ZN3aaa9GG11321133fooEv();
extern void _ZN3aaa9GG11321133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11321133fooEv,_ZThn8_N3aaa9GG11321133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11321133barEv,_ZThn20_N3aaa9GG11321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11321133fooEv,_ZThn20_N3aaa9GG11321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11321133fooEv,_ZThn28_N3aaa9GG11321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11321133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11321133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11321133fooEv,_ZThn8_N3aaa9GG11321133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321133barEv,_ZThn20_N3aaa9GG11321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321133fooEv,_ZThn20_N3aaa9GG11321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11321133fooEv,_ZThn28_N3aaa9GG11321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132113E[];
Class_Descriptor cd__ZN3aaa9GG1132113E = {  "_ZN3aaa9GG1132113E", // class name
  bases__ZN3aaa9GG1132113E, 6,
  &(vtc__ZN3aaa9GG1132113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132121  : ::aaa::EE113 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11321213fooEv
  ~GG1132121(); // tgen
  GG1132121(); // tgen
};
//SIG(1 _ZN3aaa9GG1132121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11321213fooEv");}
aaa::GG1132121 ::~GG1132121(){ note_dtor("_ZN3aaa9GG1132121E", this);} // tgen
aaa::GG1132121 ::GG1132121(){ note_ctor("_ZN3aaa9GG1132121E", this);} // tgen
}
static void Test__ZN3aaa9GG1132121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132121E, buf);
    ::aaa::GG1132121 *dp, &lv = *(dp=new (buf) ::aaa::GG1132121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132121E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1132121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1132121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1132121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132121E);
    dp->::aaa::GG1132121::~GG1132121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132121E(Test__ZN3aaa9GG1132121E, "_ZN3aaa9GG1132121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132121C1Ev();
extern void _ZN3aaa9GG1132121D1Ev();
Name_Map name_map__ZN3aaa9GG1132121E[] = {
  NSPAIR(_ZN3aaa9GG1132121C1Ev),
  NSPAIR(_ZN3aaa9GG1132121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1132121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132121E[];
extern void _ZN3aaa9GG11321213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11321213fooEv,_ZThn8_N3aaa9GG11321213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11321213fooEv,_ZThn28_N3aaa9GG11321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11321213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11321213fooEv,_ZThn8_N3aaa9GG11321213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11321213fooEv,_ZThn28_N3aaa9GG11321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132121E[];
Class_Descriptor cd__ZN3aaa9GG1132121E = {  "_ZN3aaa9GG1132121E", // class name
  bases__ZN3aaa9GG1132121E, 6,
  &(vtc__ZN3aaa9GG1132121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132122  : ::aaa::EE113 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11321223barEv
  ~GG1132122(); // tgen
  GG1132122(); // tgen
};
//SIG(1 _ZN3aaa9GG1132122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11321223barEv");}
aaa::GG1132122 ::~GG1132122(){ note_dtor("_ZN3aaa9GG1132122E", this);} // tgen
aaa::GG1132122 ::GG1132122(){ note_ctor("_ZN3aaa9GG1132122E", this);} // tgen
}
static void Test__ZN3aaa9GG1132122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132122E, buf);
    ::aaa::GG1132122 *dp, &lv = *(dp=new (buf) ::aaa::GG1132122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132122E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1132122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1132122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1132122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132122E);
    dp->::aaa::GG1132122::~GG1132122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132122E(Test__ZN3aaa9GG1132122E, "_ZN3aaa9GG1132122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132122C1Ev();
extern void _ZN3aaa9GG1132122D1Ev();
Name_Map name_map__ZN3aaa9GG1132122E[] = {
  NSPAIR(_ZN3aaa9GG1132122C1Ev),
  NSPAIR(_ZN3aaa9GG1132122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1132122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132122E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11321223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11321223barEv,_ZThn20_N3aaa9GG11321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11321223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321223barEv,_ZThn20_N3aaa9GG11321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132122E[];
Class_Descriptor cd__ZN3aaa9GG1132122E = {  "_ZN3aaa9GG1132122E", // class name
  bases__ZN3aaa9GG1132122E, 6,
  &(vtc__ZN3aaa9GG1132122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132123  : ::aaa::EE113 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11321233fooEv
  virtual void  bar(); // _ZN3aaa9GG11321233barEv
  ~GG1132123(); // tgen
  GG1132123(); // tgen
};
//SIG(1 _ZN3aaa9GG1132123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11321233fooEv");}
void  aaa::GG1132123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11321233barEv");}
aaa::GG1132123 ::~GG1132123(){ note_dtor("_ZN3aaa9GG1132123E", this);} // tgen
aaa::GG1132123 ::GG1132123(){ note_ctor("_ZN3aaa9GG1132123E", this);} // tgen
}
static void Test__ZN3aaa9GG1132123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132123E, buf);
    ::aaa::GG1132123 *dp, &lv = *(dp=new (buf) ::aaa::GG1132123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132123E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1132123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1132123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1132123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132123E);
    dp->::aaa::GG1132123::~GG1132123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132123E(Test__ZN3aaa9GG1132123E, "_ZN3aaa9GG1132123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132123C1Ev();
extern void _ZN3aaa9GG1132123D1Ev();
Name_Map name_map__ZN3aaa9GG1132123E[] = {
  NSPAIR(_ZN3aaa9GG1132123C1Ev),
  NSPAIR(_ZN3aaa9GG1132123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1132123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132123E[];
extern void _ZN3aaa9GG11321233fooEv();
extern void _ZN3aaa9GG11321233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11321233fooEv,_ZThn8_N3aaa9GG11321233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11321233barEv,_ZThn20_N3aaa9GG11321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11321233fooEv,_ZThn28_N3aaa9GG11321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11321233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11321233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11321233fooEv,_ZThn8_N3aaa9GG11321233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321233barEv,_ZThn20_N3aaa9GG11321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11321233fooEv,_ZThn28_N3aaa9GG11321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132123E[];
Class_Descriptor cd__ZN3aaa9GG1132123E = {  "_ZN3aaa9GG1132123E", // class name
  bases__ZN3aaa9GG1132123E, 6,
  &(vtc__ZN3aaa9GG1132123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132131  : ::aaa::EE113 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11321313fooEv
  ~GG1132131(); // tgen
  GG1132131(); // tgen
};
//SIG(1 _ZN3aaa9GG1132131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11321313fooEv");}
aaa::GG1132131 ::~GG1132131(){ note_dtor("_ZN3aaa9GG1132131E", this);} // tgen
aaa::GG1132131 ::GG1132131(){ note_ctor("_ZN3aaa9GG1132131E", this);} // tgen
}
static void Test__ZN3aaa9GG1132131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132131E, buf);
    ::aaa::GG1132131 *dp, &lv = *(dp=new (buf) ::aaa::GG1132131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132131E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1132131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1132131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1132131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132131E);
    dp->::aaa::GG1132131::~GG1132131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132131E(Test__ZN3aaa9GG1132131E, "_ZN3aaa9GG1132131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132131C1Ev();
extern void _ZN3aaa9GG1132131D1Ev();
Name_Map name_map__ZN3aaa9GG1132131E[] = {
  NSPAIR(_ZN3aaa9GG1132131C1Ev),
  NSPAIR(_ZN3aaa9GG1132131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1132131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132131E[];
extern void _ZN3aaa9GG11321313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11321313fooEv,_ZThn8_N3aaa9GG11321313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11321313fooEv,_ZThn20_N3aaa9GG11321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11321313fooEv,_ZThn28_N3aaa9GG11321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11321313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11321313fooEv,_ZThn8_N3aaa9GG11321313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321313fooEv,_ZThn20_N3aaa9GG11321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11321313fooEv,_ZThn28_N3aaa9GG11321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132131E[];
Class_Descriptor cd__ZN3aaa9GG1132131E = {  "_ZN3aaa9GG1132131E", // class name
  bases__ZN3aaa9GG1132131E, 6,
  &(vtc__ZN3aaa9GG1132131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132132  : ::aaa::EE113 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11321323barEv
  ~GG1132132(); // tgen
  GG1132132(); // tgen
};
//SIG(1 _ZN3aaa9GG1132132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11321323barEv");}
aaa::GG1132132 ::~GG1132132(){ note_dtor("_ZN3aaa9GG1132132E", this);} // tgen
aaa::GG1132132 ::GG1132132(){ note_ctor("_ZN3aaa9GG1132132E", this);} // tgen
}
static void Test__ZN3aaa9GG1132132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132132E, buf);
    ::aaa::GG1132132 *dp, &lv = *(dp=new (buf) ::aaa::GG1132132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132132E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1132132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1132132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1132132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132132E);
    dp->::aaa::GG1132132::~GG1132132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132132E(Test__ZN3aaa9GG1132132E, "_ZN3aaa9GG1132132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132132C1Ev();
extern void _ZN3aaa9GG1132132D1Ev();
Name_Map name_map__ZN3aaa9GG1132132E[] = {
  NSPAIR(_ZN3aaa9GG1132132C1Ev),
  NSPAIR(_ZN3aaa9GG1132132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1132132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132132E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11321323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11321323barEv,_ZThn20_N3aaa9GG11321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11321323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321323barEv,_ZThn20_N3aaa9GG11321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132132E[];
Class_Descriptor cd__ZN3aaa9GG1132132E = {  "_ZN3aaa9GG1132132E", // class name
  bases__ZN3aaa9GG1132132E, 6,
  &(vtc__ZN3aaa9GG1132132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132133  : ::aaa::EE113 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11321333fooEv
  virtual void  bar(); // _ZN3aaa9GG11321333barEv
  ~GG1132133(); // tgen
  GG1132133(); // tgen
};
//SIG(1 _ZN3aaa9GG1132133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11321333fooEv");}
void  aaa::GG1132133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11321333barEv");}
aaa::GG1132133 ::~GG1132133(){ note_dtor("_ZN3aaa9GG1132133E", this);} // tgen
aaa::GG1132133 ::GG1132133(){ note_ctor("_ZN3aaa9GG1132133E", this);} // tgen
}
static void Test__ZN3aaa9GG1132133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132133E, buf);
    ::aaa::GG1132133 *dp, &lv = *(dp=new (buf) ::aaa::GG1132133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132133E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1132133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1132133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1132133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132133E);
    dp->::aaa::GG1132133::~GG1132133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132133E(Test__ZN3aaa9GG1132133E, "_ZN3aaa9GG1132133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132133C1Ev();
extern void _ZN3aaa9GG1132133D1Ev();
Name_Map name_map__ZN3aaa9GG1132133E[] = {
  NSPAIR(_ZN3aaa9GG1132133C1Ev),
  NSPAIR(_ZN3aaa9GG1132133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1132133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132133E[];
extern void _ZN3aaa9GG11321333fooEv();
extern void _ZN3aaa9GG11321333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11321333fooEv,_ZThn8_N3aaa9GG11321333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11321333barEv,_ZThn20_N3aaa9GG11321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11321333fooEv,_ZThn20_N3aaa9GG11321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11321333fooEv,_ZThn28_N3aaa9GG11321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11321333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11321333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11321333fooEv,_ZThn8_N3aaa9GG11321333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321333barEv,_ZThn20_N3aaa9GG11321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11321333fooEv,_ZThn20_N3aaa9GG11321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11321333fooEv,_ZThn28_N3aaa9GG11321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132133E[];
Class_Descriptor cd__ZN3aaa9GG1132133E = {  "_ZN3aaa9GG1132133E", // class name
  bases__ZN3aaa9GG1132133E, 6,
  &(vtc__ZN3aaa9GG1132133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132211  : ::aaa::EE113 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11322113fooEv
  ~GG1132211(); // tgen
  GG1132211(); // tgen
};
//SIG(1 _ZN3aaa9GG1132211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11322113fooEv");}
aaa::GG1132211 ::~GG1132211(){ note_dtor("_ZN3aaa9GG1132211E", this);} // tgen
aaa::GG1132211 ::GG1132211(){ note_ctor("_ZN3aaa9GG1132211E", this);} // tgen
}
static void Test__ZN3aaa9GG1132211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132211E, buf);
    ::aaa::GG1132211 *dp, &lv = *(dp=new (buf) ::aaa::GG1132211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132211E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1132211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1132211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1132211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132211E);
    dp->::aaa::GG1132211::~GG1132211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132211E(Test__ZN3aaa9GG1132211E, "_ZN3aaa9GG1132211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132211C1Ev();
extern void _ZN3aaa9GG1132211D1Ev();
Name_Map name_map__ZN3aaa9GG1132211E[] = {
  NSPAIR(_ZN3aaa9GG1132211C1Ev),
  NSPAIR(_ZN3aaa9GG1132211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1132211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132211E[];
extern void _ZN3aaa9GG11322113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11322113fooEv,_ZThn8_N3aaa9GG11322113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11322113fooEv,_ZThn20_N3aaa9GG11322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11322113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11322113fooEv,_ZThn8_N3aaa9GG11322113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322113fooEv,_ZThn20_N3aaa9GG11322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132211E[];
Class_Descriptor cd__ZN3aaa9GG1132211E = {  "_ZN3aaa9GG1132211E", // class name
  bases__ZN3aaa9GG1132211E, 6,
  &(vtc__ZN3aaa9GG1132211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132212  : ::aaa::EE113 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11322123barEv
  ~GG1132212(); // tgen
  GG1132212(); // tgen
};
//SIG(1 _ZN3aaa9GG1132212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11322123barEv");}
aaa::GG1132212 ::~GG1132212(){ note_dtor("_ZN3aaa9GG1132212E", this);} // tgen
aaa::GG1132212 ::GG1132212(){ note_ctor("_ZN3aaa9GG1132212E", this);} // tgen
}
static void Test__ZN3aaa9GG1132212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132212E, buf);
    ::aaa::GG1132212 *dp, &lv = *(dp=new (buf) ::aaa::GG1132212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132212E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1132212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1132212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1132212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132212E);
    dp->::aaa::GG1132212::~GG1132212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132212E(Test__ZN3aaa9GG1132212E, "_ZN3aaa9GG1132212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132212C1Ev();
extern void _ZN3aaa9GG1132212D1Ev();
Name_Map name_map__ZN3aaa9GG1132212E[] = {
  NSPAIR(_ZN3aaa9GG1132212C1Ev),
  NSPAIR(_ZN3aaa9GG1132212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1132212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132212E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11322123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11322123barEv,_ZThn20_N3aaa9GG11322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11322123barEv,_ZThn28_N3aaa9GG11322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11322123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322123barEv,_ZThn20_N3aaa9GG11322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11322123barEv,_ZThn28_N3aaa9GG11322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132212E[];
Class_Descriptor cd__ZN3aaa9GG1132212E = {  "_ZN3aaa9GG1132212E", // class name
  bases__ZN3aaa9GG1132212E, 6,
  &(vtc__ZN3aaa9GG1132212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132213  : ::aaa::EE113 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11322133fooEv
  virtual void  bar(); // _ZN3aaa9GG11322133barEv
  ~GG1132213(); // tgen
  GG1132213(); // tgen
};
//SIG(1 _ZN3aaa9GG1132213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11322133fooEv");}
void  aaa::GG1132213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11322133barEv");}
aaa::GG1132213 ::~GG1132213(){ note_dtor("_ZN3aaa9GG1132213E", this);} // tgen
aaa::GG1132213 ::GG1132213(){ note_ctor("_ZN3aaa9GG1132213E", this);} // tgen
}
static void Test__ZN3aaa9GG1132213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132213E, buf);
    ::aaa::GG1132213 *dp, &lv = *(dp=new (buf) ::aaa::GG1132213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132213E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1132213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1132213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1132213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132213E);
    dp->::aaa::GG1132213::~GG1132213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132213E(Test__ZN3aaa9GG1132213E, "_ZN3aaa9GG1132213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132213C1Ev();
extern void _ZN3aaa9GG1132213D1Ev();
Name_Map name_map__ZN3aaa9GG1132213E[] = {
  NSPAIR(_ZN3aaa9GG1132213C1Ev),
  NSPAIR(_ZN3aaa9GG1132213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1132213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132213E[];
extern void _ZN3aaa9GG11322133fooEv();
extern void _ZN3aaa9GG11322133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11322133fooEv,_ZThn8_N3aaa9GG11322133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11322133barEv,_ZThn20_N3aaa9GG11322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11322133fooEv,_ZThn20_N3aaa9GG11322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11322133barEv,_ZThn28_N3aaa9GG11322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11322133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11322133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11322133fooEv,_ZThn8_N3aaa9GG11322133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322133barEv,_ZThn20_N3aaa9GG11322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322133fooEv,_ZThn20_N3aaa9GG11322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11322133barEv,_ZThn28_N3aaa9GG11322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132213E[];
Class_Descriptor cd__ZN3aaa9GG1132213E = {  "_ZN3aaa9GG1132213E", // class name
  bases__ZN3aaa9GG1132213E, 6,
  &(vtc__ZN3aaa9GG1132213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132221  : ::aaa::EE113 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11322213fooEv
  ~GG1132221(); // tgen
  GG1132221(); // tgen
};
//SIG(1 _ZN3aaa9GG1132221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11322213fooEv");}
aaa::GG1132221 ::~GG1132221(){ note_dtor("_ZN3aaa9GG1132221E", this);} // tgen
aaa::GG1132221 ::GG1132221(){ note_ctor("_ZN3aaa9GG1132221E", this);} // tgen
}
static void Test__ZN3aaa9GG1132221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132221E, buf);
    ::aaa::GG1132221 *dp, &lv = *(dp=new (buf) ::aaa::GG1132221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132221E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1132221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1132221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1132221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132221E);
    dp->::aaa::GG1132221::~GG1132221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132221E(Test__ZN3aaa9GG1132221E, "_ZN3aaa9GG1132221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132221C1Ev();
extern void _ZN3aaa9GG1132221D1Ev();
Name_Map name_map__ZN3aaa9GG1132221E[] = {
  NSPAIR(_ZN3aaa9GG1132221C1Ev),
  NSPAIR(_ZN3aaa9GG1132221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1132221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132221E[];
extern void _ZN3aaa9GG11322213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11322213fooEv,_ZThn8_N3aaa9GG11322213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11322213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11322213fooEv,_ZThn8_N3aaa9GG11322213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132221E[];
Class_Descriptor cd__ZN3aaa9GG1132221E = {  "_ZN3aaa9GG1132221E", // class name
  bases__ZN3aaa9GG1132221E, 6,
  &(vtc__ZN3aaa9GG1132221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132222  : ::aaa::EE113 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11322223barEv
  ~GG1132222(); // tgen
  GG1132222(); // tgen
};
//SIG(1 _ZN3aaa9GG1132222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11322223barEv");}
aaa::GG1132222 ::~GG1132222(){ note_dtor("_ZN3aaa9GG1132222E", this);} // tgen
aaa::GG1132222 ::GG1132222(){ note_ctor("_ZN3aaa9GG1132222E", this);} // tgen
}
static void Test__ZN3aaa9GG1132222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132222E, buf);
    ::aaa::GG1132222 *dp, &lv = *(dp=new (buf) ::aaa::GG1132222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132222E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1132222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1132222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1132222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132222E);
    dp->::aaa::GG1132222::~GG1132222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132222E(Test__ZN3aaa9GG1132222E, "_ZN3aaa9GG1132222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132222C1Ev();
extern void _ZN3aaa9GG1132222D1Ev();
Name_Map name_map__ZN3aaa9GG1132222E[] = {
  NSPAIR(_ZN3aaa9GG1132222C1Ev),
  NSPAIR(_ZN3aaa9GG1132222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1132222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132222E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11322223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11322223barEv,_ZThn20_N3aaa9GG11322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11322223barEv,_ZThn28_N3aaa9GG11322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11322223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322223barEv,_ZThn20_N3aaa9GG11322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11322223barEv,_ZThn28_N3aaa9GG11322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132222E[];
Class_Descriptor cd__ZN3aaa9GG1132222E = {  "_ZN3aaa9GG1132222E", // class name
  bases__ZN3aaa9GG1132222E, 6,
  &(vtc__ZN3aaa9GG1132222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132223  : ::aaa::EE113 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11322233fooEv
  virtual void  bar(); // _ZN3aaa9GG11322233barEv
  ~GG1132223(); // tgen
  GG1132223(); // tgen
};
//SIG(1 _ZN3aaa9GG1132223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11322233fooEv");}
void  aaa::GG1132223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11322233barEv");}
aaa::GG1132223 ::~GG1132223(){ note_dtor("_ZN3aaa9GG1132223E", this);} // tgen
aaa::GG1132223 ::GG1132223(){ note_ctor("_ZN3aaa9GG1132223E", this);} // tgen
}
static void Test__ZN3aaa9GG1132223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132223E, buf);
    ::aaa::GG1132223 *dp, &lv = *(dp=new (buf) ::aaa::GG1132223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132223E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1132223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1132223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1132223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132223E);
    dp->::aaa::GG1132223::~GG1132223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132223E(Test__ZN3aaa9GG1132223E, "_ZN3aaa9GG1132223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132223C1Ev();
extern void _ZN3aaa9GG1132223D1Ev();
Name_Map name_map__ZN3aaa9GG1132223E[] = {
  NSPAIR(_ZN3aaa9GG1132223C1Ev),
  NSPAIR(_ZN3aaa9GG1132223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1132223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132223E[];
extern void _ZN3aaa9GG11322233fooEv();
extern void _ZN3aaa9GG11322233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11322233fooEv,_ZThn8_N3aaa9GG11322233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11322233barEv,_ZThn20_N3aaa9GG11322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11322233barEv,_ZThn28_N3aaa9GG11322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11322233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11322233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11322233fooEv,_ZThn8_N3aaa9GG11322233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322233barEv,_ZThn20_N3aaa9GG11322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11322233barEv,_ZThn28_N3aaa9GG11322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132223E[];
Class_Descriptor cd__ZN3aaa9GG1132223E = {  "_ZN3aaa9GG1132223E", // class name
  bases__ZN3aaa9GG1132223E, 6,
  &(vtc__ZN3aaa9GG1132223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132231  : ::aaa::EE113 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11322313fooEv
  ~GG1132231(); // tgen
  GG1132231(); // tgen
};
//SIG(1 _ZN3aaa9GG1132231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11322313fooEv");}
aaa::GG1132231 ::~GG1132231(){ note_dtor("_ZN3aaa9GG1132231E", this);} // tgen
aaa::GG1132231 ::GG1132231(){ note_ctor("_ZN3aaa9GG1132231E", this);} // tgen
}
static void Test__ZN3aaa9GG1132231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132231E, buf);
    ::aaa::GG1132231 *dp, &lv = *(dp=new (buf) ::aaa::GG1132231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132231E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1132231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1132231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1132231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132231E);
    dp->::aaa::GG1132231::~GG1132231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132231E(Test__ZN3aaa9GG1132231E, "_ZN3aaa9GG1132231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132231C1Ev();
extern void _ZN3aaa9GG1132231D1Ev();
Name_Map name_map__ZN3aaa9GG1132231E[] = {
  NSPAIR(_ZN3aaa9GG1132231C1Ev),
  NSPAIR(_ZN3aaa9GG1132231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1132231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132231E[];
extern void _ZN3aaa9GG11322313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11322313fooEv,_ZThn8_N3aaa9GG11322313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11322313fooEv,_ZThn20_N3aaa9GG11322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11322313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11322313fooEv,_ZThn8_N3aaa9GG11322313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322313fooEv,_ZThn20_N3aaa9GG11322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132231E[];
Class_Descriptor cd__ZN3aaa9GG1132231E = {  "_ZN3aaa9GG1132231E", // class name
  bases__ZN3aaa9GG1132231E, 6,
  &(vtc__ZN3aaa9GG1132231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132232  : ::aaa::EE113 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11322323barEv
  ~GG1132232(); // tgen
  GG1132232(); // tgen
};
//SIG(1 _ZN3aaa9GG1132232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11322323barEv");}
aaa::GG1132232 ::~GG1132232(){ note_dtor("_ZN3aaa9GG1132232E", this);} // tgen
aaa::GG1132232 ::GG1132232(){ note_ctor("_ZN3aaa9GG1132232E", this);} // tgen
}
static void Test__ZN3aaa9GG1132232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132232E, buf);
    ::aaa::GG1132232 *dp, &lv = *(dp=new (buf) ::aaa::GG1132232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132232E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1132232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1132232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1132232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132232E);
    dp->::aaa::GG1132232::~GG1132232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132232E(Test__ZN3aaa9GG1132232E, "_ZN3aaa9GG1132232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132232C1Ev();
extern void _ZN3aaa9GG1132232D1Ev();
Name_Map name_map__ZN3aaa9GG1132232E[] = {
  NSPAIR(_ZN3aaa9GG1132232C1Ev),
  NSPAIR(_ZN3aaa9GG1132232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1132232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132232E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11322323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11322323barEv,_ZThn20_N3aaa9GG11322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11322323barEv,_ZThn28_N3aaa9GG11322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11322323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322323barEv,_ZThn20_N3aaa9GG11322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11322323barEv,_ZThn28_N3aaa9GG11322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132232E[];
Class_Descriptor cd__ZN3aaa9GG1132232E = {  "_ZN3aaa9GG1132232E", // class name
  bases__ZN3aaa9GG1132232E, 6,
  &(vtc__ZN3aaa9GG1132232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132233  : ::aaa::EE113 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11322333fooEv
  virtual void  bar(); // _ZN3aaa9GG11322333barEv
  ~GG1132233(); // tgen
  GG1132233(); // tgen
};
//SIG(1 _ZN3aaa9GG1132233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11322333fooEv");}
void  aaa::GG1132233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11322333barEv");}
aaa::GG1132233 ::~GG1132233(){ note_dtor("_ZN3aaa9GG1132233E", this);} // tgen
aaa::GG1132233 ::GG1132233(){ note_ctor("_ZN3aaa9GG1132233E", this);} // tgen
}
static void Test__ZN3aaa9GG1132233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132233E, buf);
    ::aaa::GG1132233 *dp, &lv = *(dp=new (buf) ::aaa::GG1132233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132233E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1132233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1132233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1132233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132233E);
    dp->::aaa::GG1132233::~GG1132233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132233E(Test__ZN3aaa9GG1132233E, "_ZN3aaa9GG1132233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132233C1Ev();
extern void _ZN3aaa9GG1132233D1Ev();
Name_Map name_map__ZN3aaa9GG1132233E[] = {
  NSPAIR(_ZN3aaa9GG1132233C1Ev),
  NSPAIR(_ZN3aaa9GG1132233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1132233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132233E[];
extern void _ZN3aaa9GG11322333fooEv();
extern void _ZN3aaa9GG11322333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11322333fooEv,_ZThn8_N3aaa9GG11322333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11322333barEv,_ZThn20_N3aaa9GG11322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11322333fooEv,_ZThn20_N3aaa9GG11322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11322333barEv,_ZThn28_N3aaa9GG11322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11322333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11322333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11322333fooEv,_ZThn8_N3aaa9GG11322333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322333barEv,_ZThn20_N3aaa9GG11322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11322333fooEv,_ZThn20_N3aaa9GG11322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11322333barEv,_ZThn28_N3aaa9GG11322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132233E[];
Class_Descriptor cd__ZN3aaa9GG1132233E = {  "_ZN3aaa9GG1132233E", // class name
  bases__ZN3aaa9GG1132233E, 6,
  &(vtc__ZN3aaa9GG1132233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132311  : ::aaa::EE113 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11323113fooEv
  ~GG1132311(); // tgen
  GG1132311(); // tgen
};
//SIG(1 _ZN3aaa9GG1132311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11323113fooEv");}
aaa::GG1132311 ::~GG1132311(){ note_dtor("_ZN3aaa9GG1132311E", this);} // tgen
aaa::GG1132311 ::GG1132311(){ note_ctor("_ZN3aaa9GG1132311E", this);} // tgen
}
static void Test__ZN3aaa9GG1132311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132311E, buf);
    ::aaa::GG1132311 *dp, &lv = *(dp=new (buf) ::aaa::GG1132311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132311E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1132311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1132311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1132311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132311E);
    dp->::aaa::GG1132311::~GG1132311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132311E(Test__ZN3aaa9GG1132311E, "_ZN3aaa9GG1132311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132311C1Ev();
extern void _ZN3aaa9GG1132311D1Ev();
Name_Map name_map__ZN3aaa9GG1132311E[] = {
  NSPAIR(_ZN3aaa9GG1132311C1Ev),
  NSPAIR(_ZN3aaa9GG1132311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1132311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132311E[];
extern void _ZN3aaa9GG11323113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11323113fooEv,_ZThn8_N3aaa9GG11323113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11323113fooEv,_ZThn20_N3aaa9GG11323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323113fooEv,_ZThn28_N3aaa9GG11323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11323113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11323113fooEv,_ZThn8_N3aaa9GG11323113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323113fooEv,_ZThn20_N3aaa9GG11323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323113fooEv,_ZThn28_N3aaa9GG11323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132311E[];
Class_Descriptor cd__ZN3aaa9GG1132311E = {  "_ZN3aaa9GG1132311E", // class name
  bases__ZN3aaa9GG1132311E, 6,
  &(vtc__ZN3aaa9GG1132311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132312  : ::aaa::EE113 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11323123barEv
  ~GG1132312(); // tgen
  GG1132312(); // tgen
};
//SIG(1 _ZN3aaa9GG1132312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11323123barEv");}
aaa::GG1132312 ::~GG1132312(){ note_dtor("_ZN3aaa9GG1132312E", this);} // tgen
aaa::GG1132312 ::GG1132312(){ note_ctor("_ZN3aaa9GG1132312E", this);} // tgen
}
static void Test__ZN3aaa9GG1132312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132312E, buf);
    ::aaa::GG1132312 *dp, &lv = *(dp=new (buf) ::aaa::GG1132312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132312E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1132312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1132312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1132312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132312E);
    dp->::aaa::GG1132312::~GG1132312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132312E(Test__ZN3aaa9GG1132312E, "_ZN3aaa9GG1132312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132312C1Ev();
extern void _ZN3aaa9GG1132312D1Ev();
Name_Map name_map__ZN3aaa9GG1132312E[] = {
  NSPAIR(_ZN3aaa9GG1132312C1Ev),
  NSPAIR(_ZN3aaa9GG1132312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1132312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132312E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11323123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11323123barEv,_ZThn20_N3aaa9GG11323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323123barEv,_ZThn28_N3aaa9GG11323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11323123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323123barEv,_ZThn20_N3aaa9GG11323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323123barEv,_ZThn28_N3aaa9GG11323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132312E[];
Class_Descriptor cd__ZN3aaa9GG1132312E = {  "_ZN3aaa9GG1132312E", // class name
  bases__ZN3aaa9GG1132312E, 6,
  &(vtc__ZN3aaa9GG1132312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132313  : ::aaa::EE113 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11323133fooEv
  virtual void  bar(); // _ZN3aaa9GG11323133barEv
  ~GG1132313(); // tgen
  GG1132313(); // tgen
};
//SIG(1 _ZN3aaa9GG1132313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11323133fooEv");}
void  aaa::GG1132313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11323133barEv");}
aaa::GG1132313 ::~GG1132313(){ note_dtor("_ZN3aaa9GG1132313E", this);} // tgen
aaa::GG1132313 ::GG1132313(){ note_ctor("_ZN3aaa9GG1132313E", this);} // tgen
}
static void Test__ZN3aaa9GG1132313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132313E, buf);
    ::aaa::GG1132313 *dp, &lv = *(dp=new (buf) ::aaa::GG1132313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132313E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1132313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1132313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1132313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132313E);
    dp->::aaa::GG1132313::~GG1132313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132313E(Test__ZN3aaa9GG1132313E, "_ZN3aaa9GG1132313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132313C1Ev();
extern void _ZN3aaa9GG1132313D1Ev();
Name_Map name_map__ZN3aaa9GG1132313E[] = {
  NSPAIR(_ZN3aaa9GG1132313C1Ev),
  NSPAIR(_ZN3aaa9GG1132313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1132313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132313E[];
extern void _ZN3aaa9GG11323133fooEv();
extern void _ZN3aaa9GG11323133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11323133fooEv,_ZThn8_N3aaa9GG11323133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11323133barEv,_ZThn20_N3aaa9GG11323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11323133fooEv,_ZThn20_N3aaa9GG11323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323133fooEv,_ZThn28_N3aaa9GG11323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323133barEv,_ZThn28_N3aaa9GG11323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11323133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11323133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11323133fooEv,_ZThn8_N3aaa9GG11323133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323133barEv,_ZThn20_N3aaa9GG11323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323133fooEv,_ZThn20_N3aaa9GG11323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323133fooEv,_ZThn28_N3aaa9GG11323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323133barEv,_ZThn28_N3aaa9GG11323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132313E[];
Class_Descriptor cd__ZN3aaa9GG1132313E = {  "_ZN3aaa9GG1132313E", // class name
  bases__ZN3aaa9GG1132313E, 6,
  &(vtc__ZN3aaa9GG1132313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132321  : ::aaa::EE113 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11323213fooEv
  ~GG1132321(); // tgen
  GG1132321(); // tgen
};
//SIG(1 _ZN3aaa9GG1132321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11323213fooEv");}
aaa::GG1132321 ::~GG1132321(){ note_dtor("_ZN3aaa9GG1132321E", this);} // tgen
aaa::GG1132321 ::GG1132321(){ note_ctor("_ZN3aaa9GG1132321E", this);} // tgen
}
static void Test__ZN3aaa9GG1132321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132321E, buf);
    ::aaa::GG1132321 *dp, &lv = *(dp=new (buf) ::aaa::GG1132321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132321E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1132321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1132321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1132321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132321E);
    dp->::aaa::GG1132321::~GG1132321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132321E(Test__ZN3aaa9GG1132321E, "_ZN3aaa9GG1132321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132321C1Ev();
extern void _ZN3aaa9GG1132321D1Ev();
Name_Map name_map__ZN3aaa9GG1132321E[] = {
  NSPAIR(_ZN3aaa9GG1132321C1Ev),
  NSPAIR(_ZN3aaa9GG1132321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1132321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132321E[];
extern void _ZN3aaa9GG11323213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11323213fooEv,_ZThn8_N3aaa9GG11323213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11323213fooEv,_ZThn28_N3aaa9GG11323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11323213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11323213fooEv,_ZThn8_N3aaa9GG11323213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323213fooEv,_ZThn28_N3aaa9GG11323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132321E[];
Class_Descriptor cd__ZN3aaa9GG1132321E = {  "_ZN3aaa9GG1132321E", // class name
  bases__ZN3aaa9GG1132321E, 6,
  &(vtc__ZN3aaa9GG1132321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132322  : ::aaa::EE113 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11323223barEv
  ~GG1132322(); // tgen
  GG1132322(); // tgen
};
//SIG(1 _ZN3aaa9GG1132322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11323223barEv");}
aaa::GG1132322 ::~GG1132322(){ note_dtor("_ZN3aaa9GG1132322E", this);} // tgen
aaa::GG1132322 ::GG1132322(){ note_ctor("_ZN3aaa9GG1132322E", this);} // tgen
}
static void Test__ZN3aaa9GG1132322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132322E, buf);
    ::aaa::GG1132322 *dp, &lv = *(dp=new (buf) ::aaa::GG1132322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132322E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1132322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1132322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1132322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132322E);
    dp->::aaa::GG1132322::~GG1132322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132322E(Test__ZN3aaa9GG1132322E, "_ZN3aaa9GG1132322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132322C1Ev();
extern void _ZN3aaa9GG1132322D1Ev();
Name_Map name_map__ZN3aaa9GG1132322E[] = {
  NSPAIR(_ZN3aaa9GG1132322C1Ev),
  NSPAIR(_ZN3aaa9GG1132322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1132322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132322E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11323223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11323223barEv,_ZThn20_N3aaa9GG11323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11323223barEv,_ZThn28_N3aaa9GG11323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11323223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323223barEv,_ZThn20_N3aaa9GG11323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323223barEv,_ZThn28_N3aaa9GG11323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132322E[];
Class_Descriptor cd__ZN3aaa9GG1132322E = {  "_ZN3aaa9GG1132322E", // class name
  bases__ZN3aaa9GG1132322E, 6,
  &(vtc__ZN3aaa9GG1132322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132323  : ::aaa::EE113 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11323233fooEv
  virtual void  bar(); // _ZN3aaa9GG11323233barEv
  ~GG1132323(); // tgen
  GG1132323(); // tgen
};
//SIG(1 _ZN3aaa9GG1132323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11323233fooEv");}
void  aaa::GG1132323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11323233barEv");}
aaa::GG1132323 ::~GG1132323(){ note_dtor("_ZN3aaa9GG1132323E", this);} // tgen
aaa::GG1132323 ::GG1132323(){ note_ctor("_ZN3aaa9GG1132323E", this);} // tgen
}
static void Test__ZN3aaa9GG1132323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132323E, buf);
    ::aaa::GG1132323 *dp, &lv = *(dp=new (buf) ::aaa::GG1132323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132323E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1132323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1132323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1132323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132323E);
    dp->::aaa::GG1132323::~GG1132323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132323E(Test__ZN3aaa9GG1132323E, "_ZN3aaa9GG1132323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132323C1Ev();
extern void _ZN3aaa9GG1132323D1Ev();
Name_Map name_map__ZN3aaa9GG1132323E[] = {
  NSPAIR(_ZN3aaa9GG1132323C1Ev),
  NSPAIR(_ZN3aaa9GG1132323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1132323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132323E[];
extern void _ZN3aaa9GG11323233fooEv();
extern void _ZN3aaa9GG11323233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11323233fooEv,_ZThn8_N3aaa9GG11323233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11323233barEv,_ZThn20_N3aaa9GG11323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323233fooEv,_ZThn28_N3aaa9GG11323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323233barEv,_ZThn28_N3aaa9GG11323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11323233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11323233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11323233fooEv,_ZThn8_N3aaa9GG11323233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323233barEv,_ZThn20_N3aaa9GG11323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323233fooEv,_ZThn28_N3aaa9GG11323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323233barEv,_ZThn28_N3aaa9GG11323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132323E[];
Class_Descriptor cd__ZN3aaa9GG1132323E = {  "_ZN3aaa9GG1132323E", // class name
  bases__ZN3aaa9GG1132323E, 6,
  &(vtc__ZN3aaa9GG1132323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132331  : ::aaa::EE113 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11323313fooEv
  ~GG1132331(); // tgen
  GG1132331(); // tgen
};
//SIG(1 _ZN3aaa9GG1132331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11323313fooEv");}
aaa::GG1132331 ::~GG1132331(){ note_dtor("_ZN3aaa9GG1132331E", this);} // tgen
aaa::GG1132331 ::GG1132331(){ note_ctor("_ZN3aaa9GG1132331E", this);} // tgen
}
static void Test__ZN3aaa9GG1132331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132331E, buf);
    ::aaa::GG1132331 *dp, &lv = *(dp=new (buf) ::aaa::GG1132331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132331E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1132331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1132331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1132331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132331E);
    dp->::aaa::GG1132331::~GG1132331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132331E(Test__ZN3aaa9GG1132331E, "_ZN3aaa9GG1132331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132331C1Ev();
extern void _ZN3aaa9GG1132331D1Ev();
Name_Map name_map__ZN3aaa9GG1132331E[] = {
  NSPAIR(_ZN3aaa9GG1132331C1Ev),
  NSPAIR(_ZN3aaa9GG1132331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1132331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132331E[];
extern void _ZN3aaa9GG11323313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11323313fooEv,_ZThn8_N3aaa9GG11323313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11323313fooEv,_ZThn20_N3aaa9GG11323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323313fooEv,_ZThn28_N3aaa9GG11323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11323313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11323313fooEv,_ZThn8_N3aaa9GG11323313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323313fooEv,_ZThn20_N3aaa9GG11323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323313fooEv,_ZThn28_N3aaa9GG11323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132331E[];
Class_Descriptor cd__ZN3aaa9GG1132331E = {  "_ZN3aaa9GG1132331E", // class name
  bases__ZN3aaa9GG1132331E, 6,
  &(vtc__ZN3aaa9GG1132331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132332  : ::aaa::EE113 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11323323barEv
  ~GG1132332(); // tgen
  GG1132332(); // tgen
};
//SIG(1 _ZN3aaa9GG1132332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1132332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11323323barEv");}
aaa::GG1132332 ::~GG1132332(){ note_dtor("_ZN3aaa9GG1132332E", this);} // tgen
aaa::GG1132332 ::GG1132332(){ note_ctor("_ZN3aaa9GG1132332E", this);} // tgen
}
static void Test__ZN3aaa9GG1132332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132332E, buf);
    ::aaa::GG1132332 *dp, &lv = *(dp=new (buf) ::aaa::GG1132332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132332E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1132332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1132332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1132332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132332E);
    dp->::aaa::GG1132332::~GG1132332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132332E(Test__ZN3aaa9GG1132332E, "_ZN3aaa9GG1132332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132332C1Ev();
extern void _ZN3aaa9GG1132332D1Ev();
Name_Map name_map__ZN3aaa9GG1132332E[] = {
  NSPAIR(_ZN3aaa9GG1132332C1Ev),
  NSPAIR(_ZN3aaa9GG1132332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1132332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132332E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11323323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11323323barEv,_ZThn20_N3aaa9GG11323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323323barEv,_ZThn28_N3aaa9GG11323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11323323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323323barEv,_ZThn20_N3aaa9GG11323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323323barEv,_ZThn28_N3aaa9GG11323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132332E[];
Class_Descriptor cd__ZN3aaa9GG1132332E = {  "_ZN3aaa9GG1132332E", // class name
  bases__ZN3aaa9GG1132332E, 6,
  &(vtc__ZN3aaa9GG1132332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1132333  : ::aaa::EE113 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11323333fooEv
  virtual void  bar(); // _ZN3aaa9GG11323333barEv
  ~GG1132333(); // tgen
  GG1132333(); // tgen
};
//SIG(1 _ZN3aaa9GG1132333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1132333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11323333fooEv");}
void  aaa::GG1132333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11323333barEv");}
aaa::GG1132333 ::~GG1132333(){ note_dtor("_ZN3aaa9GG1132333E", this);} // tgen
aaa::GG1132333 ::GG1132333(){ note_ctor("_ZN3aaa9GG1132333E", this);} // tgen
}
static void Test__ZN3aaa9GG1132333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1132333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1132333E, buf);
    ::aaa::GG1132333 *dp, &lv = *(dp=new (buf) ::aaa::GG1132333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1132333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1132333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1132333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1132333E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1132333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1132333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1132333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1132333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1132333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1132333E);
    dp->::aaa::GG1132333::~GG1132333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1132333E(Test__ZN3aaa9GG1132333E, "_ZN3aaa9GG1132333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1132333C1Ev();
extern void _ZN3aaa9GG1132333D1Ev();
Name_Map name_map__ZN3aaa9GG1132333E[] = {
  NSPAIR(_ZN3aaa9GG1132333C1Ev),
  NSPAIR(_ZN3aaa9GG1132333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1132333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1132333E[];
extern void _ZN3aaa9GG11323333fooEv();
extern void _ZN3aaa9GG11323333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11323333fooEv,_ZThn8_N3aaa9GG11323333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11323333barEv,_ZThn20_N3aaa9GG11323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11323333fooEv,_ZThn20_N3aaa9GG11323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323333fooEv,_ZThn28_N3aaa9GG11323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11323333barEv,_ZThn28_N3aaa9GG11323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1132333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11323333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11323333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11323333fooEv,_ZThn8_N3aaa9GG11323333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323333barEv,_ZThn20_N3aaa9GG11323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11323333fooEv,_ZThn20_N3aaa9GG11323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323333fooEv,_ZThn28_N3aaa9GG11323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11323333barEv,_ZThn28_N3aaa9GG11323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1132333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1132333E[];
Class_Descriptor cd__ZN3aaa9GG1132333E = {  "_ZN3aaa9GG1132333E", // class name
  bases__ZN3aaa9GG1132333E, 6,
  &(vtc__ZN3aaa9GG1132333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1132333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1132333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133111  : ::aaa::EE113 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11331113fooEv
  ~GG1133111(); // tgen
  GG1133111(); // tgen
};
//SIG(1 _ZN3aaa9GG1133111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133111 ::foo(){vfunc_called(this, "_ZN3aaa9GG11331113fooEv");}
aaa::GG1133111 ::~GG1133111(){ note_dtor("_ZN3aaa9GG1133111E", this);} // tgen
aaa::GG1133111 ::GG1133111(){ note_ctor("_ZN3aaa9GG1133111E", this);} // tgen
}
static void Test__ZN3aaa9GG1133111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133111E, buf);
    ::aaa::GG1133111 *dp, &lv = *(dp=new (buf) ::aaa::GG1133111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133111E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1133111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1133111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1133111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133111E);
    dp->::aaa::GG1133111::~GG1133111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133111E(Test__ZN3aaa9GG1133111E, "_ZN3aaa9GG1133111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133111C1Ev();
extern void _ZN3aaa9GG1133111D1Ev();
Name_Map name_map__ZN3aaa9GG1133111E[] = {
  NSPAIR(_ZN3aaa9GG1133111C1Ev),
  NSPAIR(_ZN3aaa9GG1133111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1133111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133111E[];
extern void _ZN3aaa9GG11331113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11331113fooEv,_ZThn8_N3aaa9GG11331113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331113fooEv,_ZThn20_N3aaa9GG11331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11331113fooEv,_ZThn28_N3aaa9GG11331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11331113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11331113fooEv,_ZThn8_N3aaa9GG11331113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331113fooEv,_ZThn20_N3aaa9GG11331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11331113fooEv,_ZThn28_N3aaa9GG11331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133111E[];
Class_Descriptor cd__ZN3aaa9GG1133111E = {  "_ZN3aaa9GG1133111E", // class name
  bases__ZN3aaa9GG1133111E, 6,
  &(vtc__ZN3aaa9GG1133111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133112  : ::aaa::EE113 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11331123barEv
  ~GG1133112(); // tgen
  GG1133112(); // tgen
};
//SIG(1 _ZN3aaa9GG1133112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133112 ::bar(){vfunc_called(this, "_ZN3aaa9GG11331123barEv");}
aaa::GG1133112 ::~GG1133112(){ note_dtor("_ZN3aaa9GG1133112E", this);} // tgen
aaa::GG1133112 ::GG1133112(){ note_ctor("_ZN3aaa9GG1133112E", this);} // tgen
}
static void Test__ZN3aaa9GG1133112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133112E, buf);
    ::aaa::GG1133112 *dp, &lv = *(dp=new (buf) ::aaa::GG1133112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133112E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1133112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1133112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1133112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133112E);
    dp->::aaa::GG1133112::~GG1133112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133112E(Test__ZN3aaa9GG1133112E, "_ZN3aaa9GG1133112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133112C1Ev();
extern void _ZN3aaa9GG1133112D1Ev();
Name_Map name_map__ZN3aaa9GG1133112E[] = {
  NSPAIR(_ZN3aaa9GG1133112C1Ev),
  NSPAIR(_ZN3aaa9GG1133112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1133112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133112E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11331123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11331123barEv,_ZThn20_N3aaa9GG11331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11331123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331123barEv,_ZThn20_N3aaa9GG11331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133112E[];
Class_Descriptor cd__ZN3aaa9GG1133112E = {  "_ZN3aaa9GG1133112E", // class name
  bases__ZN3aaa9GG1133112E, 6,
  &(vtc__ZN3aaa9GG1133112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133113  : ::aaa::EE113 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11331133fooEv
  virtual void  bar(); // _ZN3aaa9GG11331133barEv
  ~GG1133113(); // tgen
  GG1133113(); // tgen
};
//SIG(1 _ZN3aaa9GG1133113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133113 ::foo(){vfunc_called(this, "_ZN3aaa9GG11331133fooEv");}
void  aaa::GG1133113 ::bar(){vfunc_called(this, "_ZN3aaa9GG11331133barEv");}
aaa::GG1133113 ::~GG1133113(){ note_dtor("_ZN3aaa9GG1133113E", this);} // tgen
aaa::GG1133113 ::GG1133113(){ note_ctor("_ZN3aaa9GG1133113E", this);} // tgen
}
static void Test__ZN3aaa9GG1133113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133113E, buf);
    ::aaa::GG1133113 *dp, &lv = *(dp=new (buf) ::aaa::GG1133113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133113E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1133113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1133113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1133113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133113E);
    dp->::aaa::GG1133113::~GG1133113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133113E(Test__ZN3aaa9GG1133113E, "_ZN3aaa9GG1133113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133113C1Ev();
extern void _ZN3aaa9GG1133113D1Ev();
Name_Map name_map__ZN3aaa9GG1133113E[] = {
  NSPAIR(_ZN3aaa9GG1133113C1Ev),
  NSPAIR(_ZN3aaa9GG1133113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1133113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133113E[];
extern void _ZN3aaa9GG11331133fooEv();
extern void _ZN3aaa9GG11331133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11331133fooEv,_ZThn8_N3aaa9GG11331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331133fooEv,_ZThn20_N3aaa9GG11331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331133barEv,_ZThn20_N3aaa9GG11331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11331133fooEv,_ZThn28_N3aaa9GG11331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11331133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11331133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11331133fooEv,_ZThn8_N3aaa9GG11331133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331133fooEv,_ZThn20_N3aaa9GG11331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331133barEv,_ZThn20_N3aaa9GG11331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11331133fooEv,_ZThn28_N3aaa9GG11331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133113E[];
Class_Descriptor cd__ZN3aaa9GG1133113E = {  "_ZN3aaa9GG1133113E", // class name
  bases__ZN3aaa9GG1133113E, 6,
  &(vtc__ZN3aaa9GG1133113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133121  : ::aaa::EE113 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11331213fooEv
  ~GG1133121(); // tgen
  GG1133121(); // tgen
};
//SIG(1 _ZN3aaa9GG1133121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133121 ::foo(){vfunc_called(this, "_ZN3aaa9GG11331213fooEv");}
aaa::GG1133121 ::~GG1133121(){ note_dtor("_ZN3aaa9GG1133121E", this);} // tgen
aaa::GG1133121 ::GG1133121(){ note_ctor("_ZN3aaa9GG1133121E", this);} // tgen
}
static void Test__ZN3aaa9GG1133121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133121E, buf);
    ::aaa::GG1133121 *dp, &lv = *(dp=new (buf) ::aaa::GG1133121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133121E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1133121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1133121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1133121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133121E);
    dp->::aaa::GG1133121::~GG1133121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133121E(Test__ZN3aaa9GG1133121E, "_ZN3aaa9GG1133121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133121C1Ev();
extern void _ZN3aaa9GG1133121D1Ev();
Name_Map name_map__ZN3aaa9GG1133121E[] = {
  NSPAIR(_ZN3aaa9GG1133121C1Ev),
  NSPAIR(_ZN3aaa9GG1133121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1133121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133121E[];
extern void _ZN3aaa9GG11331213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11331213fooEv,_ZThn8_N3aaa9GG11331213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331213fooEv,_ZThn20_N3aaa9GG11331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11331213fooEv,_ZThn28_N3aaa9GG11331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11331213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11331213fooEv,_ZThn8_N3aaa9GG11331213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331213fooEv,_ZThn20_N3aaa9GG11331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11331213fooEv,_ZThn28_N3aaa9GG11331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133121E[];
Class_Descriptor cd__ZN3aaa9GG1133121E = {  "_ZN3aaa9GG1133121E", // class name
  bases__ZN3aaa9GG1133121E, 6,
  &(vtc__ZN3aaa9GG1133121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133122  : ::aaa::EE113 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11331223barEv
  ~GG1133122(); // tgen
  GG1133122(); // tgen
};
//SIG(1 _ZN3aaa9GG1133122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133122 ::bar(){vfunc_called(this, "_ZN3aaa9GG11331223barEv");}
aaa::GG1133122 ::~GG1133122(){ note_dtor("_ZN3aaa9GG1133122E", this);} // tgen
aaa::GG1133122 ::GG1133122(){ note_ctor("_ZN3aaa9GG1133122E", this);} // tgen
}
static void Test__ZN3aaa9GG1133122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133122E, buf);
    ::aaa::GG1133122 *dp, &lv = *(dp=new (buf) ::aaa::GG1133122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133122E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1133122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1133122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1133122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133122E);
    dp->::aaa::GG1133122::~GG1133122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133122E(Test__ZN3aaa9GG1133122E, "_ZN3aaa9GG1133122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133122C1Ev();
extern void _ZN3aaa9GG1133122D1Ev();
Name_Map name_map__ZN3aaa9GG1133122E[] = {
  NSPAIR(_ZN3aaa9GG1133122C1Ev),
  NSPAIR(_ZN3aaa9GG1133122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1133122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133122E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11331223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11331223barEv,_ZThn20_N3aaa9GG11331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11331223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331223barEv,_ZThn20_N3aaa9GG11331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133122E[];
Class_Descriptor cd__ZN3aaa9GG1133122E = {  "_ZN3aaa9GG1133122E", // class name
  bases__ZN3aaa9GG1133122E, 6,
  &(vtc__ZN3aaa9GG1133122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133123  : ::aaa::EE113 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11331233fooEv
  virtual void  bar(); // _ZN3aaa9GG11331233barEv
  ~GG1133123(); // tgen
  GG1133123(); // tgen
};
//SIG(1 _ZN3aaa9GG1133123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133123 ::foo(){vfunc_called(this, "_ZN3aaa9GG11331233fooEv");}
void  aaa::GG1133123 ::bar(){vfunc_called(this, "_ZN3aaa9GG11331233barEv");}
aaa::GG1133123 ::~GG1133123(){ note_dtor("_ZN3aaa9GG1133123E", this);} // tgen
aaa::GG1133123 ::GG1133123(){ note_ctor("_ZN3aaa9GG1133123E", this);} // tgen
}
static void Test__ZN3aaa9GG1133123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133123E, buf);
    ::aaa::GG1133123 *dp, &lv = *(dp=new (buf) ::aaa::GG1133123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133123E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1133123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1133123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1133123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133123E);
    dp->::aaa::GG1133123::~GG1133123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133123E(Test__ZN3aaa9GG1133123E, "_ZN3aaa9GG1133123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133123C1Ev();
extern void _ZN3aaa9GG1133123D1Ev();
Name_Map name_map__ZN3aaa9GG1133123E[] = {
  NSPAIR(_ZN3aaa9GG1133123C1Ev),
  NSPAIR(_ZN3aaa9GG1133123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1133123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133123E[];
extern void _ZN3aaa9GG11331233fooEv();
extern void _ZN3aaa9GG11331233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11331233fooEv,_ZThn8_N3aaa9GG11331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331233fooEv,_ZThn20_N3aaa9GG11331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331233barEv,_ZThn20_N3aaa9GG11331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11331233fooEv,_ZThn28_N3aaa9GG11331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11331233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11331233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11331233fooEv,_ZThn8_N3aaa9GG11331233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331233fooEv,_ZThn20_N3aaa9GG11331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331233barEv,_ZThn20_N3aaa9GG11331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11331233fooEv,_ZThn28_N3aaa9GG11331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133123E[];
Class_Descriptor cd__ZN3aaa9GG1133123E = {  "_ZN3aaa9GG1133123E", // class name
  bases__ZN3aaa9GG1133123E, 6,
  &(vtc__ZN3aaa9GG1133123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133131  : ::aaa::EE113 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11331313fooEv
  ~GG1133131(); // tgen
  GG1133131(); // tgen
};
//SIG(1 _ZN3aaa9GG1133131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133131 ::foo(){vfunc_called(this, "_ZN3aaa9GG11331313fooEv");}
aaa::GG1133131 ::~GG1133131(){ note_dtor("_ZN3aaa9GG1133131E", this);} // tgen
aaa::GG1133131 ::GG1133131(){ note_ctor("_ZN3aaa9GG1133131E", this);} // tgen
}
static void Test__ZN3aaa9GG1133131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133131E, buf);
    ::aaa::GG1133131 *dp, &lv = *(dp=new (buf) ::aaa::GG1133131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133131E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1133131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1133131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1133131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133131E);
    dp->::aaa::GG1133131::~GG1133131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133131E(Test__ZN3aaa9GG1133131E, "_ZN3aaa9GG1133131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133131C1Ev();
extern void _ZN3aaa9GG1133131D1Ev();
Name_Map name_map__ZN3aaa9GG1133131E[] = {
  NSPAIR(_ZN3aaa9GG1133131C1Ev),
  NSPAIR(_ZN3aaa9GG1133131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1133131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133131E[];
extern void _ZN3aaa9GG11331313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11331313fooEv,_ZThn8_N3aaa9GG11331313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331313fooEv,_ZThn20_N3aaa9GG11331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11331313fooEv,_ZThn28_N3aaa9GG11331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11331313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11331313fooEv,_ZThn8_N3aaa9GG11331313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331313fooEv,_ZThn20_N3aaa9GG11331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11331313fooEv,_ZThn28_N3aaa9GG11331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133131E[];
Class_Descriptor cd__ZN3aaa9GG1133131E = {  "_ZN3aaa9GG1133131E", // class name
  bases__ZN3aaa9GG1133131E, 6,
  &(vtc__ZN3aaa9GG1133131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133132  : ::aaa::EE113 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11331323barEv
  ~GG1133132(); // tgen
  GG1133132(); // tgen
};
//SIG(1 _ZN3aaa9GG1133132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133132 ::bar(){vfunc_called(this, "_ZN3aaa9GG11331323barEv");}
aaa::GG1133132 ::~GG1133132(){ note_dtor("_ZN3aaa9GG1133132E", this);} // tgen
aaa::GG1133132 ::GG1133132(){ note_ctor("_ZN3aaa9GG1133132E", this);} // tgen
}
static void Test__ZN3aaa9GG1133132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133132E, buf);
    ::aaa::GG1133132 *dp, &lv = *(dp=new (buf) ::aaa::GG1133132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133132E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1133132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1133132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1133132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133132E);
    dp->::aaa::GG1133132::~GG1133132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133132E(Test__ZN3aaa9GG1133132E, "_ZN3aaa9GG1133132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133132C1Ev();
extern void _ZN3aaa9GG1133132D1Ev();
Name_Map name_map__ZN3aaa9GG1133132E[] = {
  NSPAIR(_ZN3aaa9GG1133132C1Ev),
  NSPAIR(_ZN3aaa9GG1133132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1133132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133132E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11331323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11331323barEv,_ZThn20_N3aaa9GG11331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11331323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331323barEv,_ZThn20_N3aaa9GG11331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133132E[];
Class_Descriptor cd__ZN3aaa9GG1133132E = {  "_ZN3aaa9GG1133132E", // class name
  bases__ZN3aaa9GG1133132E, 6,
  &(vtc__ZN3aaa9GG1133132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133133  : ::aaa::EE113 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11331333fooEv
  virtual void  bar(); // _ZN3aaa9GG11331333barEv
  ~GG1133133(); // tgen
  GG1133133(); // tgen
};
//SIG(1 _ZN3aaa9GG1133133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133133 ::foo(){vfunc_called(this, "_ZN3aaa9GG11331333fooEv");}
void  aaa::GG1133133 ::bar(){vfunc_called(this, "_ZN3aaa9GG11331333barEv");}
aaa::GG1133133 ::~GG1133133(){ note_dtor("_ZN3aaa9GG1133133E", this);} // tgen
aaa::GG1133133 ::GG1133133(){ note_ctor("_ZN3aaa9GG1133133E", this);} // tgen
}
static void Test__ZN3aaa9GG1133133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133133E, buf);
    ::aaa::GG1133133 *dp, &lv = *(dp=new (buf) ::aaa::GG1133133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133133E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1133133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1133133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1133133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133133E);
    dp->::aaa::GG1133133::~GG1133133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133133E(Test__ZN3aaa9GG1133133E, "_ZN3aaa9GG1133133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133133C1Ev();
extern void _ZN3aaa9GG1133133D1Ev();
Name_Map name_map__ZN3aaa9GG1133133E[] = {
  NSPAIR(_ZN3aaa9GG1133133C1Ev),
  NSPAIR(_ZN3aaa9GG1133133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1133133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133133E[];
extern void _ZN3aaa9GG11331333fooEv();
extern void _ZN3aaa9GG11331333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11331333fooEv,_ZThn8_N3aaa9GG11331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331333fooEv,_ZThn20_N3aaa9GG11331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11331333barEv,_ZThn20_N3aaa9GG11331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11331333fooEv,_ZThn28_N3aaa9GG11331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11331333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11331333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11331333fooEv,_ZThn8_N3aaa9GG11331333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331333fooEv,_ZThn20_N3aaa9GG11331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11331333barEv,_ZThn20_N3aaa9GG11331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11331333fooEv,_ZThn28_N3aaa9GG11331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133133E[];
Class_Descriptor cd__ZN3aaa9GG1133133E = {  "_ZN3aaa9GG1133133E", // class name
  bases__ZN3aaa9GG1133133E, 6,
  &(vtc__ZN3aaa9GG1133133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133211  : ::aaa::EE113 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11332113fooEv
  ~GG1133211(); // tgen
  GG1133211(); // tgen
};
//SIG(1 _ZN3aaa9GG1133211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133211 ::foo(){vfunc_called(this, "_ZN3aaa9GG11332113fooEv");}
aaa::GG1133211 ::~GG1133211(){ note_dtor("_ZN3aaa9GG1133211E", this);} // tgen
aaa::GG1133211 ::GG1133211(){ note_ctor("_ZN3aaa9GG1133211E", this);} // tgen
}
static void Test__ZN3aaa9GG1133211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133211E, buf);
    ::aaa::GG1133211 *dp, &lv = *(dp=new (buf) ::aaa::GG1133211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133211E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1133211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1133211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1133211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133211E);
    dp->::aaa::GG1133211::~GG1133211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133211E(Test__ZN3aaa9GG1133211E, "_ZN3aaa9GG1133211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133211C1Ev();
extern void _ZN3aaa9GG1133211D1Ev();
Name_Map name_map__ZN3aaa9GG1133211E[] = {
  NSPAIR(_ZN3aaa9GG1133211C1Ev),
  NSPAIR(_ZN3aaa9GG1133211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1133211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133211E[];
extern void _ZN3aaa9GG11332113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11332113fooEv,_ZThn8_N3aaa9GG11332113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332113fooEv,_ZThn20_N3aaa9GG11332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11332113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11332113fooEv,_ZThn8_N3aaa9GG11332113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332113fooEv,_ZThn20_N3aaa9GG11332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133211E[];
Class_Descriptor cd__ZN3aaa9GG1133211E = {  "_ZN3aaa9GG1133211E", // class name
  bases__ZN3aaa9GG1133211E, 6,
  &(vtc__ZN3aaa9GG1133211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133212  : ::aaa::EE113 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11332123barEv
  ~GG1133212(); // tgen
  GG1133212(); // tgen
};
//SIG(1 _ZN3aaa9GG1133212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133212 ::bar(){vfunc_called(this, "_ZN3aaa9GG11332123barEv");}
aaa::GG1133212 ::~GG1133212(){ note_dtor("_ZN3aaa9GG1133212E", this);} // tgen
aaa::GG1133212 ::GG1133212(){ note_ctor("_ZN3aaa9GG1133212E", this);} // tgen
}
static void Test__ZN3aaa9GG1133212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133212E, buf);
    ::aaa::GG1133212 *dp, &lv = *(dp=new (buf) ::aaa::GG1133212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133212E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1133212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1133212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1133212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133212E);
    dp->::aaa::GG1133212::~GG1133212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133212E(Test__ZN3aaa9GG1133212E, "_ZN3aaa9GG1133212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133212C1Ev();
extern void _ZN3aaa9GG1133212D1Ev();
Name_Map name_map__ZN3aaa9GG1133212E[] = {
  NSPAIR(_ZN3aaa9GG1133212C1Ev),
  NSPAIR(_ZN3aaa9GG1133212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1133212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133212E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11332123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11332123barEv,_ZThn20_N3aaa9GG11332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11332123barEv,_ZThn28_N3aaa9GG11332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11332123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332123barEv,_ZThn20_N3aaa9GG11332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11332123barEv,_ZThn28_N3aaa9GG11332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133212E[];
Class_Descriptor cd__ZN3aaa9GG1133212E = {  "_ZN3aaa9GG1133212E", // class name
  bases__ZN3aaa9GG1133212E, 6,
  &(vtc__ZN3aaa9GG1133212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133213  : ::aaa::EE113 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11332133fooEv
  virtual void  bar(); // _ZN3aaa9GG11332133barEv
  ~GG1133213(); // tgen
  GG1133213(); // tgen
};
//SIG(1 _ZN3aaa9GG1133213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133213 ::foo(){vfunc_called(this, "_ZN3aaa9GG11332133fooEv");}
void  aaa::GG1133213 ::bar(){vfunc_called(this, "_ZN3aaa9GG11332133barEv");}
aaa::GG1133213 ::~GG1133213(){ note_dtor("_ZN3aaa9GG1133213E", this);} // tgen
aaa::GG1133213 ::GG1133213(){ note_ctor("_ZN3aaa9GG1133213E", this);} // tgen
}
static void Test__ZN3aaa9GG1133213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133213E, buf);
    ::aaa::GG1133213 *dp, &lv = *(dp=new (buf) ::aaa::GG1133213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133213E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1133213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1133213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1133213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133213E);
    dp->::aaa::GG1133213::~GG1133213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133213E(Test__ZN3aaa9GG1133213E, "_ZN3aaa9GG1133213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133213C1Ev();
extern void _ZN3aaa9GG1133213D1Ev();
Name_Map name_map__ZN3aaa9GG1133213E[] = {
  NSPAIR(_ZN3aaa9GG1133213C1Ev),
  NSPAIR(_ZN3aaa9GG1133213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1133213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133213E[];
extern void _ZN3aaa9GG11332133fooEv();
extern void _ZN3aaa9GG11332133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11332133fooEv,_ZThn8_N3aaa9GG11332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332133fooEv,_ZThn20_N3aaa9GG11332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332133barEv,_ZThn20_N3aaa9GG11332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11332133barEv,_ZThn28_N3aaa9GG11332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11332133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11332133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11332133fooEv,_ZThn8_N3aaa9GG11332133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332133fooEv,_ZThn20_N3aaa9GG11332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332133barEv,_ZThn20_N3aaa9GG11332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11332133barEv,_ZThn28_N3aaa9GG11332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133213E[];
Class_Descriptor cd__ZN3aaa9GG1133213E = {  "_ZN3aaa9GG1133213E", // class name
  bases__ZN3aaa9GG1133213E, 6,
  &(vtc__ZN3aaa9GG1133213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133221  : ::aaa::EE113 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11332213fooEv
  ~GG1133221(); // tgen
  GG1133221(); // tgen
};
//SIG(1 _ZN3aaa9GG1133221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133221 ::foo(){vfunc_called(this, "_ZN3aaa9GG11332213fooEv");}
aaa::GG1133221 ::~GG1133221(){ note_dtor("_ZN3aaa9GG1133221E", this);} // tgen
aaa::GG1133221 ::GG1133221(){ note_ctor("_ZN3aaa9GG1133221E", this);} // tgen
}
static void Test__ZN3aaa9GG1133221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133221E, buf);
    ::aaa::GG1133221 *dp, &lv = *(dp=new (buf) ::aaa::GG1133221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133221E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1133221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1133221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1133221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133221E);
    dp->::aaa::GG1133221::~GG1133221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133221E(Test__ZN3aaa9GG1133221E, "_ZN3aaa9GG1133221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133221C1Ev();
extern void _ZN3aaa9GG1133221D1Ev();
Name_Map name_map__ZN3aaa9GG1133221E[] = {
  NSPAIR(_ZN3aaa9GG1133221C1Ev),
  NSPAIR(_ZN3aaa9GG1133221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1133221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133221E[];
extern void _ZN3aaa9GG11332213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11332213fooEv,_ZThn8_N3aaa9GG11332213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332213fooEv,_ZThn20_N3aaa9GG11332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11332213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11332213fooEv,_ZThn8_N3aaa9GG11332213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332213fooEv,_ZThn20_N3aaa9GG11332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133221E[];
Class_Descriptor cd__ZN3aaa9GG1133221E = {  "_ZN3aaa9GG1133221E", // class name
  bases__ZN3aaa9GG1133221E, 6,
  &(vtc__ZN3aaa9GG1133221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133222  : ::aaa::EE113 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11332223barEv
  ~GG1133222(); // tgen
  GG1133222(); // tgen
};
//SIG(1 _ZN3aaa9GG1133222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133222 ::bar(){vfunc_called(this, "_ZN3aaa9GG11332223barEv");}
aaa::GG1133222 ::~GG1133222(){ note_dtor("_ZN3aaa9GG1133222E", this);} // tgen
aaa::GG1133222 ::GG1133222(){ note_ctor("_ZN3aaa9GG1133222E", this);} // tgen
}
static void Test__ZN3aaa9GG1133222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133222E, buf);
    ::aaa::GG1133222 *dp, &lv = *(dp=new (buf) ::aaa::GG1133222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133222E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1133222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1133222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1133222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133222E);
    dp->::aaa::GG1133222::~GG1133222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133222E(Test__ZN3aaa9GG1133222E, "_ZN3aaa9GG1133222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133222C1Ev();
extern void _ZN3aaa9GG1133222D1Ev();
Name_Map name_map__ZN3aaa9GG1133222E[] = {
  NSPAIR(_ZN3aaa9GG1133222C1Ev),
  NSPAIR(_ZN3aaa9GG1133222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1133222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133222E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11332223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11332223barEv,_ZThn20_N3aaa9GG11332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11332223barEv,_ZThn28_N3aaa9GG11332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11332223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332223barEv,_ZThn20_N3aaa9GG11332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11332223barEv,_ZThn28_N3aaa9GG11332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133222E[];
Class_Descriptor cd__ZN3aaa9GG1133222E = {  "_ZN3aaa9GG1133222E", // class name
  bases__ZN3aaa9GG1133222E, 6,
  &(vtc__ZN3aaa9GG1133222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133223  : ::aaa::EE113 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11332233fooEv
  virtual void  bar(); // _ZN3aaa9GG11332233barEv
  ~GG1133223(); // tgen
  GG1133223(); // tgen
};
//SIG(1 _ZN3aaa9GG1133223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133223 ::foo(){vfunc_called(this, "_ZN3aaa9GG11332233fooEv");}
void  aaa::GG1133223 ::bar(){vfunc_called(this, "_ZN3aaa9GG11332233barEv");}
aaa::GG1133223 ::~GG1133223(){ note_dtor("_ZN3aaa9GG1133223E", this);} // tgen
aaa::GG1133223 ::GG1133223(){ note_ctor("_ZN3aaa9GG1133223E", this);} // tgen
}
static void Test__ZN3aaa9GG1133223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133223E, buf);
    ::aaa::GG1133223 *dp, &lv = *(dp=new (buf) ::aaa::GG1133223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133223E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1133223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1133223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1133223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133223E);
    dp->::aaa::GG1133223::~GG1133223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133223E(Test__ZN3aaa9GG1133223E, "_ZN3aaa9GG1133223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133223C1Ev();
extern void _ZN3aaa9GG1133223D1Ev();
Name_Map name_map__ZN3aaa9GG1133223E[] = {
  NSPAIR(_ZN3aaa9GG1133223C1Ev),
  NSPAIR(_ZN3aaa9GG1133223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1133223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133223E[];
extern void _ZN3aaa9GG11332233fooEv();
extern void _ZN3aaa9GG11332233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11332233fooEv,_ZThn8_N3aaa9GG11332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332233fooEv,_ZThn20_N3aaa9GG11332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332233barEv,_ZThn20_N3aaa9GG11332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11332233barEv,_ZThn28_N3aaa9GG11332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11332233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11332233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11332233fooEv,_ZThn8_N3aaa9GG11332233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332233fooEv,_ZThn20_N3aaa9GG11332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332233barEv,_ZThn20_N3aaa9GG11332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11332233barEv,_ZThn28_N3aaa9GG11332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133223E[];
Class_Descriptor cd__ZN3aaa9GG1133223E = {  "_ZN3aaa9GG1133223E", // class name
  bases__ZN3aaa9GG1133223E, 6,
  &(vtc__ZN3aaa9GG1133223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133231  : ::aaa::EE113 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11332313fooEv
  ~GG1133231(); // tgen
  GG1133231(); // tgen
};
//SIG(1 _ZN3aaa9GG1133231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133231 ::foo(){vfunc_called(this, "_ZN3aaa9GG11332313fooEv");}
aaa::GG1133231 ::~GG1133231(){ note_dtor("_ZN3aaa9GG1133231E", this);} // tgen
aaa::GG1133231 ::GG1133231(){ note_ctor("_ZN3aaa9GG1133231E", this);} // tgen
}
static void Test__ZN3aaa9GG1133231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133231E, buf);
    ::aaa::GG1133231 *dp, &lv = *(dp=new (buf) ::aaa::GG1133231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133231E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1133231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1133231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1133231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133231E);
    dp->::aaa::GG1133231::~GG1133231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133231E(Test__ZN3aaa9GG1133231E, "_ZN3aaa9GG1133231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133231C1Ev();
extern void _ZN3aaa9GG1133231D1Ev();
Name_Map name_map__ZN3aaa9GG1133231E[] = {
  NSPAIR(_ZN3aaa9GG1133231C1Ev),
  NSPAIR(_ZN3aaa9GG1133231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1133231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133231E[];
extern void _ZN3aaa9GG11332313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11332313fooEv,_ZThn8_N3aaa9GG11332313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332313fooEv,_ZThn20_N3aaa9GG11332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11332313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11332313fooEv,_ZThn8_N3aaa9GG11332313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332313fooEv,_ZThn20_N3aaa9GG11332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133231E[];
Class_Descriptor cd__ZN3aaa9GG1133231E = {  "_ZN3aaa9GG1133231E", // class name
  bases__ZN3aaa9GG1133231E, 6,
  &(vtc__ZN3aaa9GG1133231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133232  : ::aaa::EE113 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11332323barEv
  ~GG1133232(); // tgen
  GG1133232(); // tgen
};
//SIG(1 _ZN3aaa9GG1133232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133232 ::bar(){vfunc_called(this, "_ZN3aaa9GG11332323barEv");}
aaa::GG1133232 ::~GG1133232(){ note_dtor("_ZN3aaa9GG1133232E", this);} // tgen
aaa::GG1133232 ::GG1133232(){ note_ctor("_ZN3aaa9GG1133232E", this);} // tgen
}
static void Test__ZN3aaa9GG1133232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133232E, buf);
    ::aaa::GG1133232 *dp, &lv = *(dp=new (buf) ::aaa::GG1133232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133232E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1133232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1133232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1133232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133232E);
    dp->::aaa::GG1133232::~GG1133232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133232E(Test__ZN3aaa9GG1133232E, "_ZN3aaa9GG1133232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133232C1Ev();
extern void _ZN3aaa9GG1133232D1Ev();
Name_Map name_map__ZN3aaa9GG1133232E[] = {
  NSPAIR(_ZN3aaa9GG1133232C1Ev),
  NSPAIR(_ZN3aaa9GG1133232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1133232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133232E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11332323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11332323barEv,_ZThn20_N3aaa9GG11332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11332323barEv,_ZThn28_N3aaa9GG11332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11332323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332323barEv,_ZThn20_N3aaa9GG11332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11332323barEv,_ZThn28_N3aaa9GG11332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133232E[];
Class_Descriptor cd__ZN3aaa9GG1133232E = {  "_ZN3aaa9GG1133232E", // class name
  bases__ZN3aaa9GG1133232E, 6,
  &(vtc__ZN3aaa9GG1133232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133233  : ::aaa::EE113 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11332333fooEv
  virtual void  bar(); // _ZN3aaa9GG11332333barEv
  ~GG1133233(); // tgen
  GG1133233(); // tgen
};
//SIG(1 _ZN3aaa9GG1133233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133233 ::foo(){vfunc_called(this, "_ZN3aaa9GG11332333fooEv");}
void  aaa::GG1133233 ::bar(){vfunc_called(this, "_ZN3aaa9GG11332333barEv");}
aaa::GG1133233 ::~GG1133233(){ note_dtor("_ZN3aaa9GG1133233E", this);} // tgen
aaa::GG1133233 ::GG1133233(){ note_ctor("_ZN3aaa9GG1133233E", this);} // tgen
}
static void Test__ZN3aaa9GG1133233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133233E, buf);
    ::aaa::GG1133233 *dp, &lv = *(dp=new (buf) ::aaa::GG1133233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133233E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1133233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1133233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1133233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133233E);
    dp->::aaa::GG1133233::~GG1133233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133233E(Test__ZN3aaa9GG1133233E, "_ZN3aaa9GG1133233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133233C1Ev();
extern void _ZN3aaa9GG1133233D1Ev();
Name_Map name_map__ZN3aaa9GG1133233E[] = {
  NSPAIR(_ZN3aaa9GG1133233C1Ev),
  NSPAIR(_ZN3aaa9GG1133233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1133233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133233E[];
extern void _ZN3aaa9GG11332333fooEv();
extern void _ZN3aaa9GG11332333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11332333fooEv,_ZThn8_N3aaa9GG11332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332333fooEv,_ZThn20_N3aaa9GG11332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11332333barEv,_ZThn20_N3aaa9GG11332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11332333barEv,_ZThn28_N3aaa9GG11332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11332333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11332333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11332333fooEv,_ZThn8_N3aaa9GG11332333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332333fooEv,_ZThn20_N3aaa9GG11332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11332333barEv,_ZThn20_N3aaa9GG11332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11332333barEv,_ZThn28_N3aaa9GG11332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133233E[];
Class_Descriptor cd__ZN3aaa9GG1133233E = {  "_ZN3aaa9GG1133233E", // class name
  bases__ZN3aaa9GG1133233E, 6,
  &(vtc__ZN3aaa9GG1133233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133311  : ::aaa::EE113 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11333113fooEv
  ~GG1133311(); // tgen
  GG1133311(); // tgen
};
//SIG(1 _ZN3aaa9GG1133311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133311 ::foo(){vfunc_called(this, "_ZN3aaa9GG11333113fooEv");}
aaa::GG1133311 ::~GG1133311(){ note_dtor("_ZN3aaa9GG1133311E", this);} // tgen
aaa::GG1133311 ::GG1133311(){ note_ctor("_ZN3aaa9GG1133311E", this);} // tgen
}
static void Test__ZN3aaa9GG1133311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133311E, buf);
    ::aaa::GG1133311 *dp, &lv = *(dp=new (buf) ::aaa::GG1133311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133311E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1133311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1133311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1133311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133311E);
    dp->::aaa::GG1133311::~GG1133311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133311E(Test__ZN3aaa9GG1133311E, "_ZN3aaa9GG1133311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133311C1Ev();
extern void _ZN3aaa9GG1133311D1Ev();
Name_Map name_map__ZN3aaa9GG1133311E[] = {
  NSPAIR(_ZN3aaa9GG1133311C1Ev),
  NSPAIR(_ZN3aaa9GG1133311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1133311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133311E[];
extern void _ZN3aaa9GG11333113fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11333113fooEv,_ZThn8_N3aaa9GG11333113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333113fooEv,_ZThn20_N3aaa9GG11333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11333113fooEv,_ZThn28_N3aaa9GG11333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11333113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11333113fooEv,_ZThn8_N3aaa9GG11333113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333113fooEv,_ZThn20_N3aaa9GG11333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333113fooEv,_ZThn28_N3aaa9GG11333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133311E[];
Class_Descriptor cd__ZN3aaa9GG1133311E = {  "_ZN3aaa9GG1133311E", // class name
  bases__ZN3aaa9GG1133311E, 6,
  &(vtc__ZN3aaa9GG1133311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133312  : ::aaa::EE113 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11333123barEv
  ~GG1133312(); // tgen
  GG1133312(); // tgen
};
//SIG(1 _ZN3aaa9GG1133312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133312 ::bar(){vfunc_called(this, "_ZN3aaa9GG11333123barEv");}
aaa::GG1133312 ::~GG1133312(){ note_dtor("_ZN3aaa9GG1133312E", this);} // tgen
aaa::GG1133312 ::GG1133312(){ note_ctor("_ZN3aaa9GG1133312E", this);} // tgen
}
static void Test__ZN3aaa9GG1133312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133312E, buf);
    ::aaa::GG1133312 *dp, &lv = *(dp=new (buf) ::aaa::GG1133312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133312E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1133312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1133312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1133312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133312E);
    dp->::aaa::GG1133312::~GG1133312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133312E(Test__ZN3aaa9GG1133312E, "_ZN3aaa9GG1133312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133312C1Ev();
extern void _ZN3aaa9GG1133312D1Ev();
Name_Map name_map__ZN3aaa9GG1133312E[] = {
  NSPAIR(_ZN3aaa9GG1133312C1Ev),
  NSPAIR(_ZN3aaa9GG1133312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1133312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133312E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11333123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11333123barEv,_ZThn20_N3aaa9GG11333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11333123barEv,_ZThn28_N3aaa9GG11333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11333123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333123barEv,_ZThn20_N3aaa9GG11333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333123barEv,_ZThn28_N3aaa9GG11333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133312E[];
Class_Descriptor cd__ZN3aaa9GG1133312E = {  "_ZN3aaa9GG1133312E", // class name
  bases__ZN3aaa9GG1133312E, 6,
  &(vtc__ZN3aaa9GG1133312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133313  : ::aaa::EE113 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11333133fooEv
  virtual void  bar(); // _ZN3aaa9GG11333133barEv
  ~GG1133313(); // tgen
  GG1133313(); // tgen
};
//SIG(1 _ZN3aaa9GG1133313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133313 ::foo(){vfunc_called(this, "_ZN3aaa9GG11333133fooEv");}
void  aaa::GG1133313 ::bar(){vfunc_called(this, "_ZN3aaa9GG11333133barEv");}
aaa::GG1133313 ::~GG1133313(){ note_dtor("_ZN3aaa9GG1133313E", this);} // tgen
aaa::GG1133313 ::GG1133313(){ note_ctor("_ZN3aaa9GG1133313E", this);} // tgen
}
static void Test__ZN3aaa9GG1133313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133313E, buf);
    ::aaa::GG1133313 *dp, &lv = *(dp=new (buf) ::aaa::GG1133313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133313E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1133313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1133313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1133313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133313E);
    dp->::aaa::GG1133313::~GG1133313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133313E(Test__ZN3aaa9GG1133313E, "_ZN3aaa9GG1133313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133313C1Ev();
extern void _ZN3aaa9GG1133313D1Ev();
Name_Map name_map__ZN3aaa9GG1133313E[] = {
  NSPAIR(_ZN3aaa9GG1133313C1Ev),
  NSPAIR(_ZN3aaa9GG1133313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1133313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133313E[];
extern void _ZN3aaa9GG11333133fooEv();
extern void _ZN3aaa9GG11333133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11333133fooEv,_ZThn8_N3aaa9GG11333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333133fooEv,_ZThn20_N3aaa9GG11333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333133barEv,_ZThn20_N3aaa9GG11333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11333133fooEv,_ZThn28_N3aaa9GG11333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11333133barEv,_ZThn28_N3aaa9GG11333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11333133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11333133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11333133fooEv,_ZThn8_N3aaa9GG11333133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333133fooEv,_ZThn20_N3aaa9GG11333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333133barEv,_ZThn20_N3aaa9GG11333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333133fooEv,_ZThn28_N3aaa9GG11333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333133barEv,_ZThn28_N3aaa9GG11333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133313E[];
Class_Descriptor cd__ZN3aaa9GG1133313E = {  "_ZN3aaa9GG1133313E", // class name
  bases__ZN3aaa9GG1133313E, 6,
  &(vtc__ZN3aaa9GG1133313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133321  : ::aaa::EE113 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11333213fooEv
  ~GG1133321(); // tgen
  GG1133321(); // tgen
};
//SIG(1 _ZN3aaa9GG1133321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133321 ::foo(){vfunc_called(this, "_ZN3aaa9GG11333213fooEv");}
aaa::GG1133321 ::~GG1133321(){ note_dtor("_ZN3aaa9GG1133321E", this);} // tgen
aaa::GG1133321 ::GG1133321(){ note_ctor("_ZN3aaa9GG1133321E", this);} // tgen
}
static void Test__ZN3aaa9GG1133321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133321E, buf);
    ::aaa::GG1133321 *dp, &lv = *(dp=new (buf) ::aaa::GG1133321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133321E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1133321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1133321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1133321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133321E);
    dp->::aaa::GG1133321::~GG1133321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133321E(Test__ZN3aaa9GG1133321E, "_ZN3aaa9GG1133321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133321C1Ev();
extern void _ZN3aaa9GG1133321D1Ev();
Name_Map name_map__ZN3aaa9GG1133321E[] = {
  NSPAIR(_ZN3aaa9GG1133321C1Ev),
  NSPAIR(_ZN3aaa9GG1133321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1133321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133321E[];
extern void _ZN3aaa9GG11333213fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11333213fooEv,_ZThn8_N3aaa9GG11333213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333213fooEv,_ZThn20_N3aaa9GG11333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11333213fooEv,_ZThn28_N3aaa9GG11333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11333213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11333213fooEv,_ZThn8_N3aaa9GG11333213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333213fooEv,_ZThn20_N3aaa9GG11333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333213fooEv,_ZThn28_N3aaa9GG11333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133321E[];
Class_Descriptor cd__ZN3aaa9GG1133321E = {  "_ZN3aaa9GG1133321E", // class name
  bases__ZN3aaa9GG1133321E, 6,
  &(vtc__ZN3aaa9GG1133321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133322  : ::aaa::EE113 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11333223barEv
  ~GG1133322(); // tgen
  GG1133322(); // tgen
};
//SIG(1 _ZN3aaa9GG1133322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133322 ::bar(){vfunc_called(this, "_ZN3aaa9GG11333223barEv");}
aaa::GG1133322 ::~GG1133322(){ note_dtor("_ZN3aaa9GG1133322E", this);} // tgen
aaa::GG1133322 ::GG1133322(){ note_ctor("_ZN3aaa9GG1133322E", this);} // tgen
}
static void Test__ZN3aaa9GG1133322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133322E, buf);
    ::aaa::GG1133322 *dp, &lv = *(dp=new (buf) ::aaa::GG1133322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133322E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1133322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1133322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1133322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133322E);
    dp->::aaa::GG1133322::~GG1133322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133322E(Test__ZN3aaa9GG1133322E, "_ZN3aaa9GG1133322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133322C1Ev();
extern void _ZN3aaa9GG1133322D1Ev();
Name_Map name_map__ZN3aaa9GG1133322E[] = {
  NSPAIR(_ZN3aaa9GG1133322C1Ev),
  NSPAIR(_ZN3aaa9GG1133322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1133322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133322E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11333223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11333223barEv,_ZThn20_N3aaa9GG11333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11333223barEv,_ZThn28_N3aaa9GG11333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11333223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333223barEv,_ZThn20_N3aaa9GG11333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333223barEv,_ZThn28_N3aaa9GG11333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133322E[];
Class_Descriptor cd__ZN3aaa9GG1133322E = {  "_ZN3aaa9GG1133322E", // class name
  bases__ZN3aaa9GG1133322E, 6,
  &(vtc__ZN3aaa9GG1133322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133323  : ::aaa::EE113 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11333233fooEv
  virtual void  bar(); // _ZN3aaa9GG11333233barEv
  ~GG1133323(); // tgen
  GG1133323(); // tgen
};
//SIG(1 _ZN3aaa9GG1133323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133323 ::foo(){vfunc_called(this, "_ZN3aaa9GG11333233fooEv");}
void  aaa::GG1133323 ::bar(){vfunc_called(this, "_ZN3aaa9GG11333233barEv");}
aaa::GG1133323 ::~GG1133323(){ note_dtor("_ZN3aaa9GG1133323E", this);} // tgen
aaa::GG1133323 ::GG1133323(){ note_ctor("_ZN3aaa9GG1133323E", this);} // tgen
}
static void Test__ZN3aaa9GG1133323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133323E, buf);
    ::aaa::GG1133323 *dp, &lv = *(dp=new (buf) ::aaa::GG1133323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133323E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1133323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1133323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1133323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133323E);
    dp->::aaa::GG1133323::~GG1133323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133323E(Test__ZN3aaa9GG1133323E, "_ZN3aaa9GG1133323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133323C1Ev();
extern void _ZN3aaa9GG1133323D1Ev();
Name_Map name_map__ZN3aaa9GG1133323E[] = {
  NSPAIR(_ZN3aaa9GG1133323C1Ev),
  NSPAIR(_ZN3aaa9GG1133323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1133323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133323E[];
extern void _ZN3aaa9GG11333233fooEv();
extern void _ZN3aaa9GG11333233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11333233fooEv,_ZThn8_N3aaa9GG11333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333233fooEv,_ZThn20_N3aaa9GG11333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333233barEv,_ZThn20_N3aaa9GG11333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11333233fooEv,_ZThn28_N3aaa9GG11333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11333233barEv,_ZThn28_N3aaa9GG11333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11333233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11333233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11333233fooEv,_ZThn8_N3aaa9GG11333233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333233fooEv,_ZThn20_N3aaa9GG11333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333233barEv,_ZThn20_N3aaa9GG11333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333233fooEv,_ZThn28_N3aaa9GG11333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333233barEv,_ZThn28_N3aaa9GG11333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133323E[];
Class_Descriptor cd__ZN3aaa9GG1133323E = {  "_ZN3aaa9GG1133323E", // class name
  bases__ZN3aaa9GG1133323E, 6,
  &(vtc__ZN3aaa9GG1133323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133331  : ::aaa::EE113 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11333313fooEv
  ~GG1133331(); // tgen
  GG1133331(); // tgen
};
//SIG(1 _ZN3aaa9GG1133331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133331 ::foo(){vfunc_called(this, "_ZN3aaa9GG11333313fooEv");}
aaa::GG1133331 ::~GG1133331(){ note_dtor("_ZN3aaa9GG1133331E", this);} // tgen
aaa::GG1133331 ::GG1133331(){ note_ctor("_ZN3aaa9GG1133331E", this);} // tgen
}
static void Test__ZN3aaa9GG1133331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133331E, buf);
    ::aaa::GG1133331 *dp, &lv = *(dp=new (buf) ::aaa::GG1133331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133331E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1133331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1133331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1133331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133331E);
    dp->::aaa::GG1133331::~GG1133331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133331E(Test__ZN3aaa9GG1133331E, "_ZN3aaa9GG1133331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133331C1Ev();
extern void _ZN3aaa9GG1133331D1Ev();
Name_Map name_map__ZN3aaa9GG1133331E[] = {
  NSPAIR(_ZN3aaa9GG1133331C1Ev),
  NSPAIR(_ZN3aaa9GG1133331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1133331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133331E[];
extern void _ZN3aaa9GG11333313fooEv();
extern void _ZN3aaa5EE1133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11333313fooEv,_ZThn8_N3aaa9GG11333313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333313fooEv,_ZThn20_N3aaa9GG11333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG11333313fooEv,_ZThn28_N3aaa9GG11333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11333313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11333313fooEv,_ZThn8_N3aaa9GG11333313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333313fooEv,_ZThn20_N3aaa9GG11333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333313fooEv,_ZThn28_N3aaa9GG11333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133331E[];
Class_Descriptor cd__ZN3aaa9GG1133331E = {  "_ZN3aaa9GG1133331E", // class name
  bases__ZN3aaa9GG1133331E, 6,
  &(vtc__ZN3aaa9GG1133331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133332  : ::aaa::EE113 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG11333323barEv
  ~GG1133332(); // tgen
  GG1133332(); // tgen
};
//SIG(1 _ZN3aaa9GG1133332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1133332 ::bar(){vfunc_called(this, "_ZN3aaa9GG11333323barEv");}
aaa::GG1133332 ::~GG1133332(){ note_dtor("_ZN3aaa9GG1133332E", this);} // tgen
aaa::GG1133332 ::GG1133332(){ note_ctor("_ZN3aaa9GG1133332E", this);} // tgen
}
static void Test__ZN3aaa9GG1133332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133332E, buf);
    ::aaa::GG1133332 *dp, &lv = *(dp=new (buf) ::aaa::GG1133332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133332E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1133332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1133332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1133332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133332E);
    dp->::aaa::GG1133332::~GG1133332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133332E(Test__ZN3aaa9GG1133332E, "_ZN3aaa9GG1133332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133332C1Ev();
extern void _ZN3aaa9GG1133332D1Ev();
Name_Map name_map__ZN3aaa9GG1133332E[] = {
  NSPAIR(_ZN3aaa9GG1133332C1Ev),
  NSPAIR(_ZN3aaa9GG1133332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1133332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133332E[];
extern void _ZN3aaa5EE1133fooEv();
extern void _ZN3aaa9GG11333323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG11333323barEv,_ZThn20_N3aaa9GG11333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11333323barEv,_ZThn28_N3aaa9GG11333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11333323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1133fooEv,_ZThn8_N3aaa5EE1133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333323barEv,_ZThn20_N3aaa9GG11333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333323barEv,_ZThn28_N3aaa9GG11333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133332E[];
Class_Descriptor cd__ZN3aaa9GG1133332E = {  "_ZN3aaa9GG1133332E", // class name
  bases__ZN3aaa9GG1133332E, 6,
  &(vtc__ZN3aaa9GG1133332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1133333  : ::aaa::EE113 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG11333333fooEv
  virtual void  bar(); // _ZN3aaa9GG11333333barEv
  ~GG1133333(); // tgen
  GG1133333(); // tgen
};
//SIG(1 _ZN3aaa9GG1133333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1133333 ::foo(){vfunc_called(this, "_ZN3aaa9GG11333333fooEv");}
void  aaa::GG1133333 ::bar(){vfunc_called(this, "_ZN3aaa9GG11333333barEv");}
aaa::GG1133333 ::~GG1133333(){ note_dtor("_ZN3aaa9GG1133333E", this);} // tgen
aaa::GG1133333 ::GG1133333(){ note_ctor("_ZN3aaa9GG1133333E", this);} // tgen
}
static void Test__ZN3aaa9GG1133333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1133333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1133333E, buf);
    ::aaa::GG1133333 *dp, &lv = *(dp=new (buf) ::aaa::GG1133333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1133333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1133333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE113*), 0, "_ZN3aaa9GG1133333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE113*), ABISELECT(16,8), "_ZN3aaa9GG1133333E");
    check_base_class_offset(lv, (::aaa::EE113*), 0, "_ZN3aaa9GG1133333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1133333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1133333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1133333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1133333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1133333E);
    dp->::aaa::GG1133333::~GG1133333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1133333E(Test__ZN3aaa9GG1133333E, "_ZN3aaa9GG1133333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1133333C1Ev();
extern void _ZN3aaa9GG1133333D1Ev();
Name_Map name_map__ZN3aaa9GG1133333E[] = {
  NSPAIR(_ZN3aaa9GG1133333C1Ev),
  NSPAIR(_ZN3aaa9GG1133333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE113E;
extern VTBL_ENTRY _ZTIN3aaa5EE113E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE113E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1133333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE113E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1133333E[];
extern void _ZN3aaa9GG11333333fooEv();
extern void _ZN3aaa9GG11333333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG11333333fooEv,_ZThn8_N3aaa9GG11333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333333fooEv,_ZThn20_N3aaa9GG11333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG11333333barEv,_ZThn20_N3aaa9GG11333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11333333fooEv,_ZThn28_N3aaa9GG11333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG11333333barEv,_ZThn28_N3aaa9GG11333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1133333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG11333333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG11333333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG11333333fooEv,_ZThn8_N3aaa9GG11333333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333333fooEv,_ZThn20_N3aaa9GG11333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG11333333barEv,_ZThn20_N3aaa9GG11333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333333fooEv,_ZThn28_N3aaa9GG11333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG11333333barEv,_ZThn28_N3aaa9GG11333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1133333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1133333E[];
Class_Descriptor cd__ZN3aaa9GG1133333E = {  "_ZN3aaa9GG1133333E", // class name
  bases__ZN3aaa9GG1133333E, 6,
  &(vtc__ZN3aaa9GG1133333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1133333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1133333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211111  : ::aaa::EE121 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12111113fooEv
  ~GG1211111(); // tgen
  GG1211111(); // tgen
};
//SIG(1 _ZN3aaa9GG1211111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12111113fooEv");}
aaa::GG1211111 ::~GG1211111(){ note_dtor("_ZN3aaa9GG1211111E", this);} // tgen
aaa::GG1211111 ::GG1211111(){ note_ctor("_ZN3aaa9GG1211111E", this);} // tgen
}
static void Test__ZN3aaa9GG1211111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211111E, buf);
    ::aaa::GG1211111 *dp, &lv = *(dp=new (buf) ::aaa::GG1211111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211111E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1211111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1211111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1211111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211111E);
    dp->::aaa::GG1211111::~GG1211111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211111E(Test__ZN3aaa9GG1211111E, "_ZN3aaa9GG1211111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211111C1Ev();
extern void _ZN3aaa9GG1211111D1Ev();
Name_Map name_map__ZN3aaa9GG1211111E[] = {
  NSPAIR(_ZN3aaa9GG1211111C1Ev),
  NSPAIR(_ZN3aaa9GG1211111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1211111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211111E[];
extern void _ZN3aaa9GG12111113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12111113fooEv,_ZThn20_N3aaa9GG12111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12111113fooEv,_ZThn28_N3aaa9GG12111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12111113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111113fooEv,_ZThn20_N3aaa9GG12111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12111113fooEv,_ZThn28_N3aaa9GG12111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211111E[];
Class_Descriptor cd__ZN3aaa9GG1211111E = {  "_ZN3aaa9GG1211111E", // class name
  bases__ZN3aaa9GG1211111E, 6,
  &(vtc__ZN3aaa9GG1211111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211111E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211112  : ::aaa::EE121 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12111123barEv
  ~GG1211112(); // tgen
  GG1211112(); // tgen
};
//SIG(1 _ZN3aaa9GG1211112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12111123barEv");}
aaa::GG1211112 ::~GG1211112(){ note_dtor("_ZN3aaa9GG1211112E", this);} // tgen
aaa::GG1211112 ::GG1211112(){ note_ctor("_ZN3aaa9GG1211112E", this);} // tgen
}
static void Test__ZN3aaa9GG1211112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211112E, buf);
    ::aaa::GG1211112 *dp, &lv = *(dp=new (buf) ::aaa::GG1211112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211112E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1211112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1211112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1211112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211112E);
    dp->::aaa::GG1211112::~GG1211112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211112E(Test__ZN3aaa9GG1211112E, "_ZN3aaa9GG1211112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211112C1Ev();
extern void _ZN3aaa9GG1211112D1Ev();
Name_Map name_map__ZN3aaa9GG1211112E[] = {
  NSPAIR(_ZN3aaa9GG1211112C1Ev),
  NSPAIR(_ZN3aaa9GG1211112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1211112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211112E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12111123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12111123barEv,_ZThn8_N3aaa9GG12111123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12111123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12111123barEv,_ZThn8_N3aaa9GG12111123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211112E[];
Class_Descriptor cd__ZN3aaa9GG1211112E = {  "_ZN3aaa9GG1211112E", // class name
  bases__ZN3aaa9GG1211112E, 6,
  &(vtc__ZN3aaa9GG1211112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211113  : ::aaa::EE121 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12111133fooEv
  virtual void  bar(); // _ZN3aaa9GG12111133barEv
  ~GG1211113(); // tgen
  GG1211113(); // tgen
};
//SIG(1 _ZN3aaa9GG1211113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12111133fooEv");}
void  aaa::GG1211113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12111133barEv");}
aaa::GG1211113 ::~GG1211113(){ note_dtor("_ZN3aaa9GG1211113E", this);} // tgen
aaa::GG1211113 ::GG1211113(){ note_ctor("_ZN3aaa9GG1211113E", this);} // tgen
}
static void Test__ZN3aaa9GG1211113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211113E, buf);
    ::aaa::GG1211113 *dp, &lv = *(dp=new (buf) ::aaa::GG1211113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211113E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1211113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1211113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1211113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211113E);
    dp->::aaa::GG1211113::~GG1211113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211113E(Test__ZN3aaa9GG1211113E, "_ZN3aaa9GG1211113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211113C1Ev();
extern void _ZN3aaa9GG1211113D1Ev();
Name_Map name_map__ZN3aaa9GG1211113E[] = {
  NSPAIR(_ZN3aaa9GG1211113C1Ev),
  NSPAIR(_ZN3aaa9GG1211113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1211113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211113E[];
extern void _ZN3aaa9GG12111133fooEv();
extern void _ZN3aaa9GG12111133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12111133barEv,_ZThn8_N3aaa9GG12111133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12111133fooEv,_ZThn20_N3aaa9GG12111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12111133fooEv,_ZThn28_N3aaa9GG12111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12111133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12111133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12111133barEv,_ZThn8_N3aaa9GG12111133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111133fooEv,_ZThn20_N3aaa9GG12111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12111133fooEv,_ZThn28_N3aaa9GG12111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211113E[];
Class_Descriptor cd__ZN3aaa9GG1211113E = {  "_ZN3aaa9GG1211113E", // class name
  bases__ZN3aaa9GG1211113E, 6,
  &(vtc__ZN3aaa9GG1211113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211121  : ::aaa::EE121 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12111213fooEv
  ~GG1211121(); // tgen
  GG1211121(); // tgen
};
//SIG(1 _ZN3aaa9GG1211121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12111213fooEv");}
aaa::GG1211121 ::~GG1211121(){ note_dtor("_ZN3aaa9GG1211121E", this);} // tgen
aaa::GG1211121 ::GG1211121(){ note_ctor("_ZN3aaa9GG1211121E", this);} // tgen
}
static void Test__ZN3aaa9GG1211121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211121E, buf);
    ::aaa::GG1211121 *dp, &lv = *(dp=new (buf) ::aaa::GG1211121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211121E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1211121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1211121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1211121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211121E);
    dp->::aaa::GG1211121::~GG1211121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211121E(Test__ZN3aaa9GG1211121E, "_ZN3aaa9GG1211121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211121C1Ev();
extern void _ZN3aaa9GG1211121D1Ev();
Name_Map name_map__ZN3aaa9GG1211121E[] = {
  NSPAIR(_ZN3aaa9GG1211121C1Ev),
  NSPAIR(_ZN3aaa9GG1211121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1211121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211121E[];
extern void _ZN3aaa9GG12111213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12111213fooEv,_ZThn20_N3aaa9GG12111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12111213fooEv,_ZThn28_N3aaa9GG12111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12111213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111213fooEv,_ZThn20_N3aaa9GG12111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12111213fooEv,_ZThn28_N3aaa9GG12111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211121E[];
Class_Descriptor cd__ZN3aaa9GG1211121E = {  "_ZN3aaa9GG1211121E", // class name
  bases__ZN3aaa9GG1211121E, 6,
  &(vtc__ZN3aaa9GG1211121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211122  : ::aaa::EE121 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12111223barEv
  ~GG1211122(); // tgen
  GG1211122(); // tgen
};
//SIG(1 _ZN3aaa9GG1211122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12111223barEv");}
aaa::GG1211122 ::~GG1211122(){ note_dtor("_ZN3aaa9GG1211122E", this);} // tgen
aaa::GG1211122 ::GG1211122(){ note_ctor("_ZN3aaa9GG1211122E", this);} // tgen
}
static void Test__ZN3aaa9GG1211122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211122E, buf);
    ::aaa::GG1211122 *dp, &lv = *(dp=new (buf) ::aaa::GG1211122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211122E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1211122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1211122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1211122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211122E);
    dp->::aaa::GG1211122::~GG1211122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211122E(Test__ZN3aaa9GG1211122E, "_ZN3aaa9GG1211122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211122C1Ev();
extern void _ZN3aaa9GG1211122D1Ev();
Name_Map name_map__ZN3aaa9GG1211122E[] = {
  NSPAIR(_ZN3aaa9GG1211122C1Ev),
  NSPAIR(_ZN3aaa9GG1211122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1211122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211122E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12111223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12111223barEv,_ZThn8_N3aaa9GG12111223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12111223barEv,_ZThn20_N3aaa9GG12111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12111223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12111223barEv,_ZThn8_N3aaa9GG12111223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111223barEv,_ZThn20_N3aaa9GG12111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211122E[];
Class_Descriptor cd__ZN3aaa9GG1211122E = {  "_ZN3aaa9GG1211122E", // class name
  bases__ZN3aaa9GG1211122E, 6,
  &(vtc__ZN3aaa9GG1211122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211123  : ::aaa::EE121 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12111233fooEv
  virtual void  bar(); // _ZN3aaa9GG12111233barEv
  ~GG1211123(); // tgen
  GG1211123(); // tgen
};
//SIG(1 _ZN3aaa9GG1211123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12111233fooEv");}
void  aaa::GG1211123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12111233barEv");}
aaa::GG1211123 ::~GG1211123(){ note_dtor("_ZN3aaa9GG1211123E", this);} // tgen
aaa::GG1211123 ::GG1211123(){ note_ctor("_ZN3aaa9GG1211123E", this);} // tgen
}
static void Test__ZN3aaa9GG1211123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211123E, buf);
    ::aaa::GG1211123 *dp, &lv = *(dp=new (buf) ::aaa::GG1211123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211123E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1211123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1211123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1211123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211123E);
    dp->::aaa::GG1211123::~GG1211123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211123E(Test__ZN3aaa9GG1211123E, "_ZN3aaa9GG1211123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211123C1Ev();
extern void _ZN3aaa9GG1211123D1Ev();
Name_Map name_map__ZN3aaa9GG1211123E[] = {
  NSPAIR(_ZN3aaa9GG1211123C1Ev),
  NSPAIR(_ZN3aaa9GG1211123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1211123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211123E[];
extern void _ZN3aaa9GG12111233fooEv();
extern void _ZN3aaa9GG12111233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12111233barEv,_ZThn8_N3aaa9GG12111233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12111233fooEv,_ZThn20_N3aaa9GG12111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12111233barEv,_ZThn20_N3aaa9GG12111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12111233fooEv,_ZThn28_N3aaa9GG12111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12111233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12111233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12111233barEv,_ZThn8_N3aaa9GG12111233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111233fooEv,_ZThn20_N3aaa9GG12111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111233barEv,_ZThn20_N3aaa9GG12111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12111233fooEv,_ZThn28_N3aaa9GG12111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211123E[];
Class_Descriptor cd__ZN3aaa9GG1211123E = {  "_ZN3aaa9GG1211123E", // class name
  bases__ZN3aaa9GG1211123E, 6,
  &(vtc__ZN3aaa9GG1211123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211131  : ::aaa::EE121 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12111313fooEv
  ~GG1211131(); // tgen
  GG1211131(); // tgen
};
//SIG(1 _ZN3aaa9GG1211131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12111313fooEv");}
aaa::GG1211131 ::~GG1211131(){ note_dtor("_ZN3aaa9GG1211131E", this);} // tgen
aaa::GG1211131 ::GG1211131(){ note_ctor("_ZN3aaa9GG1211131E", this);} // tgen
}
static void Test__ZN3aaa9GG1211131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211131E, buf);
    ::aaa::GG1211131 *dp, &lv = *(dp=new (buf) ::aaa::GG1211131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211131E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1211131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1211131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1211131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211131E);
    dp->::aaa::GG1211131::~GG1211131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211131E(Test__ZN3aaa9GG1211131E, "_ZN3aaa9GG1211131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211131C1Ev();
extern void _ZN3aaa9GG1211131D1Ev();
Name_Map name_map__ZN3aaa9GG1211131E[] = {
  NSPAIR(_ZN3aaa9GG1211131C1Ev),
  NSPAIR(_ZN3aaa9GG1211131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1211131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211131E[];
extern void _ZN3aaa9GG12111313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12111313fooEv,_ZThn20_N3aaa9GG12111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12111313fooEv,_ZThn28_N3aaa9GG12111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12111313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111313fooEv,_ZThn20_N3aaa9GG12111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12111313fooEv,_ZThn28_N3aaa9GG12111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211131E[];
Class_Descriptor cd__ZN3aaa9GG1211131E = {  "_ZN3aaa9GG1211131E", // class name
  bases__ZN3aaa9GG1211131E, 6,
  &(vtc__ZN3aaa9GG1211131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211131E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211132  : ::aaa::EE121 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12111323barEv
  ~GG1211132(); // tgen
  GG1211132(); // tgen
};
//SIG(1 _ZN3aaa9GG1211132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12111323barEv");}
aaa::GG1211132 ::~GG1211132(){ note_dtor("_ZN3aaa9GG1211132E", this);} // tgen
aaa::GG1211132 ::GG1211132(){ note_ctor("_ZN3aaa9GG1211132E", this);} // tgen
}
static void Test__ZN3aaa9GG1211132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211132E, buf);
    ::aaa::GG1211132 *dp, &lv = *(dp=new (buf) ::aaa::GG1211132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211132E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1211132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1211132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1211132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211132E);
    dp->::aaa::GG1211132::~GG1211132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211132E(Test__ZN3aaa9GG1211132E, "_ZN3aaa9GG1211132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211132C1Ev();
extern void _ZN3aaa9GG1211132D1Ev();
Name_Map name_map__ZN3aaa9GG1211132E[] = {
  NSPAIR(_ZN3aaa9GG1211132C1Ev),
  NSPAIR(_ZN3aaa9GG1211132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1211132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211132E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12111323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12111323barEv,_ZThn8_N3aaa9GG12111323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12111323barEv,_ZThn20_N3aaa9GG12111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12111323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12111323barEv,_ZThn8_N3aaa9GG12111323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111323barEv,_ZThn20_N3aaa9GG12111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211132E[];
Class_Descriptor cd__ZN3aaa9GG1211132E = {  "_ZN3aaa9GG1211132E", // class name
  bases__ZN3aaa9GG1211132E, 6,
  &(vtc__ZN3aaa9GG1211132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211133  : ::aaa::EE121 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12111333fooEv
  virtual void  bar(); // _ZN3aaa9GG12111333barEv
  ~GG1211133(); // tgen
  GG1211133(); // tgen
};
//SIG(1 _ZN3aaa9GG1211133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12111333fooEv");}
void  aaa::GG1211133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12111333barEv");}
aaa::GG1211133 ::~GG1211133(){ note_dtor("_ZN3aaa9GG1211133E", this);} // tgen
aaa::GG1211133 ::GG1211133(){ note_ctor("_ZN3aaa9GG1211133E", this);} // tgen
}
static void Test__ZN3aaa9GG1211133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211133E, buf);
    ::aaa::GG1211133 *dp, &lv = *(dp=new (buf) ::aaa::GG1211133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211133E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1211133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1211133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1211133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211133E);
    dp->::aaa::GG1211133::~GG1211133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211133E(Test__ZN3aaa9GG1211133E, "_ZN3aaa9GG1211133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211133C1Ev();
extern void _ZN3aaa9GG1211133D1Ev();
Name_Map name_map__ZN3aaa9GG1211133E[] = {
  NSPAIR(_ZN3aaa9GG1211133C1Ev),
  NSPAIR(_ZN3aaa9GG1211133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1211133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211133E[];
extern void _ZN3aaa9GG12111333fooEv();
extern void _ZN3aaa9GG12111333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12111333barEv,_ZThn8_N3aaa9GG12111333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12111333fooEv,_ZThn20_N3aaa9GG12111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12111333barEv,_ZThn20_N3aaa9GG12111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12111333fooEv,_ZThn28_N3aaa9GG12111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12111333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12111333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12111333barEv,_ZThn8_N3aaa9GG12111333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111333fooEv,_ZThn20_N3aaa9GG12111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12111333barEv,_ZThn20_N3aaa9GG12111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12111333fooEv,_ZThn28_N3aaa9GG12111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211133E[];
Class_Descriptor cd__ZN3aaa9GG1211133E = {  "_ZN3aaa9GG1211133E", // class name
  bases__ZN3aaa9GG1211133E, 6,
  &(vtc__ZN3aaa9GG1211133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211211  : ::aaa::EE121 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12112113fooEv
  ~GG1211211(); // tgen
  GG1211211(); // tgen
};
//SIG(1 _ZN3aaa9GG1211211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12112113fooEv");}
aaa::GG1211211 ::~GG1211211(){ note_dtor("_ZN3aaa9GG1211211E", this);} // tgen
aaa::GG1211211 ::GG1211211(){ note_ctor("_ZN3aaa9GG1211211E", this);} // tgen
}
static void Test__ZN3aaa9GG1211211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211211E, buf);
    ::aaa::GG1211211 *dp, &lv = *(dp=new (buf) ::aaa::GG1211211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211211E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1211211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1211211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1211211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211211E);
    dp->::aaa::GG1211211::~GG1211211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211211E(Test__ZN3aaa9GG1211211E, "_ZN3aaa9GG1211211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211211C1Ev();
extern void _ZN3aaa9GG1211211D1Ev();
Name_Map name_map__ZN3aaa9GG1211211E[] = {
  NSPAIR(_ZN3aaa9GG1211211C1Ev),
  NSPAIR(_ZN3aaa9GG1211211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1211211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211211E[];
extern void _ZN3aaa9GG12112113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12112113fooEv,_ZThn20_N3aaa9GG12112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12112113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112113fooEv,_ZThn20_N3aaa9GG12112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211211E[];
Class_Descriptor cd__ZN3aaa9GG1211211E = {  "_ZN3aaa9GG1211211E", // class name
  bases__ZN3aaa9GG1211211E, 6,
  &(vtc__ZN3aaa9GG1211211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211211E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211212  : ::aaa::EE121 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12112123barEv
  ~GG1211212(); // tgen
  GG1211212(); // tgen
};
//SIG(1 _ZN3aaa9GG1211212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12112123barEv");}
aaa::GG1211212 ::~GG1211212(){ note_dtor("_ZN3aaa9GG1211212E", this);} // tgen
aaa::GG1211212 ::GG1211212(){ note_ctor("_ZN3aaa9GG1211212E", this);} // tgen
}
static void Test__ZN3aaa9GG1211212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211212E, buf);
    ::aaa::GG1211212 *dp, &lv = *(dp=new (buf) ::aaa::GG1211212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211212E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1211212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1211212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1211212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211212E);
    dp->::aaa::GG1211212::~GG1211212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211212E(Test__ZN3aaa9GG1211212E, "_ZN3aaa9GG1211212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211212C1Ev();
extern void _ZN3aaa9GG1211212D1Ev();
Name_Map name_map__ZN3aaa9GG1211212E[] = {
  NSPAIR(_ZN3aaa9GG1211212C1Ev),
  NSPAIR(_ZN3aaa9GG1211212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1211212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211212E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12112123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12112123barEv,_ZThn8_N3aaa9GG12112123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12112123barEv,_ZThn28_N3aaa9GG12112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12112123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12112123barEv,_ZThn8_N3aaa9GG12112123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12112123barEv,_ZThn28_N3aaa9GG12112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211212E[];
Class_Descriptor cd__ZN3aaa9GG1211212E = {  "_ZN3aaa9GG1211212E", // class name
  bases__ZN3aaa9GG1211212E, 6,
  &(vtc__ZN3aaa9GG1211212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211213  : ::aaa::EE121 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12112133fooEv
  virtual void  bar(); // _ZN3aaa9GG12112133barEv
  ~GG1211213(); // tgen
  GG1211213(); // tgen
};
//SIG(1 _ZN3aaa9GG1211213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12112133fooEv");}
void  aaa::GG1211213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12112133barEv");}
aaa::GG1211213 ::~GG1211213(){ note_dtor("_ZN3aaa9GG1211213E", this);} // tgen
aaa::GG1211213 ::GG1211213(){ note_ctor("_ZN3aaa9GG1211213E", this);} // tgen
}
static void Test__ZN3aaa9GG1211213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211213E, buf);
    ::aaa::GG1211213 *dp, &lv = *(dp=new (buf) ::aaa::GG1211213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211213E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1211213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1211213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1211213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211213E);
    dp->::aaa::GG1211213::~GG1211213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211213E(Test__ZN3aaa9GG1211213E, "_ZN3aaa9GG1211213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211213C1Ev();
extern void _ZN3aaa9GG1211213D1Ev();
Name_Map name_map__ZN3aaa9GG1211213E[] = {
  NSPAIR(_ZN3aaa9GG1211213C1Ev),
  NSPAIR(_ZN3aaa9GG1211213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1211213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211213E[];
extern void _ZN3aaa9GG12112133fooEv();
extern void _ZN3aaa9GG12112133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12112133barEv,_ZThn8_N3aaa9GG12112133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12112133fooEv,_ZThn20_N3aaa9GG12112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12112133barEv,_ZThn28_N3aaa9GG12112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12112133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12112133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12112133barEv,_ZThn8_N3aaa9GG12112133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112133fooEv,_ZThn20_N3aaa9GG12112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12112133barEv,_ZThn28_N3aaa9GG12112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211213E[];
Class_Descriptor cd__ZN3aaa9GG1211213E = {  "_ZN3aaa9GG1211213E", // class name
  bases__ZN3aaa9GG1211213E, 6,
  &(vtc__ZN3aaa9GG1211213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211221  : ::aaa::EE121 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12112213fooEv
  ~GG1211221(); // tgen
  GG1211221(); // tgen
};
//SIG(1 _ZN3aaa9GG1211221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12112213fooEv");}
aaa::GG1211221 ::~GG1211221(){ note_dtor("_ZN3aaa9GG1211221E", this);} // tgen
aaa::GG1211221 ::GG1211221(){ note_ctor("_ZN3aaa9GG1211221E", this);} // tgen
}
static void Test__ZN3aaa9GG1211221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211221E, buf);
    ::aaa::GG1211221 *dp, &lv = *(dp=new (buf) ::aaa::GG1211221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211221E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1211221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1211221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1211221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211221E);
    dp->::aaa::GG1211221::~GG1211221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211221E(Test__ZN3aaa9GG1211221E, "_ZN3aaa9GG1211221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211221C1Ev();
extern void _ZN3aaa9GG1211221D1Ev();
Name_Map name_map__ZN3aaa9GG1211221E[] = {
  NSPAIR(_ZN3aaa9GG1211221C1Ev),
  NSPAIR(_ZN3aaa9GG1211221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1211221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211221E[];
extern void _ZN3aaa9GG12112213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12112213fooEv,_ZThn20_N3aaa9GG12112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12112213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112213fooEv,_ZThn20_N3aaa9GG12112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211221E[];
Class_Descriptor cd__ZN3aaa9GG1211221E = {  "_ZN3aaa9GG1211221E", // class name
  bases__ZN3aaa9GG1211221E, 6,
  &(vtc__ZN3aaa9GG1211221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211222  : ::aaa::EE121 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12112223barEv
  ~GG1211222(); // tgen
  GG1211222(); // tgen
};
//SIG(1 _ZN3aaa9GG1211222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12112223barEv");}
aaa::GG1211222 ::~GG1211222(){ note_dtor("_ZN3aaa9GG1211222E", this);} // tgen
aaa::GG1211222 ::GG1211222(){ note_ctor("_ZN3aaa9GG1211222E", this);} // tgen
}
static void Test__ZN3aaa9GG1211222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211222E, buf);
    ::aaa::GG1211222 *dp, &lv = *(dp=new (buf) ::aaa::GG1211222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211222E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1211222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1211222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1211222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211222E);
    dp->::aaa::GG1211222::~GG1211222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211222E(Test__ZN3aaa9GG1211222E, "_ZN3aaa9GG1211222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211222C1Ev();
extern void _ZN3aaa9GG1211222D1Ev();
Name_Map name_map__ZN3aaa9GG1211222E[] = {
  NSPAIR(_ZN3aaa9GG1211222C1Ev),
  NSPAIR(_ZN3aaa9GG1211222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1211222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211222E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12112223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12112223barEv,_ZThn8_N3aaa9GG12112223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12112223barEv,_ZThn20_N3aaa9GG12112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12112223barEv,_ZThn28_N3aaa9GG12112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12112223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12112223barEv,_ZThn8_N3aaa9GG12112223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112223barEv,_ZThn20_N3aaa9GG12112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12112223barEv,_ZThn28_N3aaa9GG12112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211222E[];
Class_Descriptor cd__ZN3aaa9GG1211222E = {  "_ZN3aaa9GG1211222E", // class name
  bases__ZN3aaa9GG1211222E, 6,
  &(vtc__ZN3aaa9GG1211222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211223  : ::aaa::EE121 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12112233fooEv
  virtual void  bar(); // _ZN3aaa9GG12112233barEv
  ~GG1211223(); // tgen
  GG1211223(); // tgen
};
//SIG(1 _ZN3aaa9GG1211223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12112233fooEv");}
void  aaa::GG1211223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12112233barEv");}
aaa::GG1211223 ::~GG1211223(){ note_dtor("_ZN3aaa9GG1211223E", this);} // tgen
aaa::GG1211223 ::GG1211223(){ note_ctor("_ZN3aaa9GG1211223E", this);} // tgen
}
static void Test__ZN3aaa9GG1211223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211223E, buf);
    ::aaa::GG1211223 *dp, &lv = *(dp=new (buf) ::aaa::GG1211223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211223E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1211223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1211223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1211223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211223E);
    dp->::aaa::GG1211223::~GG1211223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211223E(Test__ZN3aaa9GG1211223E, "_ZN3aaa9GG1211223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211223C1Ev();
extern void _ZN3aaa9GG1211223D1Ev();
Name_Map name_map__ZN3aaa9GG1211223E[] = {
  NSPAIR(_ZN3aaa9GG1211223C1Ev),
  NSPAIR(_ZN3aaa9GG1211223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1211223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211223E[];
extern void _ZN3aaa9GG12112233fooEv();
extern void _ZN3aaa9GG12112233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12112233barEv,_ZThn8_N3aaa9GG12112233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12112233fooEv,_ZThn20_N3aaa9GG12112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12112233barEv,_ZThn20_N3aaa9GG12112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12112233barEv,_ZThn28_N3aaa9GG12112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12112233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12112233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12112233barEv,_ZThn8_N3aaa9GG12112233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112233fooEv,_ZThn20_N3aaa9GG12112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112233barEv,_ZThn20_N3aaa9GG12112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12112233barEv,_ZThn28_N3aaa9GG12112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211223E[];
Class_Descriptor cd__ZN3aaa9GG1211223E = {  "_ZN3aaa9GG1211223E", // class name
  bases__ZN3aaa9GG1211223E, 6,
  &(vtc__ZN3aaa9GG1211223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211231  : ::aaa::EE121 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12112313fooEv
  ~GG1211231(); // tgen
  GG1211231(); // tgen
};
//SIG(1 _ZN3aaa9GG1211231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12112313fooEv");}
aaa::GG1211231 ::~GG1211231(){ note_dtor("_ZN3aaa9GG1211231E", this);} // tgen
aaa::GG1211231 ::GG1211231(){ note_ctor("_ZN3aaa9GG1211231E", this);} // tgen
}
static void Test__ZN3aaa9GG1211231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211231E, buf);
    ::aaa::GG1211231 *dp, &lv = *(dp=new (buf) ::aaa::GG1211231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211231E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1211231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1211231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1211231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211231E);
    dp->::aaa::GG1211231::~GG1211231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211231E(Test__ZN3aaa9GG1211231E, "_ZN3aaa9GG1211231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211231C1Ev();
extern void _ZN3aaa9GG1211231D1Ev();
Name_Map name_map__ZN3aaa9GG1211231E[] = {
  NSPAIR(_ZN3aaa9GG1211231C1Ev),
  NSPAIR(_ZN3aaa9GG1211231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1211231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211231E[];
extern void _ZN3aaa9GG12112313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12112313fooEv,_ZThn20_N3aaa9GG12112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12112313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112313fooEv,_ZThn20_N3aaa9GG12112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211231E[];
Class_Descriptor cd__ZN3aaa9GG1211231E = {  "_ZN3aaa9GG1211231E", // class name
  bases__ZN3aaa9GG1211231E, 6,
  &(vtc__ZN3aaa9GG1211231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211231E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211232  : ::aaa::EE121 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12112323barEv
  ~GG1211232(); // tgen
  GG1211232(); // tgen
};
//SIG(1 _ZN3aaa9GG1211232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12112323barEv");}
aaa::GG1211232 ::~GG1211232(){ note_dtor("_ZN3aaa9GG1211232E", this);} // tgen
aaa::GG1211232 ::GG1211232(){ note_ctor("_ZN3aaa9GG1211232E", this);} // tgen
}
static void Test__ZN3aaa9GG1211232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211232E, buf);
    ::aaa::GG1211232 *dp, &lv = *(dp=new (buf) ::aaa::GG1211232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211232E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1211232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1211232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1211232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211232E);
    dp->::aaa::GG1211232::~GG1211232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211232E(Test__ZN3aaa9GG1211232E, "_ZN3aaa9GG1211232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211232C1Ev();
extern void _ZN3aaa9GG1211232D1Ev();
Name_Map name_map__ZN3aaa9GG1211232E[] = {
  NSPAIR(_ZN3aaa9GG1211232C1Ev),
  NSPAIR(_ZN3aaa9GG1211232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1211232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211232E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12112323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12112323barEv,_ZThn8_N3aaa9GG12112323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12112323barEv,_ZThn20_N3aaa9GG12112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12112323barEv,_ZThn28_N3aaa9GG12112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12112323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12112323barEv,_ZThn8_N3aaa9GG12112323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112323barEv,_ZThn20_N3aaa9GG12112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12112323barEv,_ZThn28_N3aaa9GG12112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211232E[];
Class_Descriptor cd__ZN3aaa9GG1211232E = {  "_ZN3aaa9GG1211232E", // class name
  bases__ZN3aaa9GG1211232E, 6,
  &(vtc__ZN3aaa9GG1211232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211233  : ::aaa::EE121 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12112333fooEv
  virtual void  bar(); // _ZN3aaa9GG12112333barEv
  ~GG1211233(); // tgen
  GG1211233(); // tgen
};
//SIG(1 _ZN3aaa9GG1211233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12112333fooEv");}
void  aaa::GG1211233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12112333barEv");}
aaa::GG1211233 ::~GG1211233(){ note_dtor("_ZN3aaa9GG1211233E", this);} // tgen
aaa::GG1211233 ::GG1211233(){ note_ctor("_ZN3aaa9GG1211233E", this);} // tgen
}
static void Test__ZN3aaa9GG1211233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211233E, buf);
    ::aaa::GG1211233 *dp, &lv = *(dp=new (buf) ::aaa::GG1211233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211233E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1211233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1211233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1211233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211233E);
    dp->::aaa::GG1211233::~GG1211233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211233E(Test__ZN3aaa9GG1211233E, "_ZN3aaa9GG1211233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211233C1Ev();
extern void _ZN3aaa9GG1211233D1Ev();
Name_Map name_map__ZN3aaa9GG1211233E[] = {
  NSPAIR(_ZN3aaa9GG1211233C1Ev),
  NSPAIR(_ZN3aaa9GG1211233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1211233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211233E[];
extern void _ZN3aaa9GG12112333fooEv();
extern void _ZN3aaa9GG12112333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12112333barEv,_ZThn8_N3aaa9GG12112333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12112333fooEv,_ZThn20_N3aaa9GG12112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12112333barEv,_ZThn20_N3aaa9GG12112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12112333barEv,_ZThn28_N3aaa9GG12112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12112333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12112333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12112333barEv,_ZThn8_N3aaa9GG12112333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112333fooEv,_ZThn20_N3aaa9GG12112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12112333barEv,_ZThn20_N3aaa9GG12112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12112333barEv,_ZThn28_N3aaa9GG12112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211233E[];
Class_Descriptor cd__ZN3aaa9GG1211233E = {  "_ZN3aaa9GG1211233E", // class name
  bases__ZN3aaa9GG1211233E, 6,
  &(vtc__ZN3aaa9GG1211233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211311  : ::aaa::EE121 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12113113fooEv
  ~GG1211311(); // tgen
  GG1211311(); // tgen
};
//SIG(1 _ZN3aaa9GG1211311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12113113fooEv");}
aaa::GG1211311 ::~GG1211311(){ note_dtor("_ZN3aaa9GG1211311E", this);} // tgen
aaa::GG1211311 ::GG1211311(){ note_ctor("_ZN3aaa9GG1211311E", this);} // tgen
}
static void Test__ZN3aaa9GG1211311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211311E, buf);
    ::aaa::GG1211311 *dp, &lv = *(dp=new (buf) ::aaa::GG1211311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211311E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1211311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1211311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1211311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211311E);
    dp->::aaa::GG1211311::~GG1211311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211311E(Test__ZN3aaa9GG1211311E, "_ZN3aaa9GG1211311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211311C1Ev();
extern void _ZN3aaa9GG1211311D1Ev();
Name_Map name_map__ZN3aaa9GG1211311E[] = {
  NSPAIR(_ZN3aaa9GG1211311C1Ev),
  NSPAIR(_ZN3aaa9GG1211311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1211311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211311E[];
extern void _ZN3aaa9GG12113113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12113113fooEv,_ZThn20_N3aaa9GG12113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113113fooEv,_ZThn28_N3aaa9GG12113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12113113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113113fooEv,_ZThn20_N3aaa9GG12113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113113fooEv,_ZThn28_N3aaa9GG12113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211311E[];
Class_Descriptor cd__ZN3aaa9GG1211311E = {  "_ZN3aaa9GG1211311E", // class name
  bases__ZN3aaa9GG1211311E, 6,
  &(vtc__ZN3aaa9GG1211311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211311E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211312  : ::aaa::EE121 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12113123barEv
  ~GG1211312(); // tgen
  GG1211312(); // tgen
};
//SIG(1 _ZN3aaa9GG1211312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12113123barEv");}
aaa::GG1211312 ::~GG1211312(){ note_dtor("_ZN3aaa9GG1211312E", this);} // tgen
aaa::GG1211312 ::GG1211312(){ note_ctor("_ZN3aaa9GG1211312E", this);} // tgen
}
static void Test__ZN3aaa9GG1211312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211312E, buf);
    ::aaa::GG1211312 *dp, &lv = *(dp=new (buf) ::aaa::GG1211312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211312E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1211312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1211312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1211312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211312E);
    dp->::aaa::GG1211312::~GG1211312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211312E(Test__ZN3aaa9GG1211312E, "_ZN3aaa9GG1211312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211312C1Ev();
extern void _ZN3aaa9GG1211312D1Ev();
Name_Map name_map__ZN3aaa9GG1211312E[] = {
  NSPAIR(_ZN3aaa9GG1211312C1Ev),
  NSPAIR(_ZN3aaa9GG1211312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1211312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211312E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12113123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12113123barEv,_ZThn8_N3aaa9GG12113123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113123barEv,_ZThn28_N3aaa9GG12113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12113123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12113123barEv,_ZThn8_N3aaa9GG12113123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113123barEv,_ZThn28_N3aaa9GG12113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211312E[];
Class_Descriptor cd__ZN3aaa9GG1211312E = {  "_ZN3aaa9GG1211312E", // class name
  bases__ZN3aaa9GG1211312E, 6,
  &(vtc__ZN3aaa9GG1211312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211313  : ::aaa::EE121 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12113133fooEv
  virtual void  bar(); // _ZN3aaa9GG12113133barEv
  ~GG1211313(); // tgen
  GG1211313(); // tgen
};
//SIG(1 _ZN3aaa9GG1211313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12113133fooEv");}
void  aaa::GG1211313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12113133barEv");}
aaa::GG1211313 ::~GG1211313(){ note_dtor("_ZN3aaa9GG1211313E", this);} // tgen
aaa::GG1211313 ::GG1211313(){ note_ctor("_ZN3aaa9GG1211313E", this);} // tgen
}
static void Test__ZN3aaa9GG1211313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211313E, buf);
    ::aaa::GG1211313 *dp, &lv = *(dp=new (buf) ::aaa::GG1211313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211313E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1211313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1211313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1211313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211313E);
    dp->::aaa::GG1211313::~GG1211313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211313E(Test__ZN3aaa9GG1211313E, "_ZN3aaa9GG1211313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211313C1Ev();
extern void _ZN3aaa9GG1211313D1Ev();
Name_Map name_map__ZN3aaa9GG1211313E[] = {
  NSPAIR(_ZN3aaa9GG1211313C1Ev),
  NSPAIR(_ZN3aaa9GG1211313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1211313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211313E[];
extern void _ZN3aaa9GG12113133fooEv();
extern void _ZN3aaa9GG12113133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12113133barEv,_ZThn8_N3aaa9GG12113133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12113133fooEv,_ZThn20_N3aaa9GG12113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113133fooEv,_ZThn28_N3aaa9GG12113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113133barEv,_ZThn28_N3aaa9GG12113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12113133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12113133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12113133barEv,_ZThn8_N3aaa9GG12113133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113133fooEv,_ZThn20_N3aaa9GG12113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113133fooEv,_ZThn28_N3aaa9GG12113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113133barEv,_ZThn28_N3aaa9GG12113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211313E[];
Class_Descriptor cd__ZN3aaa9GG1211313E = {  "_ZN3aaa9GG1211313E", // class name
  bases__ZN3aaa9GG1211313E, 6,
  &(vtc__ZN3aaa9GG1211313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211321  : ::aaa::EE121 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12113213fooEv
  ~GG1211321(); // tgen
  GG1211321(); // tgen
};
//SIG(1 _ZN3aaa9GG1211321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12113213fooEv");}
aaa::GG1211321 ::~GG1211321(){ note_dtor("_ZN3aaa9GG1211321E", this);} // tgen
aaa::GG1211321 ::GG1211321(){ note_ctor("_ZN3aaa9GG1211321E", this);} // tgen
}
static void Test__ZN3aaa9GG1211321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211321E, buf);
    ::aaa::GG1211321 *dp, &lv = *(dp=new (buf) ::aaa::GG1211321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211321E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1211321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1211321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1211321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211321E);
    dp->::aaa::GG1211321::~GG1211321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211321E(Test__ZN3aaa9GG1211321E, "_ZN3aaa9GG1211321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211321C1Ev();
extern void _ZN3aaa9GG1211321D1Ev();
Name_Map name_map__ZN3aaa9GG1211321E[] = {
  NSPAIR(_ZN3aaa9GG1211321C1Ev),
  NSPAIR(_ZN3aaa9GG1211321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1211321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211321E[];
extern void _ZN3aaa9GG12113213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12113213fooEv,_ZThn20_N3aaa9GG12113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12113213fooEv,_ZThn28_N3aaa9GG12113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12113213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113213fooEv,_ZThn20_N3aaa9GG12113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113213fooEv,_ZThn28_N3aaa9GG12113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211321E[];
Class_Descriptor cd__ZN3aaa9GG1211321E = {  "_ZN3aaa9GG1211321E", // class name
  bases__ZN3aaa9GG1211321E, 6,
  &(vtc__ZN3aaa9GG1211321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211322  : ::aaa::EE121 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12113223barEv
  ~GG1211322(); // tgen
  GG1211322(); // tgen
};
//SIG(1 _ZN3aaa9GG1211322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12113223barEv");}
aaa::GG1211322 ::~GG1211322(){ note_dtor("_ZN3aaa9GG1211322E", this);} // tgen
aaa::GG1211322 ::GG1211322(){ note_ctor("_ZN3aaa9GG1211322E", this);} // tgen
}
static void Test__ZN3aaa9GG1211322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211322E, buf);
    ::aaa::GG1211322 *dp, &lv = *(dp=new (buf) ::aaa::GG1211322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211322E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1211322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1211322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1211322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211322E);
    dp->::aaa::GG1211322::~GG1211322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211322E(Test__ZN3aaa9GG1211322E, "_ZN3aaa9GG1211322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211322C1Ev();
extern void _ZN3aaa9GG1211322D1Ev();
Name_Map name_map__ZN3aaa9GG1211322E[] = {
  NSPAIR(_ZN3aaa9GG1211322C1Ev),
  NSPAIR(_ZN3aaa9GG1211322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1211322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211322E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12113223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12113223barEv,_ZThn8_N3aaa9GG12113223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12113223barEv,_ZThn20_N3aaa9GG12113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12113223barEv,_ZThn28_N3aaa9GG12113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12113223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12113223barEv,_ZThn8_N3aaa9GG12113223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113223barEv,_ZThn20_N3aaa9GG12113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113223barEv,_ZThn28_N3aaa9GG12113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211322E[];
Class_Descriptor cd__ZN3aaa9GG1211322E = {  "_ZN3aaa9GG1211322E", // class name
  bases__ZN3aaa9GG1211322E, 6,
  &(vtc__ZN3aaa9GG1211322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211323  : ::aaa::EE121 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12113233fooEv
  virtual void  bar(); // _ZN3aaa9GG12113233barEv
  ~GG1211323(); // tgen
  GG1211323(); // tgen
};
//SIG(1 _ZN3aaa9GG1211323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12113233fooEv");}
void  aaa::GG1211323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12113233barEv");}
aaa::GG1211323 ::~GG1211323(){ note_dtor("_ZN3aaa9GG1211323E", this);} // tgen
aaa::GG1211323 ::GG1211323(){ note_ctor("_ZN3aaa9GG1211323E", this);} // tgen
}
static void Test__ZN3aaa9GG1211323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211323E, buf);
    ::aaa::GG1211323 *dp, &lv = *(dp=new (buf) ::aaa::GG1211323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211323E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1211323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1211323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1211323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211323E);
    dp->::aaa::GG1211323::~GG1211323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211323E(Test__ZN3aaa9GG1211323E, "_ZN3aaa9GG1211323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211323C1Ev();
extern void _ZN3aaa9GG1211323D1Ev();
Name_Map name_map__ZN3aaa9GG1211323E[] = {
  NSPAIR(_ZN3aaa9GG1211323C1Ev),
  NSPAIR(_ZN3aaa9GG1211323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1211323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211323E[];
extern void _ZN3aaa9GG12113233fooEv();
extern void _ZN3aaa9GG12113233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12113233barEv,_ZThn8_N3aaa9GG12113233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12113233fooEv,_ZThn20_N3aaa9GG12113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12113233barEv,_ZThn20_N3aaa9GG12113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113233fooEv,_ZThn28_N3aaa9GG12113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113233barEv,_ZThn28_N3aaa9GG12113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12113233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12113233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12113233barEv,_ZThn8_N3aaa9GG12113233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113233fooEv,_ZThn20_N3aaa9GG12113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113233barEv,_ZThn20_N3aaa9GG12113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113233fooEv,_ZThn28_N3aaa9GG12113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113233barEv,_ZThn28_N3aaa9GG12113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211323E[];
Class_Descriptor cd__ZN3aaa9GG1211323E = {  "_ZN3aaa9GG1211323E", // class name
  bases__ZN3aaa9GG1211323E, 6,
  &(vtc__ZN3aaa9GG1211323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211331  : ::aaa::EE121 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12113313fooEv
  ~GG1211331(); // tgen
  GG1211331(); // tgen
};
//SIG(1 _ZN3aaa9GG1211331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12113313fooEv");}
aaa::GG1211331 ::~GG1211331(){ note_dtor("_ZN3aaa9GG1211331E", this);} // tgen
aaa::GG1211331 ::GG1211331(){ note_ctor("_ZN3aaa9GG1211331E", this);} // tgen
}
static void Test__ZN3aaa9GG1211331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211331E, buf);
    ::aaa::GG1211331 *dp, &lv = *(dp=new (buf) ::aaa::GG1211331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211331E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1211331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1211331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1211331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211331E);
    dp->::aaa::GG1211331::~GG1211331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211331E(Test__ZN3aaa9GG1211331E, "_ZN3aaa9GG1211331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211331C1Ev();
extern void _ZN3aaa9GG1211331D1Ev();
Name_Map name_map__ZN3aaa9GG1211331E[] = {
  NSPAIR(_ZN3aaa9GG1211331C1Ev),
  NSPAIR(_ZN3aaa9GG1211331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1211331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211331E[];
extern void _ZN3aaa9GG12113313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12113313fooEv,_ZThn20_N3aaa9GG12113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12113313fooEv,_ZThn28_N3aaa9GG12113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12113313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113313fooEv,_ZThn20_N3aaa9GG12113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113313fooEv,_ZThn28_N3aaa9GG12113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211331E[];
Class_Descriptor cd__ZN3aaa9GG1211331E = {  "_ZN3aaa9GG1211331E", // class name
  bases__ZN3aaa9GG1211331E, 6,
  &(vtc__ZN3aaa9GG1211331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211331E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211332  : ::aaa::EE121 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12113323barEv
  ~GG1211332(); // tgen
  GG1211332(); // tgen
};
//SIG(1 _ZN3aaa9GG1211332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1211332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12113323barEv");}
aaa::GG1211332 ::~GG1211332(){ note_dtor("_ZN3aaa9GG1211332E", this);} // tgen
aaa::GG1211332 ::GG1211332(){ note_ctor("_ZN3aaa9GG1211332E", this);} // tgen
}
static void Test__ZN3aaa9GG1211332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211332E, buf);
    ::aaa::GG1211332 *dp, &lv = *(dp=new (buf) ::aaa::GG1211332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211332E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1211332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1211332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1211332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211332E);
    dp->::aaa::GG1211332::~GG1211332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211332E(Test__ZN3aaa9GG1211332E, "_ZN3aaa9GG1211332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211332C1Ev();
extern void _ZN3aaa9GG1211332D1Ev();
Name_Map name_map__ZN3aaa9GG1211332E[] = {
  NSPAIR(_ZN3aaa9GG1211332C1Ev),
  NSPAIR(_ZN3aaa9GG1211332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1211332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211332E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12113323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12113323barEv,_ZThn8_N3aaa9GG12113323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12113323barEv,_ZThn20_N3aaa9GG12113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113323barEv,_ZThn28_N3aaa9GG12113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12113323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12113323barEv,_ZThn8_N3aaa9GG12113323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113323barEv,_ZThn20_N3aaa9GG12113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113323barEv,_ZThn28_N3aaa9GG12113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211332E[];
Class_Descriptor cd__ZN3aaa9GG1211332E = {  "_ZN3aaa9GG1211332E", // class name
  bases__ZN3aaa9GG1211332E, 6,
  &(vtc__ZN3aaa9GG1211332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1211333  : ::aaa::EE121 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12113333fooEv
  virtual void  bar(); // _ZN3aaa9GG12113333barEv
  ~GG1211333(); // tgen
  GG1211333(); // tgen
};
//SIG(1 _ZN3aaa9GG1211333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1211333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12113333fooEv");}
void  aaa::GG1211333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12113333barEv");}
aaa::GG1211333 ::~GG1211333(){ note_dtor("_ZN3aaa9GG1211333E", this);} // tgen
aaa::GG1211333 ::GG1211333(){ note_ctor("_ZN3aaa9GG1211333E", this);} // tgen
}
static void Test__ZN3aaa9GG1211333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1211333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1211333E, buf);
    ::aaa::GG1211333 *dp, &lv = *(dp=new (buf) ::aaa::GG1211333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1211333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1211333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1211333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1211333E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1211333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1211333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1211333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1211333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1211333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1211333E);
    dp->::aaa::GG1211333::~GG1211333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1211333E(Test__ZN3aaa9GG1211333E, "_ZN3aaa9GG1211333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1211333C1Ev();
extern void _ZN3aaa9GG1211333D1Ev();
Name_Map name_map__ZN3aaa9GG1211333E[] = {
  NSPAIR(_ZN3aaa9GG1211333C1Ev),
  NSPAIR(_ZN3aaa9GG1211333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1211333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1211333E[];
extern void _ZN3aaa9GG12113333fooEv();
extern void _ZN3aaa9GG12113333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12113333barEv,_ZThn8_N3aaa9GG12113333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12113333fooEv,_ZThn20_N3aaa9GG12113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12113333barEv,_ZThn20_N3aaa9GG12113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113333fooEv,_ZThn28_N3aaa9GG12113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12113333barEv,_ZThn28_N3aaa9GG12113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1211333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12113333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12113333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12113333barEv,_ZThn8_N3aaa9GG12113333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113333fooEv,_ZThn20_N3aaa9GG12113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12113333barEv,_ZThn20_N3aaa9GG12113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113333fooEv,_ZThn28_N3aaa9GG12113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12113333barEv,_ZThn28_N3aaa9GG12113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1211333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1211333E[];
Class_Descriptor cd__ZN3aaa9GG1211333E = {  "_ZN3aaa9GG1211333E", // class name
  bases__ZN3aaa9GG1211333E, 6,
  &(vtc__ZN3aaa9GG1211333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1211333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1211333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212111  : ::aaa::EE121 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12121113fooEv
  ~GG1212111(); // tgen
  GG1212111(); // tgen
};
//SIG(1 _ZN3aaa9GG1212111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12121113fooEv");}
aaa::GG1212111 ::~GG1212111(){ note_dtor("_ZN3aaa9GG1212111E", this);} // tgen
aaa::GG1212111 ::GG1212111(){ note_ctor("_ZN3aaa9GG1212111E", this);} // tgen
}
static void Test__ZN3aaa9GG1212111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212111E, buf);
    ::aaa::GG1212111 *dp, &lv = *(dp=new (buf) ::aaa::GG1212111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212111E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1212111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1212111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1212111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212111E);
    dp->::aaa::GG1212111::~GG1212111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212111E(Test__ZN3aaa9GG1212111E, "_ZN3aaa9GG1212111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212111C1Ev();
extern void _ZN3aaa9GG1212111D1Ev();
Name_Map name_map__ZN3aaa9GG1212111E[] = {
  NSPAIR(_ZN3aaa9GG1212111C1Ev),
  NSPAIR(_ZN3aaa9GG1212111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1212111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212111E[];
extern void _ZN3aaa9GG12121113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12121113fooEv,_ZThn20_N3aaa9GG12121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12121113fooEv,_ZThn28_N3aaa9GG12121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12121113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121113fooEv,_ZThn20_N3aaa9GG12121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12121113fooEv,_ZThn28_N3aaa9GG12121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212111E[];
Class_Descriptor cd__ZN3aaa9GG1212111E = {  "_ZN3aaa9GG1212111E", // class name
  bases__ZN3aaa9GG1212111E, 6,
  &(vtc__ZN3aaa9GG1212111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212112  : ::aaa::EE121 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12121123barEv
  ~GG1212112(); // tgen
  GG1212112(); // tgen
};
//SIG(1 _ZN3aaa9GG1212112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12121123barEv");}
aaa::GG1212112 ::~GG1212112(){ note_dtor("_ZN3aaa9GG1212112E", this);} // tgen
aaa::GG1212112 ::GG1212112(){ note_ctor("_ZN3aaa9GG1212112E", this);} // tgen
}
static void Test__ZN3aaa9GG1212112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212112E, buf);
    ::aaa::GG1212112 *dp, &lv = *(dp=new (buf) ::aaa::GG1212112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212112E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1212112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1212112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1212112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212112E);
    dp->::aaa::GG1212112::~GG1212112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212112E(Test__ZN3aaa9GG1212112E, "_ZN3aaa9GG1212112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212112C1Ev();
extern void _ZN3aaa9GG1212112D1Ev();
Name_Map name_map__ZN3aaa9GG1212112E[] = {
  NSPAIR(_ZN3aaa9GG1212112C1Ev),
  NSPAIR(_ZN3aaa9GG1212112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1212112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212112E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12121123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12121123barEv,_ZThn8_N3aaa9GG12121123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12121123barEv,_ZThn20_N3aaa9GG12121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12121123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12121123barEv,_ZThn8_N3aaa9GG12121123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121123barEv,_ZThn20_N3aaa9GG12121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212112E[];
Class_Descriptor cd__ZN3aaa9GG1212112E = {  "_ZN3aaa9GG1212112E", // class name
  bases__ZN3aaa9GG1212112E, 6,
  &(vtc__ZN3aaa9GG1212112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212113  : ::aaa::EE121 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12121133fooEv
  virtual void  bar(); // _ZN3aaa9GG12121133barEv
  ~GG1212113(); // tgen
  GG1212113(); // tgen
};
//SIG(1 _ZN3aaa9GG1212113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12121133fooEv");}
void  aaa::GG1212113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12121133barEv");}
aaa::GG1212113 ::~GG1212113(){ note_dtor("_ZN3aaa9GG1212113E", this);} // tgen
aaa::GG1212113 ::GG1212113(){ note_ctor("_ZN3aaa9GG1212113E", this);} // tgen
}
static void Test__ZN3aaa9GG1212113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212113E, buf);
    ::aaa::GG1212113 *dp, &lv = *(dp=new (buf) ::aaa::GG1212113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212113E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1212113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1212113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1212113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212113E);
    dp->::aaa::GG1212113::~GG1212113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212113E(Test__ZN3aaa9GG1212113E, "_ZN3aaa9GG1212113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212113C1Ev();
extern void _ZN3aaa9GG1212113D1Ev();
Name_Map name_map__ZN3aaa9GG1212113E[] = {
  NSPAIR(_ZN3aaa9GG1212113C1Ev),
  NSPAIR(_ZN3aaa9GG1212113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1212113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212113E[];
extern void _ZN3aaa9GG12121133fooEv();
extern void _ZN3aaa9GG12121133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12121133barEv,_ZThn8_N3aaa9GG12121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12121133barEv,_ZThn20_N3aaa9GG12121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12121133fooEv,_ZThn20_N3aaa9GG12121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12121133fooEv,_ZThn28_N3aaa9GG12121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12121133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12121133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12121133barEv,_ZThn8_N3aaa9GG12121133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121133barEv,_ZThn20_N3aaa9GG12121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121133fooEv,_ZThn20_N3aaa9GG12121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12121133fooEv,_ZThn28_N3aaa9GG12121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212113E[];
Class_Descriptor cd__ZN3aaa9GG1212113E = {  "_ZN3aaa9GG1212113E", // class name
  bases__ZN3aaa9GG1212113E, 6,
  &(vtc__ZN3aaa9GG1212113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212121  : ::aaa::EE121 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12121213fooEv
  ~GG1212121(); // tgen
  GG1212121(); // tgen
};
//SIG(1 _ZN3aaa9GG1212121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12121213fooEv");}
aaa::GG1212121 ::~GG1212121(){ note_dtor("_ZN3aaa9GG1212121E", this);} // tgen
aaa::GG1212121 ::GG1212121(){ note_ctor("_ZN3aaa9GG1212121E", this);} // tgen
}
static void Test__ZN3aaa9GG1212121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212121E, buf);
    ::aaa::GG1212121 *dp, &lv = *(dp=new (buf) ::aaa::GG1212121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212121E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1212121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1212121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1212121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212121E);
    dp->::aaa::GG1212121::~GG1212121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212121E(Test__ZN3aaa9GG1212121E, "_ZN3aaa9GG1212121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212121C1Ev();
extern void _ZN3aaa9GG1212121D1Ev();
Name_Map name_map__ZN3aaa9GG1212121E[] = {
  NSPAIR(_ZN3aaa9GG1212121C1Ev),
  NSPAIR(_ZN3aaa9GG1212121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1212121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212121E[];
extern void _ZN3aaa9GG12121213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12121213fooEv,_ZThn28_N3aaa9GG12121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12121213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12121213fooEv,_ZThn28_N3aaa9GG12121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212121E[];
Class_Descriptor cd__ZN3aaa9GG1212121E = {  "_ZN3aaa9GG1212121E", // class name
  bases__ZN3aaa9GG1212121E, 6,
  &(vtc__ZN3aaa9GG1212121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212121E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212122  : ::aaa::EE121 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12121223barEv
  ~GG1212122(); // tgen
  GG1212122(); // tgen
};
//SIG(1 _ZN3aaa9GG1212122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12121223barEv");}
aaa::GG1212122 ::~GG1212122(){ note_dtor("_ZN3aaa9GG1212122E", this);} // tgen
aaa::GG1212122 ::GG1212122(){ note_ctor("_ZN3aaa9GG1212122E", this);} // tgen
}
static void Test__ZN3aaa9GG1212122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212122E, buf);
    ::aaa::GG1212122 *dp, &lv = *(dp=new (buf) ::aaa::GG1212122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212122E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1212122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1212122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1212122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212122E);
    dp->::aaa::GG1212122::~GG1212122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212122E(Test__ZN3aaa9GG1212122E, "_ZN3aaa9GG1212122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212122C1Ev();
extern void _ZN3aaa9GG1212122D1Ev();
Name_Map name_map__ZN3aaa9GG1212122E[] = {
  NSPAIR(_ZN3aaa9GG1212122C1Ev),
  NSPAIR(_ZN3aaa9GG1212122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1212122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212122E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12121223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12121223barEv,_ZThn8_N3aaa9GG12121223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12121223barEv,_ZThn20_N3aaa9GG12121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12121223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12121223barEv,_ZThn8_N3aaa9GG12121223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121223barEv,_ZThn20_N3aaa9GG12121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212122E[];
Class_Descriptor cd__ZN3aaa9GG1212122E = {  "_ZN3aaa9GG1212122E", // class name
  bases__ZN3aaa9GG1212122E, 6,
  &(vtc__ZN3aaa9GG1212122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212123  : ::aaa::EE121 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12121233fooEv
  virtual void  bar(); // _ZN3aaa9GG12121233barEv
  ~GG1212123(); // tgen
  GG1212123(); // tgen
};
//SIG(1 _ZN3aaa9GG1212123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12121233fooEv");}
void  aaa::GG1212123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12121233barEv");}
aaa::GG1212123 ::~GG1212123(){ note_dtor("_ZN3aaa9GG1212123E", this);} // tgen
aaa::GG1212123 ::GG1212123(){ note_ctor("_ZN3aaa9GG1212123E", this);} // tgen
}
static void Test__ZN3aaa9GG1212123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212123E, buf);
    ::aaa::GG1212123 *dp, &lv = *(dp=new (buf) ::aaa::GG1212123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212123E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1212123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1212123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1212123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212123E);
    dp->::aaa::GG1212123::~GG1212123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212123E(Test__ZN3aaa9GG1212123E, "_ZN3aaa9GG1212123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212123C1Ev();
extern void _ZN3aaa9GG1212123D1Ev();
Name_Map name_map__ZN3aaa9GG1212123E[] = {
  NSPAIR(_ZN3aaa9GG1212123C1Ev),
  NSPAIR(_ZN3aaa9GG1212123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1212123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212123E[];
extern void _ZN3aaa9GG12121233fooEv();
extern void _ZN3aaa9GG12121233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12121233barEv,_ZThn8_N3aaa9GG12121233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12121233barEv,_ZThn20_N3aaa9GG12121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12121233fooEv,_ZThn28_N3aaa9GG12121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12121233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12121233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12121233barEv,_ZThn8_N3aaa9GG12121233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121233barEv,_ZThn20_N3aaa9GG12121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12121233fooEv,_ZThn28_N3aaa9GG12121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212123E[];
Class_Descriptor cd__ZN3aaa9GG1212123E = {  "_ZN3aaa9GG1212123E", // class name
  bases__ZN3aaa9GG1212123E, 6,
  &(vtc__ZN3aaa9GG1212123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212131  : ::aaa::EE121 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12121313fooEv
  ~GG1212131(); // tgen
  GG1212131(); // tgen
};
//SIG(1 _ZN3aaa9GG1212131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12121313fooEv");}
aaa::GG1212131 ::~GG1212131(){ note_dtor("_ZN3aaa9GG1212131E", this);} // tgen
aaa::GG1212131 ::GG1212131(){ note_ctor("_ZN3aaa9GG1212131E", this);} // tgen
}
static void Test__ZN3aaa9GG1212131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212131E, buf);
    ::aaa::GG1212131 *dp, &lv = *(dp=new (buf) ::aaa::GG1212131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212131E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1212131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1212131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1212131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212131E);
    dp->::aaa::GG1212131::~GG1212131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212131E(Test__ZN3aaa9GG1212131E, "_ZN3aaa9GG1212131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212131C1Ev();
extern void _ZN3aaa9GG1212131D1Ev();
Name_Map name_map__ZN3aaa9GG1212131E[] = {
  NSPAIR(_ZN3aaa9GG1212131C1Ev),
  NSPAIR(_ZN3aaa9GG1212131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1212131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212131E[];
extern void _ZN3aaa9GG12121313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12121313fooEv,_ZThn20_N3aaa9GG12121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12121313fooEv,_ZThn28_N3aaa9GG12121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12121313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121313fooEv,_ZThn20_N3aaa9GG12121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12121313fooEv,_ZThn28_N3aaa9GG12121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212131E[];
Class_Descriptor cd__ZN3aaa9GG1212131E = {  "_ZN3aaa9GG1212131E", // class name
  bases__ZN3aaa9GG1212131E, 6,
  &(vtc__ZN3aaa9GG1212131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212131E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212132  : ::aaa::EE121 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12121323barEv
  ~GG1212132(); // tgen
  GG1212132(); // tgen
};
//SIG(1 _ZN3aaa9GG1212132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12121323barEv");}
aaa::GG1212132 ::~GG1212132(){ note_dtor("_ZN3aaa9GG1212132E", this);} // tgen
aaa::GG1212132 ::GG1212132(){ note_ctor("_ZN3aaa9GG1212132E", this);} // tgen
}
static void Test__ZN3aaa9GG1212132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212132E, buf);
    ::aaa::GG1212132 *dp, &lv = *(dp=new (buf) ::aaa::GG1212132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212132E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1212132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1212132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1212132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212132E);
    dp->::aaa::GG1212132::~GG1212132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212132E(Test__ZN3aaa9GG1212132E, "_ZN3aaa9GG1212132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212132C1Ev();
extern void _ZN3aaa9GG1212132D1Ev();
Name_Map name_map__ZN3aaa9GG1212132E[] = {
  NSPAIR(_ZN3aaa9GG1212132C1Ev),
  NSPAIR(_ZN3aaa9GG1212132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1212132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212132E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12121323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12121323barEv,_ZThn8_N3aaa9GG12121323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12121323barEv,_ZThn20_N3aaa9GG12121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12121323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12121323barEv,_ZThn8_N3aaa9GG12121323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121323barEv,_ZThn20_N3aaa9GG12121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212132E[];
Class_Descriptor cd__ZN3aaa9GG1212132E = {  "_ZN3aaa9GG1212132E", // class name
  bases__ZN3aaa9GG1212132E, 6,
  &(vtc__ZN3aaa9GG1212132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212133  : ::aaa::EE121 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12121333fooEv
  virtual void  bar(); // _ZN3aaa9GG12121333barEv
  ~GG1212133(); // tgen
  GG1212133(); // tgen
};
//SIG(1 _ZN3aaa9GG1212133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12121333fooEv");}
void  aaa::GG1212133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12121333barEv");}
aaa::GG1212133 ::~GG1212133(){ note_dtor("_ZN3aaa9GG1212133E", this);} // tgen
aaa::GG1212133 ::GG1212133(){ note_ctor("_ZN3aaa9GG1212133E", this);} // tgen
}
static void Test__ZN3aaa9GG1212133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212133E, buf);
    ::aaa::GG1212133 *dp, &lv = *(dp=new (buf) ::aaa::GG1212133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212133E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1212133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1212133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1212133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212133E);
    dp->::aaa::GG1212133::~GG1212133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212133E(Test__ZN3aaa9GG1212133E, "_ZN3aaa9GG1212133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212133C1Ev();
extern void _ZN3aaa9GG1212133D1Ev();
Name_Map name_map__ZN3aaa9GG1212133E[] = {
  NSPAIR(_ZN3aaa9GG1212133C1Ev),
  NSPAIR(_ZN3aaa9GG1212133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1212133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212133E[];
extern void _ZN3aaa9GG12121333fooEv();
extern void _ZN3aaa9GG12121333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12121333barEv,_ZThn8_N3aaa9GG12121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12121333barEv,_ZThn20_N3aaa9GG12121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12121333fooEv,_ZThn20_N3aaa9GG12121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12121333fooEv,_ZThn28_N3aaa9GG12121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12121333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12121333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12121333barEv,_ZThn8_N3aaa9GG12121333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121333barEv,_ZThn20_N3aaa9GG12121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12121333fooEv,_ZThn20_N3aaa9GG12121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12121333fooEv,_ZThn28_N3aaa9GG12121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212133E[];
Class_Descriptor cd__ZN3aaa9GG1212133E = {  "_ZN3aaa9GG1212133E", // class name
  bases__ZN3aaa9GG1212133E, 6,
  &(vtc__ZN3aaa9GG1212133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212211  : ::aaa::EE121 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12122113fooEv
  ~GG1212211(); // tgen
  GG1212211(); // tgen
};
//SIG(1 _ZN3aaa9GG1212211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12122113fooEv");}
aaa::GG1212211 ::~GG1212211(){ note_dtor("_ZN3aaa9GG1212211E", this);} // tgen
aaa::GG1212211 ::GG1212211(){ note_ctor("_ZN3aaa9GG1212211E", this);} // tgen
}
static void Test__ZN3aaa9GG1212211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212211E, buf);
    ::aaa::GG1212211 *dp, &lv = *(dp=new (buf) ::aaa::GG1212211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212211E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1212211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1212211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1212211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212211E);
    dp->::aaa::GG1212211::~GG1212211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212211E(Test__ZN3aaa9GG1212211E, "_ZN3aaa9GG1212211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212211C1Ev();
extern void _ZN3aaa9GG1212211D1Ev();
Name_Map name_map__ZN3aaa9GG1212211E[] = {
  NSPAIR(_ZN3aaa9GG1212211C1Ev),
  NSPAIR(_ZN3aaa9GG1212211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1212211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212211E[];
extern void _ZN3aaa9GG12122113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12122113fooEv,_ZThn20_N3aaa9GG12122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12122113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122113fooEv,_ZThn20_N3aaa9GG12122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212211E[];
Class_Descriptor cd__ZN3aaa9GG1212211E = {  "_ZN3aaa9GG1212211E", // class name
  bases__ZN3aaa9GG1212211E, 6,
  &(vtc__ZN3aaa9GG1212211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212212  : ::aaa::EE121 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12122123barEv
  ~GG1212212(); // tgen
  GG1212212(); // tgen
};
//SIG(1 _ZN3aaa9GG1212212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12122123barEv");}
aaa::GG1212212 ::~GG1212212(){ note_dtor("_ZN3aaa9GG1212212E", this);} // tgen
aaa::GG1212212 ::GG1212212(){ note_ctor("_ZN3aaa9GG1212212E", this);} // tgen
}
static void Test__ZN3aaa9GG1212212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212212E, buf);
    ::aaa::GG1212212 *dp, &lv = *(dp=new (buf) ::aaa::GG1212212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212212E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1212212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1212212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1212212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212212E);
    dp->::aaa::GG1212212::~GG1212212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212212E(Test__ZN3aaa9GG1212212E, "_ZN3aaa9GG1212212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212212C1Ev();
extern void _ZN3aaa9GG1212212D1Ev();
Name_Map name_map__ZN3aaa9GG1212212E[] = {
  NSPAIR(_ZN3aaa9GG1212212C1Ev),
  NSPAIR(_ZN3aaa9GG1212212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1212212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212212E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12122123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12122123barEv,_ZThn8_N3aaa9GG12122123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12122123barEv,_ZThn20_N3aaa9GG12122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12122123barEv,_ZThn28_N3aaa9GG12122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12122123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12122123barEv,_ZThn8_N3aaa9GG12122123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122123barEv,_ZThn20_N3aaa9GG12122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12122123barEv,_ZThn28_N3aaa9GG12122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212212E[];
Class_Descriptor cd__ZN3aaa9GG1212212E = {  "_ZN3aaa9GG1212212E", // class name
  bases__ZN3aaa9GG1212212E, 6,
  &(vtc__ZN3aaa9GG1212212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212213  : ::aaa::EE121 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12122133fooEv
  virtual void  bar(); // _ZN3aaa9GG12122133barEv
  ~GG1212213(); // tgen
  GG1212213(); // tgen
};
//SIG(1 _ZN3aaa9GG1212213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12122133fooEv");}
void  aaa::GG1212213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12122133barEv");}
aaa::GG1212213 ::~GG1212213(){ note_dtor("_ZN3aaa9GG1212213E", this);} // tgen
aaa::GG1212213 ::GG1212213(){ note_ctor("_ZN3aaa9GG1212213E", this);} // tgen
}
static void Test__ZN3aaa9GG1212213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212213E, buf);
    ::aaa::GG1212213 *dp, &lv = *(dp=new (buf) ::aaa::GG1212213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212213E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1212213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1212213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1212213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212213E);
    dp->::aaa::GG1212213::~GG1212213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212213E(Test__ZN3aaa9GG1212213E, "_ZN3aaa9GG1212213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212213C1Ev();
extern void _ZN3aaa9GG1212213D1Ev();
Name_Map name_map__ZN3aaa9GG1212213E[] = {
  NSPAIR(_ZN3aaa9GG1212213C1Ev),
  NSPAIR(_ZN3aaa9GG1212213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1212213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212213E[];
extern void _ZN3aaa9GG12122133fooEv();
extern void _ZN3aaa9GG12122133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12122133barEv,_ZThn8_N3aaa9GG12122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12122133barEv,_ZThn20_N3aaa9GG12122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12122133fooEv,_ZThn20_N3aaa9GG12122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12122133barEv,_ZThn28_N3aaa9GG12122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12122133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12122133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12122133barEv,_ZThn8_N3aaa9GG12122133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122133barEv,_ZThn20_N3aaa9GG12122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122133fooEv,_ZThn20_N3aaa9GG12122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12122133barEv,_ZThn28_N3aaa9GG12122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212213E[];
Class_Descriptor cd__ZN3aaa9GG1212213E = {  "_ZN3aaa9GG1212213E", // class name
  bases__ZN3aaa9GG1212213E, 6,
  &(vtc__ZN3aaa9GG1212213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212221  : ::aaa::EE121 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12122213fooEv
  ~GG1212221(); // tgen
  GG1212221(); // tgen
};
//SIG(1 _ZN3aaa9GG1212221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12122213fooEv");}
aaa::GG1212221 ::~GG1212221(){ note_dtor("_ZN3aaa9GG1212221E", this);} // tgen
aaa::GG1212221 ::GG1212221(){ note_ctor("_ZN3aaa9GG1212221E", this);} // tgen
}
static void Test__ZN3aaa9GG1212221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212221E, buf);
    ::aaa::GG1212221 *dp, &lv = *(dp=new (buf) ::aaa::GG1212221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212221E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1212221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1212221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1212221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212221E);
    dp->::aaa::GG1212221::~GG1212221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212221E(Test__ZN3aaa9GG1212221E, "_ZN3aaa9GG1212221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212221C1Ev();
extern void _ZN3aaa9GG1212221D1Ev();
Name_Map name_map__ZN3aaa9GG1212221E[] = {
  NSPAIR(_ZN3aaa9GG1212221C1Ev),
  NSPAIR(_ZN3aaa9GG1212221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1212221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212221E[];
extern void _ZN3aaa9GG12122213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12122213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212221E[];
Class_Descriptor cd__ZN3aaa9GG1212221E = {  "_ZN3aaa9GG1212221E", // class name
  bases__ZN3aaa9GG1212221E, 6,
  &(vtc__ZN3aaa9GG1212221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212221E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212222  : ::aaa::EE121 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12122223barEv
  ~GG1212222(); // tgen
  GG1212222(); // tgen
};
//SIG(1 _ZN3aaa9GG1212222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12122223barEv");}
aaa::GG1212222 ::~GG1212222(){ note_dtor("_ZN3aaa9GG1212222E", this);} // tgen
aaa::GG1212222 ::GG1212222(){ note_ctor("_ZN3aaa9GG1212222E", this);} // tgen
}
static void Test__ZN3aaa9GG1212222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212222E, buf);
    ::aaa::GG1212222 *dp, &lv = *(dp=new (buf) ::aaa::GG1212222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212222E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1212222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1212222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1212222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212222E);
    dp->::aaa::GG1212222::~GG1212222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212222E(Test__ZN3aaa9GG1212222E, "_ZN3aaa9GG1212222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212222C1Ev();
extern void _ZN3aaa9GG1212222D1Ev();
Name_Map name_map__ZN3aaa9GG1212222E[] = {
  NSPAIR(_ZN3aaa9GG1212222C1Ev),
  NSPAIR(_ZN3aaa9GG1212222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1212222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212222E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12122223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12122223barEv,_ZThn8_N3aaa9GG12122223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12122223barEv,_ZThn20_N3aaa9GG12122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12122223barEv,_ZThn28_N3aaa9GG12122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12122223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12122223barEv,_ZThn8_N3aaa9GG12122223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122223barEv,_ZThn20_N3aaa9GG12122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12122223barEv,_ZThn28_N3aaa9GG12122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212222E[];
Class_Descriptor cd__ZN3aaa9GG1212222E = {  "_ZN3aaa9GG1212222E", // class name
  bases__ZN3aaa9GG1212222E, 6,
  &(vtc__ZN3aaa9GG1212222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212223  : ::aaa::EE121 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12122233fooEv
  virtual void  bar(); // _ZN3aaa9GG12122233barEv
  ~GG1212223(); // tgen
  GG1212223(); // tgen
};
//SIG(1 _ZN3aaa9GG1212223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12122233fooEv");}
void  aaa::GG1212223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12122233barEv");}
aaa::GG1212223 ::~GG1212223(){ note_dtor("_ZN3aaa9GG1212223E", this);} // tgen
aaa::GG1212223 ::GG1212223(){ note_ctor("_ZN3aaa9GG1212223E", this);} // tgen
}
static void Test__ZN3aaa9GG1212223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212223E, buf);
    ::aaa::GG1212223 *dp, &lv = *(dp=new (buf) ::aaa::GG1212223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212223E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1212223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1212223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1212223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212223E);
    dp->::aaa::GG1212223::~GG1212223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212223E(Test__ZN3aaa9GG1212223E, "_ZN3aaa9GG1212223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212223C1Ev();
extern void _ZN3aaa9GG1212223D1Ev();
Name_Map name_map__ZN3aaa9GG1212223E[] = {
  NSPAIR(_ZN3aaa9GG1212223C1Ev),
  NSPAIR(_ZN3aaa9GG1212223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1212223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212223E[];
extern void _ZN3aaa9GG12122233fooEv();
extern void _ZN3aaa9GG12122233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12122233barEv,_ZThn8_N3aaa9GG12122233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12122233barEv,_ZThn20_N3aaa9GG12122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12122233barEv,_ZThn28_N3aaa9GG12122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12122233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12122233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12122233barEv,_ZThn8_N3aaa9GG12122233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122233barEv,_ZThn20_N3aaa9GG12122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12122233barEv,_ZThn28_N3aaa9GG12122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212223E[];
Class_Descriptor cd__ZN3aaa9GG1212223E = {  "_ZN3aaa9GG1212223E", // class name
  bases__ZN3aaa9GG1212223E, 6,
  &(vtc__ZN3aaa9GG1212223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212231  : ::aaa::EE121 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12122313fooEv
  ~GG1212231(); // tgen
  GG1212231(); // tgen
};
//SIG(1 _ZN3aaa9GG1212231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12122313fooEv");}
aaa::GG1212231 ::~GG1212231(){ note_dtor("_ZN3aaa9GG1212231E", this);} // tgen
aaa::GG1212231 ::GG1212231(){ note_ctor("_ZN3aaa9GG1212231E", this);} // tgen
}
static void Test__ZN3aaa9GG1212231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212231E, buf);
    ::aaa::GG1212231 *dp, &lv = *(dp=new (buf) ::aaa::GG1212231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212231E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1212231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1212231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1212231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212231E);
    dp->::aaa::GG1212231::~GG1212231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212231E(Test__ZN3aaa9GG1212231E, "_ZN3aaa9GG1212231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212231C1Ev();
extern void _ZN3aaa9GG1212231D1Ev();
Name_Map name_map__ZN3aaa9GG1212231E[] = {
  NSPAIR(_ZN3aaa9GG1212231C1Ev),
  NSPAIR(_ZN3aaa9GG1212231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1212231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212231E[];
extern void _ZN3aaa9GG12122313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12122313fooEv,_ZThn20_N3aaa9GG12122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12122313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122313fooEv,_ZThn20_N3aaa9GG12122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212231E[];
Class_Descriptor cd__ZN3aaa9GG1212231E = {  "_ZN3aaa9GG1212231E", // class name
  bases__ZN3aaa9GG1212231E, 6,
  &(vtc__ZN3aaa9GG1212231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212231E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212232  : ::aaa::EE121 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12122323barEv
  ~GG1212232(); // tgen
  GG1212232(); // tgen
};
//SIG(1 _ZN3aaa9GG1212232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12122323barEv");}
aaa::GG1212232 ::~GG1212232(){ note_dtor("_ZN3aaa9GG1212232E", this);} // tgen
aaa::GG1212232 ::GG1212232(){ note_ctor("_ZN3aaa9GG1212232E", this);} // tgen
}
static void Test__ZN3aaa9GG1212232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212232E, buf);
    ::aaa::GG1212232 *dp, &lv = *(dp=new (buf) ::aaa::GG1212232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212232E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1212232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1212232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1212232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212232E);
    dp->::aaa::GG1212232::~GG1212232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212232E(Test__ZN3aaa9GG1212232E, "_ZN3aaa9GG1212232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212232C1Ev();
extern void _ZN3aaa9GG1212232D1Ev();
Name_Map name_map__ZN3aaa9GG1212232E[] = {
  NSPAIR(_ZN3aaa9GG1212232C1Ev),
  NSPAIR(_ZN3aaa9GG1212232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1212232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212232E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12122323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12122323barEv,_ZThn8_N3aaa9GG12122323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12122323barEv,_ZThn20_N3aaa9GG12122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12122323barEv,_ZThn28_N3aaa9GG12122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12122323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12122323barEv,_ZThn8_N3aaa9GG12122323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122323barEv,_ZThn20_N3aaa9GG12122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12122323barEv,_ZThn28_N3aaa9GG12122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212232E[];
Class_Descriptor cd__ZN3aaa9GG1212232E = {  "_ZN3aaa9GG1212232E", // class name
  bases__ZN3aaa9GG1212232E, 6,
  &(vtc__ZN3aaa9GG1212232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212233  : ::aaa::EE121 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12122333fooEv
  virtual void  bar(); // _ZN3aaa9GG12122333barEv
  ~GG1212233(); // tgen
  GG1212233(); // tgen
};
//SIG(1 _ZN3aaa9GG1212233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12122333fooEv");}
void  aaa::GG1212233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12122333barEv");}
aaa::GG1212233 ::~GG1212233(){ note_dtor("_ZN3aaa9GG1212233E", this);} // tgen
aaa::GG1212233 ::GG1212233(){ note_ctor("_ZN3aaa9GG1212233E", this);} // tgen
}
static void Test__ZN3aaa9GG1212233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212233E, buf);
    ::aaa::GG1212233 *dp, &lv = *(dp=new (buf) ::aaa::GG1212233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212233E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1212233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1212233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1212233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212233E);
    dp->::aaa::GG1212233::~GG1212233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212233E(Test__ZN3aaa9GG1212233E, "_ZN3aaa9GG1212233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212233C1Ev();
extern void _ZN3aaa9GG1212233D1Ev();
Name_Map name_map__ZN3aaa9GG1212233E[] = {
  NSPAIR(_ZN3aaa9GG1212233C1Ev),
  NSPAIR(_ZN3aaa9GG1212233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1212233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212233E[];
extern void _ZN3aaa9GG12122333fooEv();
extern void _ZN3aaa9GG12122333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12122333barEv,_ZThn8_N3aaa9GG12122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12122333barEv,_ZThn20_N3aaa9GG12122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12122333fooEv,_ZThn20_N3aaa9GG12122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12122333barEv,_ZThn28_N3aaa9GG12122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12122333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12122333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12122333barEv,_ZThn8_N3aaa9GG12122333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122333barEv,_ZThn20_N3aaa9GG12122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12122333fooEv,_ZThn20_N3aaa9GG12122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12122333barEv,_ZThn28_N3aaa9GG12122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212233E[];
Class_Descriptor cd__ZN3aaa9GG1212233E = {  "_ZN3aaa9GG1212233E", // class name
  bases__ZN3aaa9GG1212233E, 6,
  &(vtc__ZN3aaa9GG1212233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212311  : ::aaa::EE121 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12123113fooEv
  ~GG1212311(); // tgen
  GG1212311(); // tgen
};
//SIG(1 _ZN3aaa9GG1212311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12123113fooEv");}
aaa::GG1212311 ::~GG1212311(){ note_dtor("_ZN3aaa9GG1212311E", this);} // tgen
aaa::GG1212311 ::GG1212311(){ note_ctor("_ZN3aaa9GG1212311E", this);} // tgen
}
static void Test__ZN3aaa9GG1212311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212311E, buf);
    ::aaa::GG1212311 *dp, &lv = *(dp=new (buf) ::aaa::GG1212311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212311E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1212311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1212311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1212311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212311E);
    dp->::aaa::GG1212311::~GG1212311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212311E(Test__ZN3aaa9GG1212311E, "_ZN3aaa9GG1212311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212311C1Ev();
extern void _ZN3aaa9GG1212311D1Ev();
Name_Map name_map__ZN3aaa9GG1212311E[] = {
  NSPAIR(_ZN3aaa9GG1212311C1Ev),
  NSPAIR(_ZN3aaa9GG1212311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1212311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212311E[];
extern void _ZN3aaa9GG12123113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12123113fooEv,_ZThn20_N3aaa9GG12123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123113fooEv,_ZThn28_N3aaa9GG12123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12123113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123113fooEv,_ZThn20_N3aaa9GG12123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123113fooEv,_ZThn28_N3aaa9GG12123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212311E[];
Class_Descriptor cd__ZN3aaa9GG1212311E = {  "_ZN3aaa9GG1212311E", // class name
  bases__ZN3aaa9GG1212311E, 6,
  &(vtc__ZN3aaa9GG1212311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212312  : ::aaa::EE121 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12123123barEv
  ~GG1212312(); // tgen
  GG1212312(); // tgen
};
//SIG(1 _ZN3aaa9GG1212312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12123123barEv");}
aaa::GG1212312 ::~GG1212312(){ note_dtor("_ZN3aaa9GG1212312E", this);} // tgen
aaa::GG1212312 ::GG1212312(){ note_ctor("_ZN3aaa9GG1212312E", this);} // tgen
}
static void Test__ZN3aaa9GG1212312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212312E, buf);
    ::aaa::GG1212312 *dp, &lv = *(dp=new (buf) ::aaa::GG1212312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212312E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1212312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1212312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1212312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212312E);
    dp->::aaa::GG1212312::~GG1212312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212312E(Test__ZN3aaa9GG1212312E, "_ZN3aaa9GG1212312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212312C1Ev();
extern void _ZN3aaa9GG1212312D1Ev();
Name_Map name_map__ZN3aaa9GG1212312E[] = {
  NSPAIR(_ZN3aaa9GG1212312C1Ev),
  NSPAIR(_ZN3aaa9GG1212312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1212312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212312E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12123123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12123123barEv,_ZThn8_N3aaa9GG12123123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12123123barEv,_ZThn20_N3aaa9GG12123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123123barEv,_ZThn28_N3aaa9GG12123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12123123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12123123barEv,_ZThn8_N3aaa9GG12123123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123123barEv,_ZThn20_N3aaa9GG12123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123123barEv,_ZThn28_N3aaa9GG12123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212312E[];
Class_Descriptor cd__ZN3aaa9GG1212312E = {  "_ZN3aaa9GG1212312E", // class name
  bases__ZN3aaa9GG1212312E, 6,
  &(vtc__ZN3aaa9GG1212312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212313  : ::aaa::EE121 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12123133fooEv
  virtual void  bar(); // _ZN3aaa9GG12123133barEv
  ~GG1212313(); // tgen
  GG1212313(); // tgen
};
//SIG(1 _ZN3aaa9GG1212313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12123133fooEv");}
void  aaa::GG1212313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12123133barEv");}
aaa::GG1212313 ::~GG1212313(){ note_dtor("_ZN3aaa9GG1212313E", this);} // tgen
aaa::GG1212313 ::GG1212313(){ note_ctor("_ZN3aaa9GG1212313E", this);} // tgen
}
static void Test__ZN3aaa9GG1212313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212313E, buf);
    ::aaa::GG1212313 *dp, &lv = *(dp=new (buf) ::aaa::GG1212313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212313E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1212313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1212313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1212313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212313E);
    dp->::aaa::GG1212313::~GG1212313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212313E(Test__ZN3aaa9GG1212313E, "_ZN3aaa9GG1212313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212313C1Ev();
extern void _ZN3aaa9GG1212313D1Ev();
Name_Map name_map__ZN3aaa9GG1212313E[] = {
  NSPAIR(_ZN3aaa9GG1212313C1Ev),
  NSPAIR(_ZN3aaa9GG1212313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1212313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212313E[];
extern void _ZN3aaa9GG12123133fooEv();
extern void _ZN3aaa9GG12123133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12123133barEv,_ZThn8_N3aaa9GG12123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12123133barEv,_ZThn20_N3aaa9GG12123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12123133fooEv,_ZThn20_N3aaa9GG12123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123133fooEv,_ZThn28_N3aaa9GG12123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123133barEv,_ZThn28_N3aaa9GG12123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12123133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12123133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12123133barEv,_ZThn8_N3aaa9GG12123133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123133barEv,_ZThn20_N3aaa9GG12123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123133fooEv,_ZThn20_N3aaa9GG12123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123133fooEv,_ZThn28_N3aaa9GG12123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123133barEv,_ZThn28_N3aaa9GG12123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212313E[];
Class_Descriptor cd__ZN3aaa9GG1212313E = {  "_ZN3aaa9GG1212313E", // class name
  bases__ZN3aaa9GG1212313E, 6,
  &(vtc__ZN3aaa9GG1212313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212321  : ::aaa::EE121 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12123213fooEv
  ~GG1212321(); // tgen
  GG1212321(); // tgen
};
//SIG(1 _ZN3aaa9GG1212321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12123213fooEv");}
aaa::GG1212321 ::~GG1212321(){ note_dtor("_ZN3aaa9GG1212321E", this);} // tgen
aaa::GG1212321 ::GG1212321(){ note_ctor("_ZN3aaa9GG1212321E", this);} // tgen
}
static void Test__ZN3aaa9GG1212321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212321E, buf);
    ::aaa::GG1212321 *dp, &lv = *(dp=new (buf) ::aaa::GG1212321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212321E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1212321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1212321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1212321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212321E);
    dp->::aaa::GG1212321::~GG1212321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212321E(Test__ZN3aaa9GG1212321E, "_ZN3aaa9GG1212321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212321C1Ev();
extern void _ZN3aaa9GG1212321D1Ev();
Name_Map name_map__ZN3aaa9GG1212321E[] = {
  NSPAIR(_ZN3aaa9GG1212321C1Ev),
  NSPAIR(_ZN3aaa9GG1212321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1212321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212321E[];
extern void _ZN3aaa9GG12123213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12123213fooEv,_ZThn28_N3aaa9GG12123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12123213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123213fooEv,_ZThn28_N3aaa9GG12123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212321E[];
Class_Descriptor cd__ZN3aaa9GG1212321E = {  "_ZN3aaa9GG1212321E", // class name
  bases__ZN3aaa9GG1212321E, 6,
  &(vtc__ZN3aaa9GG1212321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212321E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212322  : ::aaa::EE121 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12123223barEv
  ~GG1212322(); // tgen
  GG1212322(); // tgen
};
//SIG(1 _ZN3aaa9GG1212322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12123223barEv");}
aaa::GG1212322 ::~GG1212322(){ note_dtor("_ZN3aaa9GG1212322E", this);} // tgen
aaa::GG1212322 ::GG1212322(){ note_ctor("_ZN3aaa9GG1212322E", this);} // tgen
}
static void Test__ZN3aaa9GG1212322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212322E, buf);
    ::aaa::GG1212322 *dp, &lv = *(dp=new (buf) ::aaa::GG1212322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212322E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1212322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1212322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1212322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212322E);
    dp->::aaa::GG1212322::~GG1212322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212322E(Test__ZN3aaa9GG1212322E, "_ZN3aaa9GG1212322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212322C1Ev();
extern void _ZN3aaa9GG1212322D1Ev();
Name_Map name_map__ZN3aaa9GG1212322E[] = {
  NSPAIR(_ZN3aaa9GG1212322C1Ev),
  NSPAIR(_ZN3aaa9GG1212322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1212322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212322E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12123223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12123223barEv,_ZThn8_N3aaa9GG12123223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12123223barEv,_ZThn20_N3aaa9GG12123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12123223barEv,_ZThn28_N3aaa9GG12123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12123223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12123223barEv,_ZThn8_N3aaa9GG12123223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123223barEv,_ZThn20_N3aaa9GG12123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123223barEv,_ZThn28_N3aaa9GG12123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212322E[];
Class_Descriptor cd__ZN3aaa9GG1212322E = {  "_ZN3aaa9GG1212322E", // class name
  bases__ZN3aaa9GG1212322E, 6,
  &(vtc__ZN3aaa9GG1212322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212323  : ::aaa::EE121 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12123233fooEv
  virtual void  bar(); // _ZN3aaa9GG12123233barEv
  ~GG1212323(); // tgen
  GG1212323(); // tgen
};
//SIG(1 _ZN3aaa9GG1212323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12123233fooEv");}
void  aaa::GG1212323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12123233barEv");}
aaa::GG1212323 ::~GG1212323(){ note_dtor("_ZN3aaa9GG1212323E", this);} // tgen
aaa::GG1212323 ::GG1212323(){ note_ctor("_ZN3aaa9GG1212323E", this);} // tgen
}
static void Test__ZN3aaa9GG1212323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212323E, buf);
    ::aaa::GG1212323 *dp, &lv = *(dp=new (buf) ::aaa::GG1212323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212323E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1212323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1212323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1212323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212323E);
    dp->::aaa::GG1212323::~GG1212323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212323E(Test__ZN3aaa9GG1212323E, "_ZN3aaa9GG1212323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212323C1Ev();
extern void _ZN3aaa9GG1212323D1Ev();
Name_Map name_map__ZN3aaa9GG1212323E[] = {
  NSPAIR(_ZN3aaa9GG1212323C1Ev),
  NSPAIR(_ZN3aaa9GG1212323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1212323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212323E[];
extern void _ZN3aaa9GG12123233fooEv();
extern void _ZN3aaa9GG12123233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12123233barEv,_ZThn8_N3aaa9GG12123233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12123233barEv,_ZThn20_N3aaa9GG12123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123233fooEv,_ZThn28_N3aaa9GG12123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123233barEv,_ZThn28_N3aaa9GG12123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12123233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12123233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12123233barEv,_ZThn8_N3aaa9GG12123233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123233barEv,_ZThn20_N3aaa9GG12123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123233fooEv,_ZThn28_N3aaa9GG12123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123233barEv,_ZThn28_N3aaa9GG12123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212323E[];
Class_Descriptor cd__ZN3aaa9GG1212323E = {  "_ZN3aaa9GG1212323E", // class name
  bases__ZN3aaa9GG1212323E, 6,
  &(vtc__ZN3aaa9GG1212323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212331  : ::aaa::EE121 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12123313fooEv
  ~GG1212331(); // tgen
  GG1212331(); // tgen
};
//SIG(1 _ZN3aaa9GG1212331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12123313fooEv");}
aaa::GG1212331 ::~GG1212331(){ note_dtor("_ZN3aaa9GG1212331E", this);} // tgen
aaa::GG1212331 ::GG1212331(){ note_ctor("_ZN3aaa9GG1212331E", this);} // tgen
}
static void Test__ZN3aaa9GG1212331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212331E, buf);
    ::aaa::GG1212331 *dp, &lv = *(dp=new (buf) ::aaa::GG1212331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212331E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1212331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1212331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1212331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212331E);
    dp->::aaa::GG1212331::~GG1212331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212331E(Test__ZN3aaa9GG1212331E, "_ZN3aaa9GG1212331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212331C1Ev();
extern void _ZN3aaa9GG1212331D1Ev();
Name_Map name_map__ZN3aaa9GG1212331E[] = {
  NSPAIR(_ZN3aaa9GG1212331C1Ev),
  NSPAIR(_ZN3aaa9GG1212331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1212331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212331E[];
extern void _ZN3aaa9GG12123313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12123313fooEv,_ZThn20_N3aaa9GG12123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123313fooEv,_ZThn28_N3aaa9GG12123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12123313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123313fooEv,_ZThn20_N3aaa9GG12123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123313fooEv,_ZThn28_N3aaa9GG12123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212331E[];
Class_Descriptor cd__ZN3aaa9GG1212331E = {  "_ZN3aaa9GG1212331E", // class name
  bases__ZN3aaa9GG1212331E, 6,
  &(vtc__ZN3aaa9GG1212331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212331E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212332  : ::aaa::EE121 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12123323barEv
  ~GG1212332(); // tgen
  GG1212332(); // tgen
};
//SIG(1 _ZN3aaa9GG1212332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1212332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12123323barEv");}
aaa::GG1212332 ::~GG1212332(){ note_dtor("_ZN3aaa9GG1212332E", this);} // tgen
aaa::GG1212332 ::GG1212332(){ note_ctor("_ZN3aaa9GG1212332E", this);} // tgen
}
static void Test__ZN3aaa9GG1212332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212332E, buf);
    ::aaa::GG1212332 *dp, &lv = *(dp=new (buf) ::aaa::GG1212332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212332E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1212332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1212332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1212332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212332E);
    dp->::aaa::GG1212332::~GG1212332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212332E(Test__ZN3aaa9GG1212332E, "_ZN3aaa9GG1212332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212332C1Ev();
extern void _ZN3aaa9GG1212332D1Ev();
Name_Map name_map__ZN3aaa9GG1212332E[] = {
  NSPAIR(_ZN3aaa9GG1212332C1Ev),
  NSPAIR(_ZN3aaa9GG1212332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1212332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212332E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12123323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12123323barEv,_ZThn8_N3aaa9GG12123323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12123323barEv,_ZThn20_N3aaa9GG12123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123323barEv,_ZThn28_N3aaa9GG12123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12123323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12123323barEv,_ZThn8_N3aaa9GG12123323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123323barEv,_ZThn20_N3aaa9GG12123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123323barEv,_ZThn28_N3aaa9GG12123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212332E[];
Class_Descriptor cd__ZN3aaa9GG1212332E = {  "_ZN3aaa9GG1212332E", // class name
  bases__ZN3aaa9GG1212332E, 6,
  &(vtc__ZN3aaa9GG1212332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1212333  : ::aaa::EE121 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12123333fooEv
  virtual void  bar(); // _ZN3aaa9GG12123333barEv
  ~GG1212333(); // tgen
  GG1212333(); // tgen
};
//SIG(1 _ZN3aaa9GG1212333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1212333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12123333fooEv");}
void  aaa::GG1212333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12123333barEv");}
aaa::GG1212333 ::~GG1212333(){ note_dtor("_ZN3aaa9GG1212333E", this);} // tgen
aaa::GG1212333 ::GG1212333(){ note_ctor("_ZN3aaa9GG1212333E", this);} // tgen
}
static void Test__ZN3aaa9GG1212333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1212333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1212333E, buf);
    ::aaa::GG1212333 *dp, &lv = *(dp=new (buf) ::aaa::GG1212333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1212333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1212333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1212333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1212333E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1212333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1212333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1212333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1212333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1212333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1212333E);
    dp->::aaa::GG1212333::~GG1212333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1212333E(Test__ZN3aaa9GG1212333E, "_ZN3aaa9GG1212333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1212333C1Ev();
extern void _ZN3aaa9GG1212333D1Ev();
Name_Map name_map__ZN3aaa9GG1212333E[] = {
  NSPAIR(_ZN3aaa9GG1212333C1Ev),
  NSPAIR(_ZN3aaa9GG1212333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1212333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1212333E[];
extern void _ZN3aaa9GG12123333fooEv();
extern void _ZN3aaa9GG12123333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12123333barEv,_ZThn8_N3aaa9GG12123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12123333barEv,_ZThn20_N3aaa9GG12123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12123333fooEv,_ZThn20_N3aaa9GG12123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123333fooEv,_ZThn28_N3aaa9GG12123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12123333barEv,_ZThn28_N3aaa9GG12123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1212333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12123333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12123333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12123333barEv,_ZThn8_N3aaa9GG12123333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123333barEv,_ZThn20_N3aaa9GG12123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12123333fooEv,_ZThn20_N3aaa9GG12123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123333fooEv,_ZThn28_N3aaa9GG12123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12123333barEv,_ZThn28_N3aaa9GG12123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1212333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1212333E[];
Class_Descriptor cd__ZN3aaa9GG1212333E = {  "_ZN3aaa9GG1212333E", // class name
  bases__ZN3aaa9GG1212333E, 6,
  &(vtc__ZN3aaa9GG1212333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1212333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1212333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213111  : ::aaa::EE121 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12131113fooEv
  ~GG1213111(); // tgen
  GG1213111(); // tgen
};
//SIG(1 _ZN3aaa9GG1213111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12131113fooEv");}
aaa::GG1213111 ::~GG1213111(){ note_dtor("_ZN3aaa9GG1213111E", this);} // tgen
aaa::GG1213111 ::GG1213111(){ note_ctor("_ZN3aaa9GG1213111E", this);} // tgen
}
static void Test__ZN3aaa9GG1213111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213111E, buf);
    ::aaa::GG1213111 *dp, &lv = *(dp=new (buf) ::aaa::GG1213111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213111E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1213111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1213111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1213111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213111E);
    dp->::aaa::GG1213111::~GG1213111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213111E(Test__ZN3aaa9GG1213111E, "_ZN3aaa9GG1213111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213111C1Ev();
extern void _ZN3aaa9GG1213111D1Ev();
Name_Map name_map__ZN3aaa9GG1213111E[] = {
  NSPAIR(_ZN3aaa9GG1213111C1Ev),
  NSPAIR(_ZN3aaa9GG1213111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1213111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213111E[];
extern void _ZN3aaa9GG12131113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12131113fooEv,_ZThn20_N3aaa9GG12131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12131113fooEv,_ZThn28_N3aaa9GG12131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12131113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131113fooEv,_ZThn20_N3aaa9GG12131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12131113fooEv,_ZThn28_N3aaa9GG12131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213111E[];
Class_Descriptor cd__ZN3aaa9GG1213111E = {  "_ZN3aaa9GG1213111E", // class name
  bases__ZN3aaa9GG1213111E, 6,
  &(vtc__ZN3aaa9GG1213111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213112  : ::aaa::EE121 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12131123barEv
  ~GG1213112(); // tgen
  GG1213112(); // tgen
};
//SIG(1 _ZN3aaa9GG1213112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12131123barEv");}
aaa::GG1213112 ::~GG1213112(){ note_dtor("_ZN3aaa9GG1213112E", this);} // tgen
aaa::GG1213112 ::GG1213112(){ note_ctor("_ZN3aaa9GG1213112E", this);} // tgen
}
static void Test__ZN3aaa9GG1213112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213112E, buf);
    ::aaa::GG1213112 *dp, &lv = *(dp=new (buf) ::aaa::GG1213112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213112E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1213112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1213112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1213112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213112E);
    dp->::aaa::GG1213112::~GG1213112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213112E(Test__ZN3aaa9GG1213112E, "_ZN3aaa9GG1213112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213112C1Ev();
extern void _ZN3aaa9GG1213112D1Ev();
Name_Map name_map__ZN3aaa9GG1213112E[] = {
  NSPAIR(_ZN3aaa9GG1213112C1Ev),
  NSPAIR(_ZN3aaa9GG1213112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1213112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213112E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12131123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12131123barEv,_ZThn8_N3aaa9GG12131123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12131123barEv,_ZThn20_N3aaa9GG12131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12131123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12131123barEv,_ZThn8_N3aaa9GG12131123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131123barEv,_ZThn20_N3aaa9GG12131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213112E[];
Class_Descriptor cd__ZN3aaa9GG1213112E = {  "_ZN3aaa9GG1213112E", // class name
  bases__ZN3aaa9GG1213112E, 6,
  &(vtc__ZN3aaa9GG1213112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213113  : ::aaa::EE121 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12131133fooEv
  virtual void  bar(); // _ZN3aaa9GG12131133barEv
  ~GG1213113(); // tgen
  GG1213113(); // tgen
};
//SIG(1 _ZN3aaa9GG1213113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12131133fooEv");}
void  aaa::GG1213113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12131133barEv");}
aaa::GG1213113 ::~GG1213113(){ note_dtor("_ZN3aaa9GG1213113E", this);} // tgen
aaa::GG1213113 ::GG1213113(){ note_ctor("_ZN3aaa9GG1213113E", this);} // tgen
}
static void Test__ZN3aaa9GG1213113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213113E, buf);
    ::aaa::GG1213113 *dp, &lv = *(dp=new (buf) ::aaa::GG1213113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213113E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1213113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1213113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1213113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213113E);
    dp->::aaa::GG1213113::~GG1213113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213113E(Test__ZN3aaa9GG1213113E, "_ZN3aaa9GG1213113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213113C1Ev();
extern void _ZN3aaa9GG1213113D1Ev();
Name_Map name_map__ZN3aaa9GG1213113E[] = {
  NSPAIR(_ZN3aaa9GG1213113C1Ev),
  NSPAIR(_ZN3aaa9GG1213113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1213113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213113E[];
extern void _ZN3aaa9GG12131133fooEv();
extern void _ZN3aaa9GG12131133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12131133barEv,_ZThn8_N3aaa9GG12131133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12131133fooEv,_ZThn20_N3aaa9GG12131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12131133barEv,_ZThn20_N3aaa9GG12131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12131133fooEv,_ZThn28_N3aaa9GG12131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12131133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12131133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12131133barEv,_ZThn8_N3aaa9GG12131133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131133fooEv,_ZThn20_N3aaa9GG12131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131133barEv,_ZThn20_N3aaa9GG12131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12131133fooEv,_ZThn28_N3aaa9GG12131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213113E[];
Class_Descriptor cd__ZN3aaa9GG1213113E = {  "_ZN3aaa9GG1213113E", // class name
  bases__ZN3aaa9GG1213113E, 6,
  &(vtc__ZN3aaa9GG1213113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213121  : ::aaa::EE121 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12131213fooEv
  ~GG1213121(); // tgen
  GG1213121(); // tgen
};
//SIG(1 _ZN3aaa9GG1213121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12131213fooEv");}
aaa::GG1213121 ::~GG1213121(){ note_dtor("_ZN3aaa9GG1213121E", this);} // tgen
aaa::GG1213121 ::GG1213121(){ note_ctor("_ZN3aaa9GG1213121E", this);} // tgen
}
static void Test__ZN3aaa9GG1213121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213121E, buf);
    ::aaa::GG1213121 *dp, &lv = *(dp=new (buf) ::aaa::GG1213121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213121E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1213121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1213121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1213121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213121E);
    dp->::aaa::GG1213121::~GG1213121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213121E(Test__ZN3aaa9GG1213121E, "_ZN3aaa9GG1213121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213121C1Ev();
extern void _ZN3aaa9GG1213121D1Ev();
Name_Map name_map__ZN3aaa9GG1213121E[] = {
  NSPAIR(_ZN3aaa9GG1213121C1Ev),
  NSPAIR(_ZN3aaa9GG1213121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1213121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213121E[];
extern void _ZN3aaa9GG12131213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12131213fooEv,_ZThn20_N3aaa9GG12131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12131213fooEv,_ZThn28_N3aaa9GG12131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12131213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131213fooEv,_ZThn20_N3aaa9GG12131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12131213fooEv,_ZThn28_N3aaa9GG12131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213121E[];
Class_Descriptor cd__ZN3aaa9GG1213121E = {  "_ZN3aaa9GG1213121E", // class name
  bases__ZN3aaa9GG1213121E, 6,
  &(vtc__ZN3aaa9GG1213121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213122  : ::aaa::EE121 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12131223barEv
  ~GG1213122(); // tgen
  GG1213122(); // tgen
};
//SIG(1 _ZN3aaa9GG1213122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12131223barEv");}
aaa::GG1213122 ::~GG1213122(){ note_dtor("_ZN3aaa9GG1213122E", this);} // tgen
aaa::GG1213122 ::GG1213122(){ note_ctor("_ZN3aaa9GG1213122E", this);} // tgen
}
static void Test__ZN3aaa9GG1213122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213122E, buf);
    ::aaa::GG1213122 *dp, &lv = *(dp=new (buf) ::aaa::GG1213122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213122E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1213122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1213122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1213122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213122E);
    dp->::aaa::GG1213122::~GG1213122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213122E(Test__ZN3aaa9GG1213122E, "_ZN3aaa9GG1213122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213122C1Ev();
extern void _ZN3aaa9GG1213122D1Ev();
Name_Map name_map__ZN3aaa9GG1213122E[] = {
  NSPAIR(_ZN3aaa9GG1213122C1Ev),
  NSPAIR(_ZN3aaa9GG1213122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1213122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213122E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12131223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12131223barEv,_ZThn8_N3aaa9GG12131223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12131223barEv,_ZThn20_N3aaa9GG12131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12131223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12131223barEv,_ZThn8_N3aaa9GG12131223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131223barEv,_ZThn20_N3aaa9GG12131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213122E[];
Class_Descriptor cd__ZN3aaa9GG1213122E = {  "_ZN3aaa9GG1213122E", // class name
  bases__ZN3aaa9GG1213122E, 6,
  &(vtc__ZN3aaa9GG1213122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213123  : ::aaa::EE121 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12131233fooEv
  virtual void  bar(); // _ZN3aaa9GG12131233barEv
  ~GG1213123(); // tgen
  GG1213123(); // tgen
};
//SIG(1 _ZN3aaa9GG1213123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12131233fooEv");}
void  aaa::GG1213123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12131233barEv");}
aaa::GG1213123 ::~GG1213123(){ note_dtor("_ZN3aaa9GG1213123E", this);} // tgen
aaa::GG1213123 ::GG1213123(){ note_ctor("_ZN3aaa9GG1213123E", this);} // tgen
}
static void Test__ZN3aaa9GG1213123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213123E, buf);
    ::aaa::GG1213123 *dp, &lv = *(dp=new (buf) ::aaa::GG1213123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213123E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1213123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1213123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1213123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213123E);
    dp->::aaa::GG1213123::~GG1213123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213123E(Test__ZN3aaa9GG1213123E, "_ZN3aaa9GG1213123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213123C1Ev();
extern void _ZN3aaa9GG1213123D1Ev();
Name_Map name_map__ZN3aaa9GG1213123E[] = {
  NSPAIR(_ZN3aaa9GG1213123C1Ev),
  NSPAIR(_ZN3aaa9GG1213123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1213123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213123E[];
extern void _ZN3aaa9GG12131233fooEv();
extern void _ZN3aaa9GG12131233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12131233barEv,_ZThn8_N3aaa9GG12131233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12131233fooEv,_ZThn20_N3aaa9GG12131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12131233barEv,_ZThn20_N3aaa9GG12131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12131233fooEv,_ZThn28_N3aaa9GG12131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12131233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12131233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12131233barEv,_ZThn8_N3aaa9GG12131233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131233fooEv,_ZThn20_N3aaa9GG12131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131233barEv,_ZThn20_N3aaa9GG12131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12131233fooEv,_ZThn28_N3aaa9GG12131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213123E[];
Class_Descriptor cd__ZN3aaa9GG1213123E = {  "_ZN3aaa9GG1213123E", // class name
  bases__ZN3aaa9GG1213123E, 6,
  &(vtc__ZN3aaa9GG1213123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213131  : ::aaa::EE121 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12131313fooEv
  ~GG1213131(); // tgen
  GG1213131(); // tgen
};
//SIG(1 _ZN3aaa9GG1213131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12131313fooEv");}
aaa::GG1213131 ::~GG1213131(){ note_dtor("_ZN3aaa9GG1213131E", this);} // tgen
aaa::GG1213131 ::GG1213131(){ note_ctor("_ZN3aaa9GG1213131E", this);} // tgen
}
static void Test__ZN3aaa9GG1213131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213131E, buf);
    ::aaa::GG1213131 *dp, &lv = *(dp=new (buf) ::aaa::GG1213131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213131E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1213131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1213131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1213131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213131E);
    dp->::aaa::GG1213131::~GG1213131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213131E(Test__ZN3aaa9GG1213131E, "_ZN3aaa9GG1213131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213131C1Ev();
extern void _ZN3aaa9GG1213131D1Ev();
Name_Map name_map__ZN3aaa9GG1213131E[] = {
  NSPAIR(_ZN3aaa9GG1213131C1Ev),
  NSPAIR(_ZN3aaa9GG1213131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1213131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213131E[];
extern void _ZN3aaa9GG12131313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12131313fooEv,_ZThn20_N3aaa9GG12131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12131313fooEv,_ZThn28_N3aaa9GG12131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12131313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131313fooEv,_ZThn20_N3aaa9GG12131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12131313fooEv,_ZThn28_N3aaa9GG12131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213131E[];
Class_Descriptor cd__ZN3aaa9GG1213131E = {  "_ZN3aaa9GG1213131E", // class name
  bases__ZN3aaa9GG1213131E, 6,
  &(vtc__ZN3aaa9GG1213131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213131E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213132  : ::aaa::EE121 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12131323barEv
  ~GG1213132(); // tgen
  GG1213132(); // tgen
};
//SIG(1 _ZN3aaa9GG1213132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12131323barEv");}
aaa::GG1213132 ::~GG1213132(){ note_dtor("_ZN3aaa9GG1213132E", this);} // tgen
aaa::GG1213132 ::GG1213132(){ note_ctor("_ZN3aaa9GG1213132E", this);} // tgen
}
static void Test__ZN3aaa9GG1213132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213132E, buf);
    ::aaa::GG1213132 *dp, &lv = *(dp=new (buf) ::aaa::GG1213132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213132E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1213132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1213132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1213132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213132E);
    dp->::aaa::GG1213132::~GG1213132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213132E(Test__ZN3aaa9GG1213132E, "_ZN3aaa9GG1213132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213132C1Ev();
extern void _ZN3aaa9GG1213132D1Ev();
Name_Map name_map__ZN3aaa9GG1213132E[] = {
  NSPAIR(_ZN3aaa9GG1213132C1Ev),
  NSPAIR(_ZN3aaa9GG1213132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1213132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213132E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12131323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12131323barEv,_ZThn8_N3aaa9GG12131323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12131323barEv,_ZThn20_N3aaa9GG12131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12131323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12131323barEv,_ZThn8_N3aaa9GG12131323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131323barEv,_ZThn20_N3aaa9GG12131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213132E[];
Class_Descriptor cd__ZN3aaa9GG1213132E = {  "_ZN3aaa9GG1213132E", // class name
  bases__ZN3aaa9GG1213132E, 6,
  &(vtc__ZN3aaa9GG1213132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213133  : ::aaa::EE121 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12131333fooEv
  virtual void  bar(); // _ZN3aaa9GG12131333barEv
  ~GG1213133(); // tgen
  GG1213133(); // tgen
};
//SIG(1 _ZN3aaa9GG1213133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12131333fooEv");}
void  aaa::GG1213133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12131333barEv");}
aaa::GG1213133 ::~GG1213133(){ note_dtor("_ZN3aaa9GG1213133E", this);} // tgen
aaa::GG1213133 ::GG1213133(){ note_ctor("_ZN3aaa9GG1213133E", this);} // tgen
}
static void Test__ZN3aaa9GG1213133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213133E, buf);
    ::aaa::GG1213133 *dp, &lv = *(dp=new (buf) ::aaa::GG1213133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213133E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1213133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1213133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1213133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213133E);
    dp->::aaa::GG1213133::~GG1213133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213133E(Test__ZN3aaa9GG1213133E, "_ZN3aaa9GG1213133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213133C1Ev();
extern void _ZN3aaa9GG1213133D1Ev();
Name_Map name_map__ZN3aaa9GG1213133E[] = {
  NSPAIR(_ZN3aaa9GG1213133C1Ev),
  NSPAIR(_ZN3aaa9GG1213133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1213133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213133E[];
extern void _ZN3aaa9GG12131333fooEv();
extern void _ZN3aaa9GG12131333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12131333barEv,_ZThn8_N3aaa9GG12131333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12131333fooEv,_ZThn20_N3aaa9GG12131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12131333barEv,_ZThn20_N3aaa9GG12131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12131333fooEv,_ZThn28_N3aaa9GG12131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12131333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12131333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12131333barEv,_ZThn8_N3aaa9GG12131333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131333fooEv,_ZThn20_N3aaa9GG12131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12131333barEv,_ZThn20_N3aaa9GG12131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12131333fooEv,_ZThn28_N3aaa9GG12131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213133E[];
Class_Descriptor cd__ZN3aaa9GG1213133E = {  "_ZN3aaa9GG1213133E", // class name
  bases__ZN3aaa9GG1213133E, 6,
  &(vtc__ZN3aaa9GG1213133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213211  : ::aaa::EE121 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12132113fooEv
  ~GG1213211(); // tgen
  GG1213211(); // tgen
};
//SIG(1 _ZN3aaa9GG1213211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12132113fooEv");}
aaa::GG1213211 ::~GG1213211(){ note_dtor("_ZN3aaa9GG1213211E", this);} // tgen
aaa::GG1213211 ::GG1213211(){ note_ctor("_ZN3aaa9GG1213211E", this);} // tgen
}
static void Test__ZN3aaa9GG1213211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213211E, buf);
    ::aaa::GG1213211 *dp, &lv = *(dp=new (buf) ::aaa::GG1213211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213211E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1213211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1213211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1213211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213211E);
    dp->::aaa::GG1213211::~GG1213211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213211E(Test__ZN3aaa9GG1213211E, "_ZN3aaa9GG1213211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213211C1Ev();
extern void _ZN3aaa9GG1213211D1Ev();
Name_Map name_map__ZN3aaa9GG1213211E[] = {
  NSPAIR(_ZN3aaa9GG1213211C1Ev),
  NSPAIR(_ZN3aaa9GG1213211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1213211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213211E[];
extern void _ZN3aaa9GG12132113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12132113fooEv,_ZThn20_N3aaa9GG12132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12132113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132113fooEv,_ZThn20_N3aaa9GG12132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213211E[];
Class_Descriptor cd__ZN3aaa9GG1213211E = {  "_ZN3aaa9GG1213211E", // class name
  bases__ZN3aaa9GG1213211E, 6,
  &(vtc__ZN3aaa9GG1213211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213212  : ::aaa::EE121 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12132123barEv
  ~GG1213212(); // tgen
  GG1213212(); // tgen
};
//SIG(1 _ZN3aaa9GG1213212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12132123barEv");}
aaa::GG1213212 ::~GG1213212(){ note_dtor("_ZN3aaa9GG1213212E", this);} // tgen
aaa::GG1213212 ::GG1213212(){ note_ctor("_ZN3aaa9GG1213212E", this);} // tgen
}
static void Test__ZN3aaa9GG1213212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213212E, buf);
    ::aaa::GG1213212 *dp, &lv = *(dp=new (buf) ::aaa::GG1213212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213212E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1213212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1213212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1213212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213212E);
    dp->::aaa::GG1213212::~GG1213212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213212E(Test__ZN3aaa9GG1213212E, "_ZN3aaa9GG1213212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213212C1Ev();
extern void _ZN3aaa9GG1213212D1Ev();
Name_Map name_map__ZN3aaa9GG1213212E[] = {
  NSPAIR(_ZN3aaa9GG1213212C1Ev),
  NSPAIR(_ZN3aaa9GG1213212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1213212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213212E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12132123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12132123barEv,_ZThn8_N3aaa9GG12132123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12132123barEv,_ZThn20_N3aaa9GG12132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12132123barEv,_ZThn28_N3aaa9GG12132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12132123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12132123barEv,_ZThn8_N3aaa9GG12132123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132123barEv,_ZThn20_N3aaa9GG12132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12132123barEv,_ZThn28_N3aaa9GG12132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213212E[];
Class_Descriptor cd__ZN3aaa9GG1213212E = {  "_ZN3aaa9GG1213212E", // class name
  bases__ZN3aaa9GG1213212E, 6,
  &(vtc__ZN3aaa9GG1213212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213213  : ::aaa::EE121 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12132133fooEv
  virtual void  bar(); // _ZN3aaa9GG12132133barEv
  ~GG1213213(); // tgen
  GG1213213(); // tgen
};
//SIG(1 _ZN3aaa9GG1213213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12132133fooEv");}
void  aaa::GG1213213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12132133barEv");}
aaa::GG1213213 ::~GG1213213(){ note_dtor("_ZN3aaa9GG1213213E", this);} // tgen
aaa::GG1213213 ::GG1213213(){ note_ctor("_ZN3aaa9GG1213213E", this);} // tgen
}
static void Test__ZN3aaa9GG1213213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213213E, buf);
    ::aaa::GG1213213 *dp, &lv = *(dp=new (buf) ::aaa::GG1213213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213213E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1213213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1213213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1213213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213213E);
    dp->::aaa::GG1213213::~GG1213213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213213E(Test__ZN3aaa9GG1213213E, "_ZN3aaa9GG1213213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213213C1Ev();
extern void _ZN3aaa9GG1213213D1Ev();
Name_Map name_map__ZN3aaa9GG1213213E[] = {
  NSPAIR(_ZN3aaa9GG1213213C1Ev),
  NSPAIR(_ZN3aaa9GG1213213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1213213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213213E[];
extern void _ZN3aaa9GG12132133fooEv();
extern void _ZN3aaa9GG12132133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12132133barEv,_ZThn8_N3aaa9GG12132133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12132133fooEv,_ZThn20_N3aaa9GG12132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12132133barEv,_ZThn20_N3aaa9GG12132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12132133barEv,_ZThn28_N3aaa9GG12132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12132133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12132133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12132133barEv,_ZThn8_N3aaa9GG12132133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132133fooEv,_ZThn20_N3aaa9GG12132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132133barEv,_ZThn20_N3aaa9GG12132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12132133barEv,_ZThn28_N3aaa9GG12132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213213E[];
Class_Descriptor cd__ZN3aaa9GG1213213E = {  "_ZN3aaa9GG1213213E", // class name
  bases__ZN3aaa9GG1213213E, 6,
  &(vtc__ZN3aaa9GG1213213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213221  : ::aaa::EE121 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12132213fooEv
  ~GG1213221(); // tgen
  GG1213221(); // tgen
};
//SIG(1 _ZN3aaa9GG1213221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12132213fooEv");}
aaa::GG1213221 ::~GG1213221(){ note_dtor("_ZN3aaa9GG1213221E", this);} // tgen
aaa::GG1213221 ::GG1213221(){ note_ctor("_ZN3aaa9GG1213221E", this);} // tgen
}
static void Test__ZN3aaa9GG1213221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213221E, buf);
    ::aaa::GG1213221 *dp, &lv = *(dp=new (buf) ::aaa::GG1213221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213221E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1213221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1213221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1213221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213221E);
    dp->::aaa::GG1213221::~GG1213221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213221E(Test__ZN3aaa9GG1213221E, "_ZN3aaa9GG1213221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213221C1Ev();
extern void _ZN3aaa9GG1213221D1Ev();
Name_Map name_map__ZN3aaa9GG1213221E[] = {
  NSPAIR(_ZN3aaa9GG1213221C1Ev),
  NSPAIR(_ZN3aaa9GG1213221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1213221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213221E[];
extern void _ZN3aaa9GG12132213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12132213fooEv,_ZThn20_N3aaa9GG12132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12132213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132213fooEv,_ZThn20_N3aaa9GG12132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213221E[];
Class_Descriptor cd__ZN3aaa9GG1213221E = {  "_ZN3aaa9GG1213221E", // class name
  bases__ZN3aaa9GG1213221E, 6,
  &(vtc__ZN3aaa9GG1213221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213222  : ::aaa::EE121 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12132223barEv
  ~GG1213222(); // tgen
  GG1213222(); // tgen
};
//SIG(1 _ZN3aaa9GG1213222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12132223barEv");}
aaa::GG1213222 ::~GG1213222(){ note_dtor("_ZN3aaa9GG1213222E", this);} // tgen
aaa::GG1213222 ::GG1213222(){ note_ctor("_ZN3aaa9GG1213222E", this);} // tgen
}
static void Test__ZN3aaa9GG1213222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213222E, buf);
    ::aaa::GG1213222 *dp, &lv = *(dp=new (buf) ::aaa::GG1213222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213222E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1213222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1213222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1213222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213222E);
    dp->::aaa::GG1213222::~GG1213222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213222E(Test__ZN3aaa9GG1213222E, "_ZN3aaa9GG1213222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213222C1Ev();
extern void _ZN3aaa9GG1213222D1Ev();
Name_Map name_map__ZN3aaa9GG1213222E[] = {
  NSPAIR(_ZN3aaa9GG1213222C1Ev),
  NSPAIR(_ZN3aaa9GG1213222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1213222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213222E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12132223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12132223barEv,_ZThn8_N3aaa9GG12132223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12132223barEv,_ZThn20_N3aaa9GG12132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12132223barEv,_ZThn28_N3aaa9GG12132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12132223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12132223barEv,_ZThn8_N3aaa9GG12132223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132223barEv,_ZThn20_N3aaa9GG12132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12132223barEv,_ZThn28_N3aaa9GG12132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213222E[];
Class_Descriptor cd__ZN3aaa9GG1213222E = {  "_ZN3aaa9GG1213222E", // class name
  bases__ZN3aaa9GG1213222E, 6,
  &(vtc__ZN3aaa9GG1213222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213223  : ::aaa::EE121 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12132233fooEv
  virtual void  bar(); // _ZN3aaa9GG12132233barEv
  ~GG1213223(); // tgen
  GG1213223(); // tgen
};
//SIG(1 _ZN3aaa9GG1213223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12132233fooEv");}
void  aaa::GG1213223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12132233barEv");}
aaa::GG1213223 ::~GG1213223(){ note_dtor("_ZN3aaa9GG1213223E", this);} // tgen
aaa::GG1213223 ::GG1213223(){ note_ctor("_ZN3aaa9GG1213223E", this);} // tgen
}
static void Test__ZN3aaa9GG1213223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213223E, buf);
    ::aaa::GG1213223 *dp, &lv = *(dp=new (buf) ::aaa::GG1213223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213223E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1213223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1213223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1213223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213223E);
    dp->::aaa::GG1213223::~GG1213223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213223E(Test__ZN3aaa9GG1213223E, "_ZN3aaa9GG1213223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213223C1Ev();
extern void _ZN3aaa9GG1213223D1Ev();
Name_Map name_map__ZN3aaa9GG1213223E[] = {
  NSPAIR(_ZN3aaa9GG1213223C1Ev),
  NSPAIR(_ZN3aaa9GG1213223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1213223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213223E[];
extern void _ZN3aaa9GG12132233fooEv();
extern void _ZN3aaa9GG12132233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12132233barEv,_ZThn8_N3aaa9GG12132233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12132233fooEv,_ZThn20_N3aaa9GG12132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12132233barEv,_ZThn20_N3aaa9GG12132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12132233barEv,_ZThn28_N3aaa9GG12132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12132233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12132233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12132233barEv,_ZThn8_N3aaa9GG12132233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132233fooEv,_ZThn20_N3aaa9GG12132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132233barEv,_ZThn20_N3aaa9GG12132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12132233barEv,_ZThn28_N3aaa9GG12132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213223E[];
Class_Descriptor cd__ZN3aaa9GG1213223E = {  "_ZN3aaa9GG1213223E", // class name
  bases__ZN3aaa9GG1213223E, 6,
  &(vtc__ZN3aaa9GG1213223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213231  : ::aaa::EE121 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12132313fooEv
  ~GG1213231(); // tgen
  GG1213231(); // tgen
};
//SIG(1 _ZN3aaa9GG1213231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12132313fooEv");}
aaa::GG1213231 ::~GG1213231(){ note_dtor("_ZN3aaa9GG1213231E", this);} // tgen
aaa::GG1213231 ::GG1213231(){ note_ctor("_ZN3aaa9GG1213231E", this);} // tgen
}
static void Test__ZN3aaa9GG1213231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213231E, buf);
    ::aaa::GG1213231 *dp, &lv = *(dp=new (buf) ::aaa::GG1213231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213231E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1213231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1213231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1213231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213231E);
    dp->::aaa::GG1213231::~GG1213231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213231E(Test__ZN3aaa9GG1213231E, "_ZN3aaa9GG1213231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213231C1Ev();
extern void _ZN3aaa9GG1213231D1Ev();
Name_Map name_map__ZN3aaa9GG1213231E[] = {
  NSPAIR(_ZN3aaa9GG1213231C1Ev),
  NSPAIR(_ZN3aaa9GG1213231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1213231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213231E[];
extern void _ZN3aaa9GG12132313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12132313fooEv,_ZThn20_N3aaa9GG12132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12132313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132313fooEv,_ZThn20_N3aaa9GG12132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213231E[];
Class_Descriptor cd__ZN3aaa9GG1213231E = {  "_ZN3aaa9GG1213231E", // class name
  bases__ZN3aaa9GG1213231E, 6,
  &(vtc__ZN3aaa9GG1213231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213231E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213232  : ::aaa::EE121 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12132323barEv
  ~GG1213232(); // tgen
  GG1213232(); // tgen
};
//SIG(1 _ZN3aaa9GG1213232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12132323barEv");}
aaa::GG1213232 ::~GG1213232(){ note_dtor("_ZN3aaa9GG1213232E", this);} // tgen
aaa::GG1213232 ::GG1213232(){ note_ctor("_ZN3aaa9GG1213232E", this);} // tgen
}
static void Test__ZN3aaa9GG1213232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213232E, buf);
    ::aaa::GG1213232 *dp, &lv = *(dp=new (buf) ::aaa::GG1213232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213232E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1213232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1213232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1213232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213232E);
    dp->::aaa::GG1213232::~GG1213232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213232E(Test__ZN3aaa9GG1213232E, "_ZN3aaa9GG1213232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213232C1Ev();
extern void _ZN3aaa9GG1213232D1Ev();
Name_Map name_map__ZN3aaa9GG1213232E[] = {
  NSPAIR(_ZN3aaa9GG1213232C1Ev),
  NSPAIR(_ZN3aaa9GG1213232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1213232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213232E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12132323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12132323barEv,_ZThn8_N3aaa9GG12132323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12132323barEv,_ZThn20_N3aaa9GG12132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12132323barEv,_ZThn28_N3aaa9GG12132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12132323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12132323barEv,_ZThn8_N3aaa9GG12132323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132323barEv,_ZThn20_N3aaa9GG12132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12132323barEv,_ZThn28_N3aaa9GG12132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213232E[];
Class_Descriptor cd__ZN3aaa9GG1213232E = {  "_ZN3aaa9GG1213232E", // class name
  bases__ZN3aaa9GG1213232E, 6,
  &(vtc__ZN3aaa9GG1213232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213233  : ::aaa::EE121 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12132333fooEv
  virtual void  bar(); // _ZN3aaa9GG12132333barEv
  ~GG1213233(); // tgen
  GG1213233(); // tgen
};
//SIG(1 _ZN3aaa9GG1213233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12132333fooEv");}
void  aaa::GG1213233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12132333barEv");}
aaa::GG1213233 ::~GG1213233(){ note_dtor("_ZN3aaa9GG1213233E", this);} // tgen
aaa::GG1213233 ::GG1213233(){ note_ctor("_ZN3aaa9GG1213233E", this);} // tgen
}
static void Test__ZN3aaa9GG1213233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213233E, buf);
    ::aaa::GG1213233 *dp, &lv = *(dp=new (buf) ::aaa::GG1213233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213233E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1213233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1213233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1213233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213233E);
    dp->::aaa::GG1213233::~GG1213233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213233E(Test__ZN3aaa9GG1213233E, "_ZN3aaa9GG1213233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213233C1Ev();
extern void _ZN3aaa9GG1213233D1Ev();
Name_Map name_map__ZN3aaa9GG1213233E[] = {
  NSPAIR(_ZN3aaa9GG1213233C1Ev),
  NSPAIR(_ZN3aaa9GG1213233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1213233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213233E[];
extern void _ZN3aaa9GG12132333fooEv();
extern void _ZN3aaa9GG12132333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12132333barEv,_ZThn8_N3aaa9GG12132333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12132333fooEv,_ZThn20_N3aaa9GG12132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12132333barEv,_ZThn20_N3aaa9GG12132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12132333barEv,_ZThn28_N3aaa9GG12132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12132333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12132333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12132333barEv,_ZThn8_N3aaa9GG12132333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132333fooEv,_ZThn20_N3aaa9GG12132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12132333barEv,_ZThn20_N3aaa9GG12132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12132333barEv,_ZThn28_N3aaa9GG12132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213233E[];
Class_Descriptor cd__ZN3aaa9GG1213233E = {  "_ZN3aaa9GG1213233E", // class name
  bases__ZN3aaa9GG1213233E, 6,
  &(vtc__ZN3aaa9GG1213233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213311  : ::aaa::EE121 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12133113fooEv
  ~GG1213311(); // tgen
  GG1213311(); // tgen
};
//SIG(1 _ZN3aaa9GG1213311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12133113fooEv");}
aaa::GG1213311 ::~GG1213311(){ note_dtor("_ZN3aaa9GG1213311E", this);} // tgen
aaa::GG1213311 ::GG1213311(){ note_ctor("_ZN3aaa9GG1213311E", this);} // tgen
}
static void Test__ZN3aaa9GG1213311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213311E, buf);
    ::aaa::GG1213311 *dp, &lv = *(dp=new (buf) ::aaa::GG1213311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213311E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1213311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1213311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1213311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213311E);
    dp->::aaa::GG1213311::~GG1213311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213311E(Test__ZN3aaa9GG1213311E, "_ZN3aaa9GG1213311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213311C1Ev();
extern void _ZN3aaa9GG1213311D1Ev();
Name_Map name_map__ZN3aaa9GG1213311E[] = {
  NSPAIR(_ZN3aaa9GG1213311C1Ev),
  NSPAIR(_ZN3aaa9GG1213311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1213311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213311E[];
extern void _ZN3aaa9GG12133113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12133113fooEv,_ZThn20_N3aaa9GG12133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12133113fooEv,_ZThn28_N3aaa9GG12133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12133113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133113fooEv,_ZThn20_N3aaa9GG12133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133113fooEv,_ZThn28_N3aaa9GG12133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213311E[];
Class_Descriptor cd__ZN3aaa9GG1213311E = {  "_ZN3aaa9GG1213311E", // class name
  bases__ZN3aaa9GG1213311E, 6,
  &(vtc__ZN3aaa9GG1213311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213312  : ::aaa::EE121 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12133123barEv
  ~GG1213312(); // tgen
  GG1213312(); // tgen
};
//SIG(1 _ZN3aaa9GG1213312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12133123barEv");}
aaa::GG1213312 ::~GG1213312(){ note_dtor("_ZN3aaa9GG1213312E", this);} // tgen
aaa::GG1213312 ::GG1213312(){ note_ctor("_ZN3aaa9GG1213312E", this);} // tgen
}
static void Test__ZN3aaa9GG1213312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213312E, buf);
    ::aaa::GG1213312 *dp, &lv = *(dp=new (buf) ::aaa::GG1213312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213312E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1213312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1213312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1213312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213312E);
    dp->::aaa::GG1213312::~GG1213312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213312E(Test__ZN3aaa9GG1213312E, "_ZN3aaa9GG1213312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213312C1Ev();
extern void _ZN3aaa9GG1213312D1Ev();
Name_Map name_map__ZN3aaa9GG1213312E[] = {
  NSPAIR(_ZN3aaa9GG1213312C1Ev),
  NSPAIR(_ZN3aaa9GG1213312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1213312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213312E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12133123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12133123barEv,_ZThn8_N3aaa9GG12133123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12133123barEv,_ZThn20_N3aaa9GG12133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12133123barEv,_ZThn28_N3aaa9GG12133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12133123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12133123barEv,_ZThn8_N3aaa9GG12133123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133123barEv,_ZThn20_N3aaa9GG12133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133123barEv,_ZThn28_N3aaa9GG12133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213312E[];
Class_Descriptor cd__ZN3aaa9GG1213312E = {  "_ZN3aaa9GG1213312E", // class name
  bases__ZN3aaa9GG1213312E, 6,
  &(vtc__ZN3aaa9GG1213312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213313  : ::aaa::EE121 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12133133fooEv
  virtual void  bar(); // _ZN3aaa9GG12133133barEv
  ~GG1213313(); // tgen
  GG1213313(); // tgen
};
//SIG(1 _ZN3aaa9GG1213313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12133133fooEv");}
void  aaa::GG1213313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12133133barEv");}
aaa::GG1213313 ::~GG1213313(){ note_dtor("_ZN3aaa9GG1213313E", this);} // tgen
aaa::GG1213313 ::GG1213313(){ note_ctor("_ZN3aaa9GG1213313E", this);} // tgen
}
static void Test__ZN3aaa9GG1213313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213313E, buf);
    ::aaa::GG1213313 *dp, &lv = *(dp=new (buf) ::aaa::GG1213313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213313E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1213313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1213313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1213313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213313E);
    dp->::aaa::GG1213313::~GG1213313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213313E(Test__ZN3aaa9GG1213313E, "_ZN3aaa9GG1213313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213313C1Ev();
extern void _ZN3aaa9GG1213313D1Ev();
Name_Map name_map__ZN3aaa9GG1213313E[] = {
  NSPAIR(_ZN3aaa9GG1213313C1Ev),
  NSPAIR(_ZN3aaa9GG1213313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1213313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213313E[];
extern void _ZN3aaa9GG12133133fooEv();
extern void _ZN3aaa9GG12133133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12133133barEv,_ZThn8_N3aaa9GG12133133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12133133fooEv,_ZThn20_N3aaa9GG12133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12133133barEv,_ZThn20_N3aaa9GG12133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12133133fooEv,_ZThn28_N3aaa9GG12133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12133133barEv,_ZThn28_N3aaa9GG12133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12133133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12133133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12133133barEv,_ZThn8_N3aaa9GG12133133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133133fooEv,_ZThn20_N3aaa9GG12133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133133barEv,_ZThn20_N3aaa9GG12133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133133fooEv,_ZThn28_N3aaa9GG12133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133133barEv,_ZThn28_N3aaa9GG12133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213313E[];
Class_Descriptor cd__ZN3aaa9GG1213313E = {  "_ZN3aaa9GG1213313E", // class name
  bases__ZN3aaa9GG1213313E, 6,
  &(vtc__ZN3aaa9GG1213313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213321  : ::aaa::EE121 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12133213fooEv
  ~GG1213321(); // tgen
  GG1213321(); // tgen
};
//SIG(1 _ZN3aaa9GG1213321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12133213fooEv");}
aaa::GG1213321 ::~GG1213321(){ note_dtor("_ZN3aaa9GG1213321E", this);} // tgen
aaa::GG1213321 ::GG1213321(){ note_ctor("_ZN3aaa9GG1213321E", this);} // tgen
}
static void Test__ZN3aaa9GG1213321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213321E, buf);
    ::aaa::GG1213321 *dp, &lv = *(dp=new (buf) ::aaa::GG1213321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213321E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1213321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1213321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1213321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213321E);
    dp->::aaa::GG1213321::~GG1213321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213321E(Test__ZN3aaa9GG1213321E, "_ZN3aaa9GG1213321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213321C1Ev();
extern void _ZN3aaa9GG1213321D1Ev();
Name_Map name_map__ZN3aaa9GG1213321E[] = {
  NSPAIR(_ZN3aaa9GG1213321C1Ev),
  NSPAIR(_ZN3aaa9GG1213321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1213321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213321E[];
extern void _ZN3aaa9GG12133213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12133213fooEv,_ZThn20_N3aaa9GG12133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12133213fooEv,_ZThn28_N3aaa9GG12133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12133213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133213fooEv,_ZThn20_N3aaa9GG12133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133213fooEv,_ZThn28_N3aaa9GG12133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213321E[];
Class_Descriptor cd__ZN3aaa9GG1213321E = {  "_ZN3aaa9GG1213321E", // class name
  bases__ZN3aaa9GG1213321E, 6,
  &(vtc__ZN3aaa9GG1213321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213322  : ::aaa::EE121 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12133223barEv
  ~GG1213322(); // tgen
  GG1213322(); // tgen
};
//SIG(1 _ZN3aaa9GG1213322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12133223barEv");}
aaa::GG1213322 ::~GG1213322(){ note_dtor("_ZN3aaa9GG1213322E", this);} // tgen
aaa::GG1213322 ::GG1213322(){ note_ctor("_ZN3aaa9GG1213322E", this);} // tgen
}
static void Test__ZN3aaa9GG1213322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213322E, buf);
    ::aaa::GG1213322 *dp, &lv = *(dp=new (buf) ::aaa::GG1213322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213322E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1213322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1213322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1213322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213322E);
    dp->::aaa::GG1213322::~GG1213322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213322E(Test__ZN3aaa9GG1213322E, "_ZN3aaa9GG1213322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213322C1Ev();
extern void _ZN3aaa9GG1213322D1Ev();
Name_Map name_map__ZN3aaa9GG1213322E[] = {
  NSPAIR(_ZN3aaa9GG1213322C1Ev),
  NSPAIR(_ZN3aaa9GG1213322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1213322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213322E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12133223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12133223barEv,_ZThn8_N3aaa9GG12133223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12133223barEv,_ZThn20_N3aaa9GG12133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12133223barEv,_ZThn28_N3aaa9GG12133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12133223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12133223barEv,_ZThn8_N3aaa9GG12133223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133223barEv,_ZThn20_N3aaa9GG12133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133223barEv,_ZThn28_N3aaa9GG12133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213322E[];
Class_Descriptor cd__ZN3aaa9GG1213322E = {  "_ZN3aaa9GG1213322E", // class name
  bases__ZN3aaa9GG1213322E, 6,
  &(vtc__ZN3aaa9GG1213322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213323  : ::aaa::EE121 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12133233fooEv
  virtual void  bar(); // _ZN3aaa9GG12133233barEv
  ~GG1213323(); // tgen
  GG1213323(); // tgen
};
//SIG(1 _ZN3aaa9GG1213323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12133233fooEv");}
void  aaa::GG1213323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12133233barEv");}
aaa::GG1213323 ::~GG1213323(){ note_dtor("_ZN3aaa9GG1213323E", this);} // tgen
aaa::GG1213323 ::GG1213323(){ note_ctor("_ZN3aaa9GG1213323E", this);} // tgen
}
static void Test__ZN3aaa9GG1213323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213323E, buf);
    ::aaa::GG1213323 *dp, &lv = *(dp=new (buf) ::aaa::GG1213323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213323E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1213323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1213323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1213323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213323E);
    dp->::aaa::GG1213323::~GG1213323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213323E(Test__ZN3aaa9GG1213323E, "_ZN3aaa9GG1213323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213323C1Ev();
extern void _ZN3aaa9GG1213323D1Ev();
Name_Map name_map__ZN3aaa9GG1213323E[] = {
  NSPAIR(_ZN3aaa9GG1213323C1Ev),
  NSPAIR(_ZN3aaa9GG1213323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1213323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213323E[];
extern void _ZN3aaa9GG12133233fooEv();
extern void _ZN3aaa9GG12133233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12133233barEv,_ZThn8_N3aaa9GG12133233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12133233fooEv,_ZThn20_N3aaa9GG12133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12133233barEv,_ZThn20_N3aaa9GG12133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12133233fooEv,_ZThn28_N3aaa9GG12133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12133233barEv,_ZThn28_N3aaa9GG12133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12133233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12133233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12133233barEv,_ZThn8_N3aaa9GG12133233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133233fooEv,_ZThn20_N3aaa9GG12133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133233barEv,_ZThn20_N3aaa9GG12133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133233fooEv,_ZThn28_N3aaa9GG12133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133233barEv,_ZThn28_N3aaa9GG12133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213323E[];
Class_Descriptor cd__ZN3aaa9GG1213323E = {  "_ZN3aaa9GG1213323E", // class name
  bases__ZN3aaa9GG1213323E, 6,
  &(vtc__ZN3aaa9GG1213323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213331  : ::aaa::EE121 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12133313fooEv
  ~GG1213331(); // tgen
  GG1213331(); // tgen
};
//SIG(1 _ZN3aaa9GG1213331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12133313fooEv");}
aaa::GG1213331 ::~GG1213331(){ note_dtor("_ZN3aaa9GG1213331E", this);} // tgen
aaa::GG1213331 ::GG1213331(){ note_ctor("_ZN3aaa9GG1213331E", this);} // tgen
}
static void Test__ZN3aaa9GG1213331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213331E, buf);
    ::aaa::GG1213331 *dp, &lv = *(dp=new (buf) ::aaa::GG1213331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213331E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1213331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1213331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1213331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213331E);
    dp->::aaa::GG1213331::~GG1213331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213331E(Test__ZN3aaa9GG1213331E, "_ZN3aaa9GG1213331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213331C1Ev();
extern void _ZN3aaa9GG1213331D1Ev();
Name_Map name_map__ZN3aaa9GG1213331E[] = {
  NSPAIR(_ZN3aaa9GG1213331C1Ev),
  NSPAIR(_ZN3aaa9GG1213331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1213331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213331E[];
extern void _ZN3aaa9GG12133313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12133313fooEv,_ZThn20_N3aaa9GG12133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12133313fooEv,_ZThn28_N3aaa9GG12133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12133313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133313fooEv,_ZThn20_N3aaa9GG12133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133313fooEv,_ZThn28_N3aaa9GG12133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213331E[];
Class_Descriptor cd__ZN3aaa9GG1213331E = {  "_ZN3aaa9GG1213331E", // class name
  bases__ZN3aaa9GG1213331E, 6,
  &(vtc__ZN3aaa9GG1213331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213331E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213332  : ::aaa::EE121 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12133323barEv
  ~GG1213332(); // tgen
  GG1213332(); // tgen
};
//SIG(1 _ZN3aaa9GG1213332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1213332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12133323barEv");}
aaa::GG1213332 ::~GG1213332(){ note_dtor("_ZN3aaa9GG1213332E", this);} // tgen
aaa::GG1213332 ::GG1213332(){ note_ctor("_ZN3aaa9GG1213332E", this);} // tgen
}
static void Test__ZN3aaa9GG1213332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213332E, buf);
    ::aaa::GG1213332 *dp, &lv = *(dp=new (buf) ::aaa::GG1213332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213332E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1213332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1213332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1213332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213332E);
    dp->::aaa::GG1213332::~GG1213332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213332E(Test__ZN3aaa9GG1213332E, "_ZN3aaa9GG1213332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213332C1Ev();
extern void _ZN3aaa9GG1213332D1Ev();
Name_Map name_map__ZN3aaa9GG1213332E[] = {
  NSPAIR(_ZN3aaa9GG1213332C1Ev),
  NSPAIR(_ZN3aaa9GG1213332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1213332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213332E[];
extern void _ZN3aaa5EE1213fooEv();
extern void _ZN3aaa9GG12133323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12133323barEv,_ZThn8_N3aaa9GG12133323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12133323barEv,_ZThn20_N3aaa9GG12133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12133323barEv,_ZThn28_N3aaa9GG12133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12133323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12133323barEv,_ZThn8_N3aaa9GG12133323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133323barEv,_ZThn20_N3aaa9GG12133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133323barEv,_ZThn28_N3aaa9GG12133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213332E[];
Class_Descriptor cd__ZN3aaa9GG1213332E = {  "_ZN3aaa9GG1213332E", // class name
  bases__ZN3aaa9GG1213332E, 6,
  &(vtc__ZN3aaa9GG1213332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1213333  : ::aaa::EE121 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12133333fooEv
  virtual void  bar(); // _ZN3aaa9GG12133333barEv
  ~GG1213333(); // tgen
  GG1213333(); // tgen
};
//SIG(1 _ZN3aaa9GG1213333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1213333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12133333fooEv");}
void  aaa::GG1213333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12133333barEv");}
aaa::GG1213333 ::~GG1213333(){ note_dtor("_ZN3aaa9GG1213333E", this);} // tgen
aaa::GG1213333 ::GG1213333(){ note_ctor("_ZN3aaa9GG1213333E", this);} // tgen
}
static void Test__ZN3aaa9GG1213333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1213333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1213333E, buf);
    ::aaa::GG1213333 *dp, &lv = *(dp=new (buf) ::aaa::GG1213333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1213333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1213333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE121*), 0, "_ZN3aaa9GG1213333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE121*), ABISELECT(16,8), "_ZN3aaa9GG1213333E");
    check_base_class_offset(lv, (::aaa::EE121*), 0, "_ZN3aaa9GG1213333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1213333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1213333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1213333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1213333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1213333E);
    dp->::aaa::GG1213333::~GG1213333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1213333E(Test__ZN3aaa9GG1213333E, "_ZN3aaa9GG1213333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1213333C1Ev();
extern void _ZN3aaa9GG1213333D1Ev();
Name_Map name_map__ZN3aaa9GG1213333E[] = {
  NSPAIR(_ZN3aaa9GG1213333C1Ev),
  NSPAIR(_ZN3aaa9GG1213333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE121E;
extern VTBL_ENTRY _ZTIN3aaa5EE121E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE121E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1213333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE121E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1213333E[];
extern void _ZN3aaa9GG12133333fooEv();
extern void _ZN3aaa9GG12133333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12133333barEv,_ZThn8_N3aaa9GG12133333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12133333fooEv,_ZThn20_N3aaa9GG12133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12133333barEv,_ZThn20_N3aaa9GG12133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12133333fooEv,_ZThn28_N3aaa9GG12133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12133333barEv,_ZThn28_N3aaa9GG12133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1213333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12133333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12133333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12133333barEv,_ZThn8_N3aaa9GG12133333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133333fooEv,_ZThn20_N3aaa9GG12133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12133333barEv,_ZThn20_N3aaa9GG12133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133333fooEv,_ZThn28_N3aaa9GG12133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12133333barEv,_ZThn28_N3aaa9GG12133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1213333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1213333E[];
Class_Descriptor cd__ZN3aaa9GG1213333E = {  "_ZN3aaa9GG1213333E", // class name
  bases__ZN3aaa9GG1213333E, 6,
  &(vtc__ZN3aaa9GG1213333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1213333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1213333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221111  : ::aaa::EE122 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12211113fooEv
  ~GG1221111(); // tgen
  GG1221111(); // tgen
};
//SIG(1 _ZN3aaa9GG1221111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12211113fooEv");}
aaa::GG1221111 ::~GG1221111(){ note_dtor("_ZN3aaa9GG1221111E", this);} // tgen
aaa::GG1221111 ::GG1221111(){ note_ctor("_ZN3aaa9GG1221111E", this);} // tgen
}
static void Test__ZN3aaa9GG1221111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221111E, buf);
    ::aaa::GG1221111 *dp, &lv = *(dp=new (buf) ::aaa::GG1221111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221111E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1221111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1221111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1221111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221111E);
    dp->::aaa::GG1221111::~GG1221111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221111E(Test__ZN3aaa9GG1221111E, "_ZN3aaa9GG1221111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221111C1Ev();
extern void _ZN3aaa9GG1221111D1Ev();
Name_Map name_map__ZN3aaa9GG1221111E[] = {
  NSPAIR(_ZN3aaa9GG1221111C1Ev),
  NSPAIR(_ZN3aaa9GG1221111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1221111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221111E[];
extern void _ZN3aaa9GG12211113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12211113fooEv,_ZThn20_N3aaa9GG12211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12211113fooEv,_ZThn28_N3aaa9GG12211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12211113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211113fooEv,_ZThn20_N3aaa9GG12211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12211113fooEv,_ZThn28_N3aaa9GG12211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221111E[];
Class_Descriptor cd__ZN3aaa9GG1221111E = {  "_ZN3aaa9GG1221111E", // class name
  bases__ZN3aaa9GG1221111E, 6,
  &(vtc__ZN3aaa9GG1221111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221112  : ::aaa::EE122 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12211123barEv
  ~GG1221112(); // tgen
  GG1221112(); // tgen
};
//SIG(1 _ZN3aaa9GG1221112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12211123barEv");}
aaa::GG1221112 ::~GG1221112(){ note_dtor("_ZN3aaa9GG1221112E", this);} // tgen
aaa::GG1221112 ::GG1221112(){ note_ctor("_ZN3aaa9GG1221112E", this);} // tgen
}
static void Test__ZN3aaa9GG1221112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221112E, buf);
    ::aaa::GG1221112 *dp, &lv = *(dp=new (buf) ::aaa::GG1221112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221112E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1221112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1221112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1221112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221112E);
    dp->::aaa::GG1221112::~GG1221112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221112E(Test__ZN3aaa9GG1221112E, "_ZN3aaa9GG1221112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221112C1Ev();
extern void _ZN3aaa9GG1221112D1Ev();
Name_Map name_map__ZN3aaa9GG1221112E[] = {
  NSPAIR(_ZN3aaa9GG1221112C1Ev),
  NSPAIR(_ZN3aaa9GG1221112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1221112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12211123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12211123barEv,_ZThn8_N3aaa9GG12211123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12211123barEv,_ZThn8_N3aaa9GG12211123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221112E[];
Class_Descriptor cd__ZN3aaa9GG1221112E = {  "_ZN3aaa9GG1221112E", // class name
  bases__ZN3aaa9GG1221112E, 6,
  &(vtc__ZN3aaa9GG1221112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221113  : ::aaa::EE122 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12211133fooEv
  virtual void  bar(); // _ZN3aaa9GG12211133barEv
  ~GG1221113(); // tgen
  GG1221113(); // tgen
};
//SIG(1 _ZN3aaa9GG1221113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12211133fooEv");}
void  aaa::GG1221113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12211133barEv");}
aaa::GG1221113 ::~GG1221113(){ note_dtor("_ZN3aaa9GG1221113E", this);} // tgen
aaa::GG1221113 ::GG1221113(){ note_ctor("_ZN3aaa9GG1221113E", this);} // tgen
}
static void Test__ZN3aaa9GG1221113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221113E, buf);
    ::aaa::GG1221113 *dp, &lv = *(dp=new (buf) ::aaa::GG1221113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221113E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1221113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1221113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1221113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221113E);
    dp->::aaa::GG1221113::~GG1221113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221113E(Test__ZN3aaa9GG1221113E, "_ZN3aaa9GG1221113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221113C1Ev();
extern void _ZN3aaa9GG1221113D1Ev();
Name_Map name_map__ZN3aaa9GG1221113E[] = {
  NSPAIR(_ZN3aaa9GG1221113C1Ev),
  NSPAIR(_ZN3aaa9GG1221113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1221113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221113E[];
extern void _ZN3aaa9GG12211133fooEv();
extern void _ZN3aaa9GG12211133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12211133barEv,_ZThn8_N3aaa9GG12211133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12211133fooEv,_ZThn20_N3aaa9GG12211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12211133fooEv,_ZThn28_N3aaa9GG12211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12211133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12211133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12211133barEv,_ZThn8_N3aaa9GG12211133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211133fooEv,_ZThn20_N3aaa9GG12211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12211133fooEv,_ZThn28_N3aaa9GG12211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221113E[];
Class_Descriptor cd__ZN3aaa9GG1221113E = {  "_ZN3aaa9GG1221113E", // class name
  bases__ZN3aaa9GG1221113E, 6,
  &(vtc__ZN3aaa9GG1221113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221121  : ::aaa::EE122 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12211213fooEv
  ~GG1221121(); // tgen
  GG1221121(); // tgen
};
//SIG(1 _ZN3aaa9GG1221121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12211213fooEv");}
aaa::GG1221121 ::~GG1221121(){ note_dtor("_ZN3aaa9GG1221121E", this);} // tgen
aaa::GG1221121 ::GG1221121(){ note_ctor("_ZN3aaa9GG1221121E", this);} // tgen
}
static void Test__ZN3aaa9GG1221121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221121E, buf);
    ::aaa::GG1221121 *dp, &lv = *(dp=new (buf) ::aaa::GG1221121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221121E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1221121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1221121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1221121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221121E);
    dp->::aaa::GG1221121::~GG1221121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221121E(Test__ZN3aaa9GG1221121E, "_ZN3aaa9GG1221121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221121C1Ev();
extern void _ZN3aaa9GG1221121D1Ev();
Name_Map name_map__ZN3aaa9GG1221121E[] = {
  NSPAIR(_ZN3aaa9GG1221121C1Ev),
  NSPAIR(_ZN3aaa9GG1221121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1221121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221121E[];
extern void _ZN3aaa9GG12211213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12211213fooEv,_ZThn20_N3aaa9GG12211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12211213fooEv,_ZThn28_N3aaa9GG12211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12211213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211213fooEv,_ZThn20_N3aaa9GG12211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12211213fooEv,_ZThn28_N3aaa9GG12211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221121E[];
Class_Descriptor cd__ZN3aaa9GG1221121E = {  "_ZN3aaa9GG1221121E", // class name
  bases__ZN3aaa9GG1221121E, 6,
  &(vtc__ZN3aaa9GG1221121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221122  : ::aaa::EE122 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12211223barEv
  ~GG1221122(); // tgen
  GG1221122(); // tgen
};
//SIG(1 _ZN3aaa9GG1221122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12211223barEv");}
aaa::GG1221122 ::~GG1221122(){ note_dtor("_ZN3aaa9GG1221122E", this);} // tgen
aaa::GG1221122 ::GG1221122(){ note_ctor("_ZN3aaa9GG1221122E", this);} // tgen
}
static void Test__ZN3aaa9GG1221122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221122E, buf);
    ::aaa::GG1221122 *dp, &lv = *(dp=new (buf) ::aaa::GG1221122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221122E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1221122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1221122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1221122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221122E);
    dp->::aaa::GG1221122::~GG1221122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221122E(Test__ZN3aaa9GG1221122E, "_ZN3aaa9GG1221122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221122C1Ev();
extern void _ZN3aaa9GG1221122D1Ev();
Name_Map name_map__ZN3aaa9GG1221122E[] = {
  NSPAIR(_ZN3aaa9GG1221122C1Ev),
  NSPAIR(_ZN3aaa9GG1221122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1221122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12211223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12211223barEv,_ZThn8_N3aaa9GG12211223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12211223barEv,_ZThn20_N3aaa9GG12211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12211223barEv,_ZThn8_N3aaa9GG12211223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211223barEv,_ZThn20_N3aaa9GG12211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221122E[];
Class_Descriptor cd__ZN3aaa9GG1221122E = {  "_ZN3aaa9GG1221122E", // class name
  bases__ZN3aaa9GG1221122E, 6,
  &(vtc__ZN3aaa9GG1221122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221123  : ::aaa::EE122 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12211233fooEv
  virtual void  bar(); // _ZN3aaa9GG12211233barEv
  ~GG1221123(); // tgen
  GG1221123(); // tgen
};
//SIG(1 _ZN3aaa9GG1221123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12211233fooEv");}
void  aaa::GG1221123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12211233barEv");}
aaa::GG1221123 ::~GG1221123(){ note_dtor("_ZN3aaa9GG1221123E", this);} // tgen
aaa::GG1221123 ::GG1221123(){ note_ctor("_ZN3aaa9GG1221123E", this);} // tgen
}
static void Test__ZN3aaa9GG1221123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221123E, buf);
    ::aaa::GG1221123 *dp, &lv = *(dp=new (buf) ::aaa::GG1221123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221123E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1221123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1221123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1221123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221123E);
    dp->::aaa::GG1221123::~GG1221123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221123E(Test__ZN3aaa9GG1221123E, "_ZN3aaa9GG1221123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221123C1Ev();
extern void _ZN3aaa9GG1221123D1Ev();
Name_Map name_map__ZN3aaa9GG1221123E[] = {
  NSPAIR(_ZN3aaa9GG1221123C1Ev),
  NSPAIR(_ZN3aaa9GG1221123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1221123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221123E[];
extern void _ZN3aaa9GG12211233fooEv();
extern void _ZN3aaa9GG12211233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12211233barEv,_ZThn8_N3aaa9GG12211233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12211233fooEv,_ZThn20_N3aaa9GG12211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12211233barEv,_ZThn20_N3aaa9GG12211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12211233fooEv,_ZThn28_N3aaa9GG12211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12211233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12211233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12211233barEv,_ZThn8_N3aaa9GG12211233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211233fooEv,_ZThn20_N3aaa9GG12211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211233barEv,_ZThn20_N3aaa9GG12211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12211233fooEv,_ZThn28_N3aaa9GG12211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221123E[];
Class_Descriptor cd__ZN3aaa9GG1221123E = {  "_ZN3aaa9GG1221123E", // class name
  bases__ZN3aaa9GG1221123E, 6,
  &(vtc__ZN3aaa9GG1221123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221131  : ::aaa::EE122 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12211313fooEv
  ~GG1221131(); // tgen
  GG1221131(); // tgen
};
//SIG(1 _ZN3aaa9GG1221131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12211313fooEv");}
aaa::GG1221131 ::~GG1221131(){ note_dtor("_ZN3aaa9GG1221131E", this);} // tgen
aaa::GG1221131 ::GG1221131(){ note_ctor("_ZN3aaa9GG1221131E", this);} // tgen
}
static void Test__ZN3aaa9GG1221131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221131E, buf);
    ::aaa::GG1221131 *dp, &lv = *(dp=new (buf) ::aaa::GG1221131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221131E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1221131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1221131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1221131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221131E);
    dp->::aaa::GG1221131::~GG1221131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221131E(Test__ZN3aaa9GG1221131E, "_ZN3aaa9GG1221131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221131C1Ev();
extern void _ZN3aaa9GG1221131D1Ev();
Name_Map name_map__ZN3aaa9GG1221131E[] = {
  NSPAIR(_ZN3aaa9GG1221131C1Ev),
  NSPAIR(_ZN3aaa9GG1221131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1221131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221131E[];
extern void _ZN3aaa9GG12211313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12211313fooEv,_ZThn20_N3aaa9GG12211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12211313fooEv,_ZThn28_N3aaa9GG12211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12211313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211313fooEv,_ZThn20_N3aaa9GG12211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12211313fooEv,_ZThn28_N3aaa9GG12211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221131E[];
Class_Descriptor cd__ZN3aaa9GG1221131E = {  "_ZN3aaa9GG1221131E", // class name
  bases__ZN3aaa9GG1221131E, 6,
  &(vtc__ZN3aaa9GG1221131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221132  : ::aaa::EE122 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12211323barEv
  ~GG1221132(); // tgen
  GG1221132(); // tgen
};
//SIG(1 _ZN3aaa9GG1221132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12211323barEv");}
aaa::GG1221132 ::~GG1221132(){ note_dtor("_ZN3aaa9GG1221132E", this);} // tgen
aaa::GG1221132 ::GG1221132(){ note_ctor("_ZN3aaa9GG1221132E", this);} // tgen
}
static void Test__ZN3aaa9GG1221132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221132E, buf);
    ::aaa::GG1221132 *dp, &lv = *(dp=new (buf) ::aaa::GG1221132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221132E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1221132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1221132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1221132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221132E);
    dp->::aaa::GG1221132::~GG1221132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221132E(Test__ZN3aaa9GG1221132E, "_ZN3aaa9GG1221132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221132C1Ev();
extern void _ZN3aaa9GG1221132D1Ev();
Name_Map name_map__ZN3aaa9GG1221132E[] = {
  NSPAIR(_ZN3aaa9GG1221132C1Ev),
  NSPAIR(_ZN3aaa9GG1221132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1221132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12211323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12211323barEv,_ZThn8_N3aaa9GG12211323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12211323barEv,_ZThn20_N3aaa9GG12211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12211323barEv,_ZThn8_N3aaa9GG12211323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211323barEv,_ZThn20_N3aaa9GG12211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221132E[];
Class_Descriptor cd__ZN3aaa9GG1221132E = {  "_ZN3aaa9GG1221132E", // class name
  bases__ZN3aaa9GG1221132E, 6,
  &(vtc__ZN3aaa9GG1221132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221133  : ::aaa::EE122 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12211333fooEv
  virtual void  bar(); // _ZN3aaa9GG12211333barEv
  ~GG1221133(); // tgen
  GG1221133(); // tgen
};
//SIG(1 _ZN3aaa9GG1221133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12211333fooEv");}
void  aaa::GG1221133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12211333barEv");}
aaa::GG1221133 ::~GG1221133(){ note_dtor("_ZN3aaa9GG1221133E", this);} // tgen
aaa::GG1221133 ::GG1221133(){ note_ctor("_ZN3aaa9GG1221133E", this);} // tgen
}
static void Test__ZN3aaa9GG1221133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221133E, buf);
    ::aaa::GG1221133 *dp, &lv = *(dp=new (buf) ::aaa::GG1221133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221133E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1221133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1221133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1221133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221133E);
    dp->::aaa::GG1221133::~GG1221133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221133E(Test__ZN3aaa9GG1221133E, "_ZN3aaa9GG1221133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221133C1Ev();
extern void _ZN3aaa9GG1221133D1Ev();
Name_Map name_map__ZN3aaa9GG1221133E[] = {
  NSPAIR(_ZN3aaa9GG1221133C1Ev),
  NSPAIR(_ZN3aaa9GG1221133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1221133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221133E[];
extern void _ZN3aaa9GG12211333fooEv();
extern void _ZN3aaa9GG12211333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12211333barEv,_ZThn8_N3aaa9GG12211333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12211333fooEv,_ZThn20_N3aaa9GG12211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12211333barEv,_ZThn20_N3aaa9GG12211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12211333fooEv,_ZThn28_N3aaa9GG12211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12211333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12211333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12211333barEv,_ZThn8_N3aaa9GG12211333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211333fooEv,_ZThn20_N3aaa9GG12211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12211333barEv,_ZThn20_N3aaa9GG12211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12211333fooEv,_ZThn28_N3aaa9GG12211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221133E[];
Class_Descriptor cd__ZN3aaa9GG1221133E = {  "_ZN3aaa9GG1221133E", // class name
  bases__ZN3aaa9GG1221133E, 6,
  &(vtc__ZN3aaa9GG1221133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221211  : ::aaa::EE122 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12212113fooEv
  ~GG1221211(); // tgen
  GG1221211(); // tgen
};
//SIG(1 _ZN3aaa9GG1221211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12212113fooEv");}
aaa::GG1221211 ::~GG1221211(){ note_dtor("_ZN3aaa9GG1221211E", this);} // tgen
aaa::GG1221211 ::GG1221211(){ note_ctor("_ZN3aaa9GG1221211E", this);} // tgen
}
static void Test__ZN3aaa9GG1221211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221211E, buf);
    ::aaa::GG1221211 *dp, &lv = *(dp=new (buf) ::aaa::GG1221211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221211E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1221211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1221211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1221211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221211E);
    dp->::aaa::GG1221211::~GG1221211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221211E(Test__ZN3aaa9GG1221211E, "_ZN3aaa9GG1221211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221211C1Ev();
extern void _ZN3aaa9GG1221211D1Ev();
Name_Map name_map__ZN3aaa9GG1221211E[] = {
  NSPAIR(_ZN3aaa9GG1221211C1Ev),
  NSPAIR(_ZN3aaa9GG1221211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1221211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221211E[];
extern void _ZN3aaa9GG12212113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12212113fooEv,_ZThn20_N3aaa9GG12212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12212113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212113fooEv,_ZThn20_N3aaa9GG12212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221211E[];
Class_Descriptor cd__ZN3aaa9GG1221211E = {  "_ZN3aaa9GG1221211E", // class name
  bases__ZN3aaa9GG1221211E, 6,
  &(vtc__ZN3aaa9GG1221211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221212  : ::aaa::EE122 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12212123barEv
  ~GG1221212(); // tgen
  GG1221212(); // tgen
};
//SIG(1 _ZN3aaa9GG1221212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12212123barEv");}
aaa::GG1221212 ::~GG1221212(){ note_dtor("_ZN3aaa9GG1221212E", this);} // tgen
aaa::GG1221212 ::GG1221212(){ note_ctor("_ZN3aaa9GG1221212E", this);} // tgen
}
static void Test__ZN3aaa9GG1221212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221212E, buf);
    ::aaa::GG1221212 *dp, &lv = *(dp=new (buf) ::aaa::GG1221212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221212E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1221212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1221212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1221212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221212E);
    dp->::aaa::GG1221212::~GG1221212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221212E(Test__ZN3aaa9GG1221212E, "_ZN3aaa9GG1221212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221212C1Ev();
extern void _ZN3aaa9GG1221212D1Ev();
Name_Map name_map__ZN3aaa9GG1221212E[] = {
  NSPAIR(_ZN3aaa9GG1221212C1Ev),
  NSPAIR(_ZN3aaa9GG1221212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1221212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12212123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12212123barEv,_ZThn8_N3aaa9GG12212123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12212123barEv,_ZThn28_N3aaa9GG12212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12212123barEv,_ZThn8_N3aaa9GG12212123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12212123barEv,_ZThn28_N3aaa9GG12212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221212E[];
Class_Descriptor cd__ZN3aaa9GG1221212E = {  "_ZN3aaa9GG1221212E", // class name
  bases__ZN3aaa9GG1221212E, 6,
  &(vtc__ZN3aaa9GG1221212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221213  : ::aaa::EE122 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12212133fooEv
  virtual void  bar(); // _ZN3aaa9GG12212133barEv
  ~GG1221213(); // tgen
  GG1221213(); // tgen
};
//SIG(1 _ZN3aaa9GG1221213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12212133fooEv");}
void  aaa::GG1221213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12212133barEv");}
aaa::GG1221213 ::~GG1221213(){ note_dtor("_ZN3aaa9GG1221213E", this);} // tgen
aaa::GG1221213 ::GG1221213(){ note_ctor("_ZN3aaa9GG1221213E", this);} // tgen
}
static void Test__ZN3aaa9GG1221213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221213E, buf);
    ::aaa::GG1221213 *dp, &lv = *(dp=new (buf) ::aaa::GG1221213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221213E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1221213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1221213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1221213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221213E);
    dp->::aaa::GG1221213::~GG1221213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221213E(Test__ZN3aaa9GG1221213E, "_ZN3aaa9GG1221213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221213C1Ev();
extern void _ZN3aaa9GG1221213D1Ev();
Name_Map name_map__ZN3aaa9GG1221213E[] = {
  NSPAIR(_ZN3aaa9GG1221213C1Ev),
  NSPAIR(_ZN3aaa9GG1221213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1221213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221213E[];
extern void _ZN3aaa9GG12212133fooEv();
extern void _ZN3aaa9GG12212133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12212133barEv,_ZThn8_N3aaa9GG12212133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12212133fooEv,_ZThn20_N3aaa9GG12212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12212133barEv,_ZThn28_N3aaa9GG12212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12212133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12212133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12212133barEv,_ZThn8_N3aaa9GG12212133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212133fooEv,_ZThn20_N3aaa9GG12212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12212133barEv,_ZThn28_N3aaa9GG12212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221213E[];
Class_Descriptor cd__ZN3aaa9GG1221213E = {  "_ZN3aaa9GG1221213E", // class name
  bases__ZN3aaa9GG1221213E, 6,
  &(vtc__ZN3aaa9GG1221213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221221  : ::aaa::EE122 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12212213fooEv
  ~GG1221221(); // tgen
  GG1221221(); // tgen
};
//SIG(1 _ZN3aaa9GG1221221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12212213fooEv");}
aaa::GG1221221 ::~GG1221221(){ note_dtor("_ZN3aaa9GG1221221E", this);} // tgen
aaa::GG1221221 ::GG1221221(){ note_ctor("_ZN3aaa9GG1221221E", this);} // tgen
}
static void Test__ZN3aaa9GG1221221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221221E, buf);
    ::aaa::GG1221221 *dp, &lv = *(dp=new (buf) ::aaa::GG1221221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221221E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1221221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1221221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1221221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221221E);
    dp->::aaa::GG1221221::~GG1221221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221221E(Test__ZN3aaa9GG1221221E, "_ZN3aaa9GG1221221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221221C1Ev();
extern void _ZN3aaa9GG1221221D1Ev();
Name_Map name_map__ZN3aaa9GG1221221E[] = {
  NSPAIR(_ZN3aaa9GG1221221C1Ev),
  NSPAIR(_ZN3aaa9GG1221221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1221221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221221E[];
extern void _ZN3aaa9GG12212213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12212213fooEv,_ZThn20_N3aaa9GG12212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12212213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212213fooEv,_ZThn20_N3aaa9GG12212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221221E[];
Class_Descriptor cd__ZN3aaa9GG1221221E = {  "_ZN3aaa9GG1221221E", // class name
  bases__ZN3aaa9GG1221221E, 6,
  &(vtc__ZN3aaa9GG1221221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221222  : ::aaa::EE122 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12212223barEv
  ~GG1221222(); // tgen
  GG1221222(); // tgen
};
//SIG(1 _ZN3aaa9GG1221222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12212223barEv");}
aaa::GG1221222 ::~GG1221222(){ note_dtor("_ZN3aaa9GG1221222E", this);} // tgen
aaa::GG1221222 ::GG1221222(){ note_ctor("_ZN3aaa9GG1221222E", this);} // tgen
}
static void Test__ZN3aaa9GG1221222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221222E, buf);
    ::aaa::GG1221222 *dp, &lv = *(dp=new (buf) ::aaa::GG1221222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221222E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1221222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1221222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1221222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221222E);
    dp->::aaa::GG1221222::~GG1221222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221222E(Test__ZN3aaa9GG1221222E, "_ZN3aaa9GG1221222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221222C1Ev();
extern void _ZN3aaa9GG1221222D1Ev();
Name_Map name_map__ZN3aaa9GG1221222E[] = {
  NSPAIR(_ZN3aaa9GG1221222C1Ev),
  NSPAIR(_ZN3aaa9GG1221222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1221222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12212223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12212223barEv,_ZThn8_N3aaa9GG12212223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12212223barEv,_ZThn20_N3aaa9GG12212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12212223barEv,_ZThn28_N3aaa9GG12212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12212223barEv,_ZThn8_N3aaa9GG12212223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212223barEv,_ZThn20_N3aaa9GG12212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12212223barEv,_ZThn28_N3aaa9GG12212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221222E[];
Class_Descriptor cd__ZN3aaa9GG1221222E = {  "_ZN3aaa9GG1221222E", // class name
  bases__ZN3aaa9GG1221222E, 6,
  &(vtc__ZN3aaa9GG1221222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221223  : ::aaa::EE122 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12212233fooEv
  virtual void  bar(); // _ZN3aaa9GG12212233barEv
  ~GG1221223(); // tgen
  GG1221223(); // tgen
};
//SIG(1 _ZN3aaa9GG1221223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12212233fooEv");}
void  aaa::GG1221223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12212233barEv");}
aaa::GG1221223 ::~GG1221223(){ note_dtor("_ZN3aaa9GG1221223E", this);} // tgen
aaa::GG1221223 ::GG1221223(){ note_ctor("_ZN3aaa9GG1221223E", this);} // tgen
}
static void Test__ZN3aaa9GG1221223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221223E, buf);
    ::aaa::GG1221223 *dp, &lv = *(dp=new (buf) ::aaa::GG1221223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221223E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1221223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1221223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1221223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221223E);
    dp->::aaa::GG1221223::~GG1221223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221223E(Test__ZN3aaa9GG1221223E, "_ZN3aaa9GG1221223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221223C1Ev();
extern void _ZN3aaa9GG1221223D1Ev();
Name_Map name_map__ZN3aaa9GG1221223E[] = {
  NSPAIR(_ZN3aaa9GG1221223C1Ev),
  NSPAIR(_ZN3aaa9GG1221223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1221223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221223E[];
extern void _ZN3aaa9GG12212233fooEv();
extern void _ZN3aaa9GG12212233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12212233barEv,_ZThn8_N3aaa9GG12212233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12212233fooEv,_ZThn20_N3aaa9GG12212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12212233barEv,_ZThn20_N3aaa9GG12212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12212233barEv,_ZThn28_N3aaa9GG12212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12212233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12212233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12212233barEv,_ZThn8_N3aaa9GG12212233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212233fooEv,_ZThn20_N3aaa9GG12212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212233barEv,_ZThn20_N3aaa9GG12212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12212233barEv,_ZThn28_N3aaa9GG12212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221223E[];
Class_Descriptor cd__ZN3aaa9GG1221223E = {  "_ZN3aaa9GG1221223E", // class name
  bases__ZN3aaa9GG1221223E, 6,
  &(vtc__ZN3aaa9GG1221223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221231  : ::aaa::EE122 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12212313fooEv
  ~GG1221231(); // tgen
  GG1221231(); // tgen
};
//SIG(1 _ZN3aaa9GG1221231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12212313fooEv");}
aaa::GG1221231 ::~GG1221231(){ note_dtor("_ZN3aaa9GG1221231E", this);} // tgen
aaa::GG1221231 ::GG1221231(){ note_ctor("_ZN3aaa9GG1221231E", this);} // tgen
}
static void Test__ZN3aaa9GG1221231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221231E, buf);
    ::aaa::GG1221231 *dp, &lv = *(dp=new (buf) ::aaa::GG1221231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221231E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1221231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1221231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1221231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221231E);
    dp->::aaa::GG1221231::~GG1221231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221231E(Test__ZN3aaa9GG1221231E, "_ZN3aaa9GG1221231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221231C1Ev();
extern void _ZN3aaa9GG1221231D1Ev();
Name_Map name_map__ZN3aaa9GG1221231E[] = {
  NSPAIR(_ZN3aaa9GG1221231C1Ev),
  NSPAIR(_ZN3aaa9GG1221231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1221231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221231E[];
extern void _ZN3aaa9GG12212313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12212313fooEv,_ZThn20_N3aaa9GG12212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12212313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212313fooEv,_ZThn20_N3aaa9GG12212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221231E[];
Class_Descriptor cd__ZN3aaa9GG1221231E = {  "_ZN3aaa9GG1221231E", // class name
  bases__ZN3aaa9GG1221231E, 6,
  &(vtc__ZN3aaa9GG1221231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221232  : ::aaa::EE122 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12212323barEv
  ~GG1221232(); // tgen
  GG1221232(); // tgen
};
//SIG(1 _ZN3aaa9GG1221232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12212323barEv");}
aaa::GG1221232 ::~GG1221232(){ note_dtor("_ZN3aaa9GG1221232E", this);} // tgen
aaa::GG1221232 ::GG1221232(){ note_ctor("_ZN3aaa9GG1221232E", this);} // tgen
}
static void Test__ZN3aaa9GG1221232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221232E, buf);
    ::aaa::GG1221232 *dp, &lv = *(dp=new (buf) ::aaa::GG1221232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221232E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1221232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1221232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1221232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221232E);
    dp->::aaa::GG1221232::~GG1221232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221232E(Test__ZN3aaa9GG1221232E, "_ZN3aaa9GG1221232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221232C1Ev();
extern void _ZN3aaa9GG1221232D1Ev();
Name_Map name_map__ZN3aaa9GG1221232E[] = {
  NSPAIR(_ZN3aaa9GG1221232C1Ev),
  NSPAIR(_ZN3aaa9GG1221232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1221232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12212323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12212323barEv,_ZThn8_N3aaa9GG12212323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12212323barEv,_ZThn20_N3aaa9GG12212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12212323barEv,_ZThn28_N3aaa9GG12212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12212323barEv,_ZThn8_N3aaa9GG12212323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212323barEv,_ZThn20_N3aaa9GG12212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12212323barEv,_ZThn28_N3aaa9GG12212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221232E[];
Class_Descriptor cd__ZN3aaa9GG1221232E = {  "_ZN3aaa9GG1221232E", // class name
  bases__ZN3aaa9GG1221232E, 6,
  &(vtc__ZN3aaa9GG1221232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221233  : ::aaa::EE122 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12212333fooEv
  virtual void  bar(); // _ZN3aaa9GG12212333barEv
  ~GG1221233(); // tgen
  GG1221233(); // tgen
};
//SIG(1 _ZN3aaa9GG1221233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12212333fooEv");}
void  aaa::GG1221233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12212333barEv");}
aaa::GG1221233 ::~GG1221233(){ note_dtor("_ZN3aaa9GG1221233E", this);} // tgen
aaa::GG1221233 ::GG1221233(){ note_ctor("_ZN3aaa9GG1221233E", this);} // tgen
}
static void Test__ZN3aaa9GG1221233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221233E, buf);
    ::aaa::GG1221233 *dp, &lv = *(dp=new (buf) ::aaa::GG1221233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221233E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1221233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1221233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1221233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221233E);
    dp->::aaa::GG1221233::~GG1221233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221233E(Test__ZN3aaa9GG1221233E, "_ZN3aaa9GG1221233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221233C1Ev();
extern void _ZN3aaa9GG1221233D1Ev();
Name_Map name_map__ZN3aaa9GG1221233E[] = {
  NSPAIR(_ZN3aaa9GG1221233C1Ev),
  NSPAIR(_ZN3aaa9GG1221233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1221233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221233E[];
extern void _ZN3aaa9GG12212333fooEv();
extern void _ZN3aaa9GG12212333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12212333barEv,_ZThn8_N3aaa9GG12212333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12212333fooEv,_ZThn20_N3aaa9GG12212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12212333barEv,_ZThn20_N3aaa9GG12212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12212333barEv,_ZThn28_N3aaa9GG12212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12212333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12212333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12212333barEv,_ZThn8_N3aaa9GG12212333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212333fooEv,_ZThn20_N3aaa9GG12212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12212333barEv,_ZThn20_N3aaa9GG12212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12212333barEv,_ZThn28_N3aaa9GG12212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221233E[];
Class_Descriptor cd__ZN3aaa9GG1221233E = {  "_ZN3aaa9GG1221233E", // class name
  bases__ZN3aaa9GG1221233E, 6,
  &(vtc__ZN3aaa9GG1221233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221311  : ::aaa::EE122 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12213113fooEv
  ~GG1221311(); // tgen
  GG1221311(); // tgen
};
//SIG(1 _ZN3aaa9GG1221311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12213113fooEv");}
aaa::GG1221311 ::~GG1221311(){ note_dtor("_ZN3aaa9GG1221311E", this);} // tgen
aaa::GG1221311 ::GG1221311(){ note_ctor("_ZN3aaa9GG1221311E", this);} // tgen
}
static void Test__ZN3aaa9GG1221311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221311E, buf);
    ::aaa::GG1221311 *dp, &lv = *(dp=new (buf) ::aaa::GG1221311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221311E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1221311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1221311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1221311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221311E);
    dp->::aaa::GG1221311::~GG1221311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221311E(Test__ZN3aaa9GG1221311E, "_ZN3aaa9GG1221311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221311C1Ev();
extern void _ZN3aaa9GG1221311D1Ev();
Name_Map name_map__ZN3aaa9GG1221311E[] = {
  NSPAIR(_ZN3aaa9GG1221311C1Ev),
  NSPAIR(_ZN3aaa9GG1221311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1221311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221311E[];
extern void _ZN3aaa9GG12213113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12213113fooEv,_ZThn20_N3aaa9GG12213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213113fooEv,_ZThn28_N3aaa9GG12213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12213113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213113fooEv,_ZThn20_N3aaa9GG12213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213113fooEv,_ZThn28_N3aaa9GG12213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221311E[];
Class_Descriptor cd__ZN3aaa9GG1221311E = {  "_ZN3aaa9GG1221311E", // class name
  bases__ZN3aaa9GG1221311E, 6,
  &(vtc__ZN3aaa9GG1221311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221312  : ::aaa::EE122 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12213123barEv
  ~GG1221312(); // tgen
  GG1221312(); // tgen
};
//SIG(1 _ZN3aaa9GG1221312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12213123barEv");}
aaa::GG1221312 ::~GG1221312(){ note_dtor("_ZN3aaa9GG1221312E", this);} // tgen
aaa::GG1221312 ::GG1221312(){ note_ctor("_ZN3aaa9GG1221312E", this);} // tgen
}
static void Test__ZN3aaa9GG1221312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221312E, buf);
    ::aaa::GG1221312 *dp, &lv = *(dp=new (buf) ::aaa::GG1221312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221312E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1221312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1221312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1221312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221312E);
    dp->::aaa::GG1221312::~GG1221312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221312E(Test__ZN3aaa9GG1221312E, "_ZN3aaa9GG1221312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221312C1Ev();
extern void _ZN3aaa9GG1221312D1Ev();
Name_Map name_map__ZN3aaa9GG1221312E[] = {
  NSPAIR(_ZN3aaa9GG1221312C1Ev),
  NSPAIR(_ZN3aaa9GG1221312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1221312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12213123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12213123barEv,_ZThn8_N3aaa9GG12213123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213123barEv,_ZThn28_N3aaa9GG12213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12213123barEv,_ZThn8_N3aaa9GG12213123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213123barEv,_ZThn28_N3aaa9GG12213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221312E[];
Class_Descriptor cd__ZN3aaa9GG1221312E = {  "_ZN3aaa9GG1221312E", // class name
  bases__ZN3aaa9GG1221312E, 6,
  &(vtc__ZN3aaa9GG1221312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221313  : ::aaa::EE122 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12213133fooEv
  virtual void  bar(); // _ZN3aaa9GG12213133barEv
  ~GG1221313(); // tgen
  GG1221313(); // tgen
};
//SIG(1 _ZN3aaa9GG1221313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12213133fooEv");}
void  aaa::GG1221313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12213133barEv");}
aaa::GG1221313 ::~GG1221313(){ note_dtor("_ZN3aaa9GG1221313E", this);} // tgen
aaa::GG1221313 ::GG1221313(){ note_ctor("_ZN3aaa9GG1221313E", this);} // tgen
}
static void Test__ZN3aaa9GG1221313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221313E, buf);
    ::aaa::GG1221313 *dp, &lv = *(dp=new (buf) ::aaa::GG1221313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221313E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1221313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1221313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1221313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221313E);
    dp->::aaa::GG1221313::~GG1221313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221313E(Test__ZN3aaa9GG1221313E, "_ZN3aaa9GG1221313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221313C1Ev();
extern void _ZN3aaa9GG1221313D1Ev();
Name_Map name_map__ZN3aaa9GG1221313E[] = {
  NSPAIR(_ZN3aaa9GG1221313C1Ev),
  NSPAIR(_ZN3aaa9GG1221313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1221313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221313E[];
extern void _ZN3aaa9GG12213133fooEv();
extern void _ZN3aaa9GG12213133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12213133barEv,_ZThn8_N3aaa9GG12213133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12213133fooEv,_ZThn20_N3aaa9GG12213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213133fooEv,_ZThn28_N3aaa9GG12213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213133barEv,_ZThn28_N3aaa9GG12213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12213133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12213133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12213133barEv,_ZThn8_N3aaa9GG12213133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213133fooEv,_ZThn20_N3aaa9GG12213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213133fooEv,_ZThn28_N3aaa9GG12213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213133barEv,_ZThn28_N3aaa9GG12213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221313E[];
Class_Descriptor cd__ZN3aaa9GG1221313E = {  "_ZN3aaa9GG1221313E", // class name
  bases__ZN3aaa9GG1221313E, 6,
  &(vtc__ZN3aaa9GG1221313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221321  : ::aaa::EE122 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12213213fooEv
  ~GG1221321(); // tgen
  GG1221321(); // tgen
};
//SIG(1 _ZN3aaa9GG1221321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12213213fooEv");}
aaa::GG1221321 ::~GG1221321(){ note_dtor("_ZN3aaa9GG1221321E", this);} // tgen
aaa::GG1221321 ::GG1221321(){ note_ctor("_ZN3aaa9GG1221321E", this);} // tgen
}
static void Test__ZN3aaa9GG1221321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221321E, buf);
    ::aaa::GG1221321 *dp, &lv = *(dp=new (buf) ::aaa::GG1221321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221321E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1221321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1221321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1221321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221321E);
    dp->::aaa::GG1221321::~GG1221321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221321E(Test__ZN3aaa9GG1221321E, "_ZN3aaa9GG1221321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221321C1Ev();
extern void _ZN3aaa9GG1221321D1Ev();
Name_Map name_map__ZN3aaa9GG1221321E[] = {
  NSPAIR(_ZN3aaa9GG1221321C1Ev),
  NSPAIR(_ZN3aaa9GG1221321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1221321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221321E[];
extern void _ZN3aaa9GG12213213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12213213fooEv,_ZThn20_N3aaa9GG12213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12213213fooEv,_ZThn28_N3aaa9GG12213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12213213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213213fooEv,_ZThn20_N3aaa9GG12213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213213fooEv,_ZThn28_N3aaa9GG12213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221321E[];
Class_Descriptor cd__ZN3aaa9GG1221321E = {  "_ZN3aaa9GG1221321E", // class name
  bases__ZN3aaa9GG1221321E, 6,
  &(vtc__ZN3aaa9GG1221321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221322  : ::aaa::EE122 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12213223barEv
  ~GG1221322(); // tgen
  GG1221322(); // tgen
};
//SIG(1 _ZN3aaa9GG1221322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12213223barEv");}
aaa::GG1221322 ::~GG1221322(){ note_dtor("_ZN3aaa9GG1221322E", this);} // tgen
aaa::GG1221322 ::GG1221322(){ note_ctor("_ZN3aaa9GG1221322E", this);} // tgen
}
static void Test__ZN3aaa9GG1221322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221322E, buf);
    ::aaa::GG1221322 *dp, &lv = *(dp=new (buf) ::aaa::GG1221322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221322E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1221322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1221322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1221322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221322E);
    dp->::aaa::GG1221322::~GG1221322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221322E(Test__ZN3aaa9GG1221322E, "_ZN3aaa9GG1221322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221322C1Ev();
extern void _ZN3aaa9GG1221322D1Ev();
Name_Map name_map__ZN3aaa9GG1221322E[] = {
  NSPAIR(_ZN3aaa9GG1221322C1Ev),
  NSPAIR(_ZN3aaa9GG1221322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1221322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12213223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12213223barEv,_ZThn8_N3aaa9GG12213223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12213223barEv,_ZThn20_N3aaa9GG12213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12213223barEv,_ZThn28_N3aaa9GG12213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12213223barEv,_ZThn8_N3aaa9GG12213223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213223barEv,_ZThn20_N3aaa9GG12213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213223barEv,_ZThn28_N3aaa9GG12213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221322E[];
Class_Descriptor cd__ZN3aaa9GG1221322E = {  "_ZN3aaa9GG1221322E", // class name
  bases__ZN3aaa9GG1221322E, 6,
  &(vtc__ZN3aaa9GG1221322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221323  : ::aaa::EE122 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12213233fooEv
  virtual void  bar(); // _ZN3aaa9GG12213233barEv
  ~GG1221323(); // tgen
  GG1221323(); // tgen
};
//SIG(1 _ZN3aaa9GG1221323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12213233fooEv");}
void  aaa::GG1221323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12213233barEv");}
aaa::GG1221323 ::~GG1221323(){ note_dtor("_ZN3aaa9GG1221323E", this);} // tgen
aaa::GG1221323 ::GG1221323(){ note_ctor("_ZN3aaa9GG1221323E", this);} // tgen
}
static void Test__ZN3aaa9GG1221323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221323E, buf);
    ::aaa::GG1221323 *dp, &lv = *(dp=new (buf) ::aaa::GG1221323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221323E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1221323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1221323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1221323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221323E);
    dp->::aaa::GG1221323::~GG1221323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221323E(Test__ZN3aaa9GG1221323E, "_ZN3aaa9GG1221323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221323C1Ev();
extern void _ZN3aaa9GG1221323D1Ev();
Name_Map name_map__ZN3aaa9GG1221323E[] = {
  NSPAIR(_ZN3aaa9GG1221323C1Ev),
  NSPAIR(_ZN3aaa9GG1221323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1221323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221323E[];
extern void _ZN3aaa9GG12213233fooEv();
extern void _ZN3aaa9GG12213233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12213233barEv,_ZThn8_N3aaa9GG12213233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12213233fooEv,_ZThn20_N3aaa9GG12213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12213233barEv,_ZThn20_N3aaa9GG12213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213233fooEv,_ZThn28_N3aaa9GG12213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213233barEv,_ZThn28_N3aaa9GG12213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12213233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12213233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12213233barEv,_ZThn8_N3aaa9GG12213233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213233fooEv,_ZThn20_N3aaa9GG12213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213233barEv,_ZThn20_N3aaa9GG12213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213233fooEv,_ZThn28_N3aaa9GG12213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213233barEv,_ZThn28_N3aaa9GG12213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221323E[];
Class_Descriptor cd__ZN3aaa9GG1221323E = {  "_ZN3aaa9GG1221323E", // class name
  bases__ZN3aaa9GG1221323E, 6,
  &(vtc__ZN3aaa9GG1221323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221331  : ::aaa::EE122 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12213313fooEv
  ~GG1221331(); // tgen
  GG1221331(); // tgen
};
//SIG(1 _ZN3aaa9GG1221331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12213313fooEv");}
aaa::GG1221331 ::~GG1221331(){ note_dtor("_ZN3aaa9GG1221331E", this);} // tgen
aaa::GG1221331 ::GG1221331(){ note_ctor("_ZN3aaa9GG1221331E", this);} // tgen
}
static void Test__ZN3aaa9GG1221331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221331E, buf);
    ::aaa::GG1221331 *dp, &lv = *(dp=new (buf) ::aaa::GG1221331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221331E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1221331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1221331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1221331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221331E);
    dp->::aaa::GG1221331::~GG1221331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221331E(Test__ZN3aaa9GG1221331E, "_ZN3aaa9GG1221331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221331C1Ev();
extern void _ZN3aaa9GG1221331D1Ev();
Name_Map name_map__ZN3aaa9GG1221331E[] = {
  NSPAIR(_ZN3aaa9GG1221331C1Ev),
  NSPAIR(_ZN3aaa9GG1221331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1221331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221331E[];
extern void _ZN3aaa9GG12213313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12213313fooEv,_ZThn20_N3aaa9GG12213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12213313fooEv,_ZThn28_N3aaa9GG12213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12213313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213313fooEv,_ZThn20_N3aaa9GG12213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213313fooEv,_ZThn28_N3aaa9GG12213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221331E[];
Class_Descriptor cd__ZN3aaa9GG1221331E = {  "_ZN3aaa9GG1221331E", // class name
  bases__ZN3aaa9GG1221331E, 6,
  &(vtc__ZN3aaa9GG1221331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221332  : ::aaa::EE122 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12213323barEv
  ~GG1221332(); // tgen
  GG1221332(); // tgen
};
//SIG(1 _ZN3aaa9GG1221332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1221332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12213323barEv");}
aaa::GG1221332 ::~GG1221332(){ note_dtor("_ZN3aaa9GG1221332E", this);} // tgen
aaa::GG1221332 ::GG1221332(){ note_ctor("_ZN3aaa9GG1221332E", this);} // tgen
}
static void Test__ZN3aaa9GG1221332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221332E, buf);
    ::aaa::GG1221332 *dp, &lv = *(dp=new (buf) ::aaa::GG1221332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221332E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1221332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1221332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1221332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221332E);
    dp->::aaa::GG1221332::~GG1221332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221332E(Test__ZN3aaa9GG1221332E, "_ZN3aaa9GG1221332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221332C1Ev();
extern void _ZN3aaa9GG1221332D1Ev();
Name_Map name_map__ZN3aaa9GG1221332E[] = {
  NSPAIR(_ZN3aaa9GG1221332C1Ev),
  NSPAIR(_ZN3aaa9GG1221332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1221332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12213323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12213323barEv,_ZThn8_N3aaa9GG12213323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12213323barEv,_ZThn20_N3aaa9GG12213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213323barEv,_ZThn28_N3aaa9GG12213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12213323barEv,_ZThn8_N3aaa9GG12213323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213323barEv,_ZThn20_N3aaa9GG12213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213323barEv,_ZThn28_N3aaa9GG12213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221332E[];
Class_Descriptor cd__ZN3aaa9GG1221332E = {  "_ZN3aaa9GG1221332E", // class name
  bases__ZN3aaa9GG1221332E, 6,
  &(vtc__ZN3aaa9GG1221332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1221333  : ::aaa::EE122 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12213333fooEv
  virtual void  bar(); // _ZN3aaa9GG12213333barEv
  ~GG1221333(); // tgen
  GG1221333(); // tgen
};
//SIG(1 _ZN3aaa9GG1221333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1221333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12213333fooEv");}
void  aaa::GG1221333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12213333barEv");}
aaa::GG1221333 ::~GG1221333(){ note_dtor("_ZN3aaa9GG1221333E", this);} // tgen
aaa::GG1221333 ::GG1221333(){ note_ctor("_ZN3aaa9GG1221333E", this);} // tgen
}
static void Test__ZN3aaa9GG1221333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1221333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1221333E, buf);
    ::aaa::GG1221333 *dp, &lv = *(dp=new (buf) ::aaa::GG1221333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1221333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1221333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1221333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1221333E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1221333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1221333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1221333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1221333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1221333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1221333E);
    dp->::aaa::GG1221333::~GG1221333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1221333E(Test__ZN3aaa9GG1221333E, "_ZN3aaa9GG1221333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1221333C1Ev();
extern void _ZN3aaa9GG1221333D1Ev();
Name_Map name_map__ZN3aaa9GG1221333E[] = {
  NSPAIR(_ZN3aaa9GG1221333C1Ev),
  NSPAIR(_ZN3aaa9GG1221333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1221333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1221333E[];
extern void _ZN3aaa9GG12213333fooEv();
extern void _ZN3aaa9GG12213333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12213333barEv,_ZThn8_N3aaa9GG12213333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12213333fooEv,_ZThn20_N3aaa9GG12213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12213333barEv,_ZThn20_N3aaa9GG12213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213333fooEv,_ZThn28_N3aaa9GG12213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12213333barEv,_ZThn28_N3aaa9GG12213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1221333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12213333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12213333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12213333barEv,_ZThn8_N3aaa9GG12213333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213333fooEv,_ZThn20_N3aaa9GG12213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12213333barEv,_ZThn20_N3aaa9GG12213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213333fooEv,_ZThn28_N3aaa9GG12213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12213333barEv,_ZThn28_N3aaa9GG12213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1221333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1221333E[];
Class_Descriptor cd__ZN3aaa9GG1221333E = {  "_ZN3aaa9GG1221333E", // class name
  bases__ZN3aaa9GG1221333E, 6,
  &(vtc__ZN3aaa9GG1221333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1221333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1221333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222111  : ::aaa::EE122 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12221113fooEv
  ~GG1222111(); // tgen
  GG1222111(); // tgen
};
//SIG(1 _ZN3aaa9GG1222111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12221113fooEv");}
aaa::GG1222111 ::~GG1222111(){ note_dtor("_ZN3aaa9GG1222111E", this);} // tgen
aaa::GG1222111 ::GG1222111(){ note_ctor("_ZN3aaa9GG1222111E", this);} // tgen
}
static void Test__ZN3aaa9GG1222111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222111E, buf);
    ::aaa::GG1222111 *dp, &lv = *(dp=new (buf) ::aaa::GG1222111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222111E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1222111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1222111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1222111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222111E);
    dp->::aaa::GG1222111::~GG1222111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222111E(Test__ZN3aaa9GG1222111E, "_ZN3aaa9GG1222111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222111C1Ev();
extern void _ZN3aaa9GG1222111D1Ev();
Name_Map name_map__ZN3aaa9GG1222111E[] = {
  NSPAIR(_ZN3aaa9GG1222111C1Ev),
  NSPAIR(_ZN3aaa9GG1222111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1222111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222111E[];
extern void _ZN3aaa9GG12221113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12221113fooEv,_ZThn20_N3aaa9GG12221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12221113fooEv,_ZThn28_N3aaa9GG12221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12221113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221113fooEv,_ZThn20_N3aaa9GG12221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12221113fooEv,_ZThn28_N3aaa9GG12221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222111E[];
Class_Descriptor cd__ZN3aaa9GG1222111E = {  "_ZN3aaa9GG1222111E", // class name
  bases__ZN3aaa9GG1222111E, 6,
  &(vtc__ZN3aaa9GG1222111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222112  : ::aaa::EE122 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12221123barEv
  ~GG1222112(); // tgen
  GG1222112(); // tgen
};
//SIG(1 _ZN3aaa9GG1222112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12221123barEv");}
aaa::GG1222112 ::~GG1222112(){ note_dtor("_ZN3aaa9GG1222112E", this);} // tgen
aaa::GG1222112 ::GG1222112(){ note_ctor("_ZN3aaa9GG1222112E", this);} // tgen
}
static void Test__ZN3aaa9GG1222112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222112E, buf);
    ::aaa::GG1222112 *dp, &lv = *(dp=new (buf) ::aaa::GG1222112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222112E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1222112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1222112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1222112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222112E);
    dp->::aaa::GG1222112::~GG1222112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222112E(Test__ZN3aaa9GG1222112E, "_ZN3aaa9GG1222112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222112C1Ev();
extern void _ZN3aaa9GG1222112D1Ev();
Name_Map name_map__ZN3aaa9GG1222112E[] = {
  NSPAIR(_ZN3aaa9GG1222112C1Ev),
  NSPAIR(_ZN3aaa9GG1222112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1222112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12221123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12221123barEv,_ZThn8_N3aaa9GG12221123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12221123barEv,_ZThn20_N3aaa9GG12221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12221123barEv,_ZThn8_N3aaa9GG12221123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221123barEv,_ZThn20_N3aaa9GG12221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222112E[];
Class_Descriptor cd__ZN3aaa9GG1222112E = {  "_ZN3aaa9GG1222112E", // class name
  bases__ZN3aaa9GG1222112E, 6,
  &(vtc__ZN3aaa9GG1222112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222113  : ::aaa::EE122 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12221133fooEv
  virtual void  bar(); // _ZN3aaa9GG12221133barEv
  ~GG1222113(); // tgen
  GG1222113(); // tgen
};
//SIG(1 _ZN3aaa9GG1222113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12221133fooEv");}
void  aaa::GG1222113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12221133barEv");}
aaa::GG1222113 ::~GG1222113(){ note_dtor("_ZN3aaa9GG1222113E", this);} // tgen
aaa::GG1222113 ::GG1222113(){ note_ctor("_ZN3aaa9GG1222113E", this);} // tgen
}
static void Test__ZN3aaa9GG1222113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222113E, buf);
    ::aaa::GG1222113 *dp, &lv = *(dp=new (buf) ::aaa::GG1222113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222113E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1222113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1222113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1222113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222113E);
    dp->::aaa::GG1222113::~GG1222113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222113E(Test__ZN3aaa9GG1222113E, "_ZN3aaa9GG1222113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222113C1Ev();
extern void _ZN3aaa9GG1222113D1Ev();
Name_Map name_map__ZN3aaa9GG1222113E[] = {
  NSPAIR(_ZN3aaa9GG1222113C1Ev),
  NSPAIR(_ZN3aaa9GG1222113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1222113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222113E[];
extern void _ZN3aaa9GG12221133fooEv();
extern void _ZN3aaa9GG12221133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12221133barEv,_ZThn8_N3aaa9GG12221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12221133barEv,_ZThn20_N3aaa9GG12221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12221133fooEv,_ZThn20_N3aaa9GG12221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12221133fooEv,_ZThn28_N3aaa9GG12221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12221133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12221133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12221133barEv,_ZThn8_N3aaa9GG12221133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221133barEv,_ZThn20_N3aaa9GG12221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221133fooEv,_ZThn20_N3aaa9GG12221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12221133fooEv,_ZThn28_N3aaa9GG12221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222113E[];
Class_Descriptor cd__ZN3aaa9GG1222113E = {  "_ZN3aaa9GG1222113E", // class name
  bases__ZN3aaa9GG1222113E, 6,
  &(vtc__ZN3aaa9GG1222113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222121  : ::aaa::EE122 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12221213fooEv
  ~GG1222121(); // tgen
  GG1222121(); // tgen
};
//SIG(1 _ZN3aaa9GG1222121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12221213fooEv");}
aaa::GG1222121 ::~GG1222121(){ note_dtor("_ZN3aaa9GG1222121E", this);} // tgen
aaa::GG1222121 ::GG1222121(){ note_ctor("_ZN3aaa9GG1222121E", this);} // tgen
}
static void Test__ZN3aaa9GG1222121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222121E, buf);
    ::aaa::GG1222121 *dp, &lv = *(dp=new (buf) ::aaa::GG1222121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222121E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1222121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1222121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1222121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222121E);
    dp->::aaa::GG1222121::~GG1222121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222121E(Test__ZN3aaa9GG1222121E, "_ZN3aaa9GG1222121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222121C1Ev();
extern void _ZN3aaa9GG1222121D1Ev();
Name_Map name_map__ZN3aaa9GG1222121E[] = {
  NSPAIR(_ZN3aaa9GG1222121C1Ev),
  NSPAIR(_ZN3aaa9GG1222121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1222121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222121E[];
extern void _ZN3aaa9GG12221213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12221213fooEv,_ZThn28_N3aaa9GG12221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12221213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12221213fooEv,_ZThn28_N3aaa9GG12221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222121E[];
Class_Descriptor cd__ZN3aaa9GG1222121E = {  "_ZN3aaa9GG1222121E", // class name
  bases__ZN3aaa9GG1222121E, 6,
  &(vtc__ZN3aaa9GG1222121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222122  : ::aaa::EE122 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12221223barEv
  ~GG1222122(); // tgen
  GG1222122(); // tgen
};
//SIG(1 _ZN3aaa9GG1222122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12221223barEv");}
aaa::GG1222122 ::~GG1222122(){ note_dtor("_ZN3aaa9GG1222122E", this);} // tgen
aaa::GG1222122 ::GG1222122(){ note_ctor("_ZN3aaa9GG1222122E", this);} // tgen
}
static void Test__ZN3aaa9GG1222122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222122E, buf);
    ::aaa::GG1222122 *dp, &lv = *(dp=new (buf) ::aaa::GG1222122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222122E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1222122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1222122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1222122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222122E);
    dp->::aaa::GG1222122::~GG1222122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222122E(Test__ZN3aaa9GG1222122E, "_ZN3aaa9GG1222122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222122C1Ev();
extern void _ZN3aaa9GG1222122D1Ev();
Name_Map name_map__ZN3aaa9GG1222122E[] = {
  NSPAIR(_ZN3aaa9GG1222122C1Ev),
  NSPAIR(_ZN3aaa9GG1222122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1222122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12221223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12221223barEv,_ZThn8_N3aaa9GG12221223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12221223barEv,_ZThn20_N3aaa9GG12221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12221223barEv,_ZThn8_N3aaa9GG12221223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221223barEv,_ZThn20_N3aaa9GG12221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222122E[];
Class_Descriptor cd__ZN3aaa9GG1222122E = {  "_ZN3aaa9GG1222122E", // class name
  bases__ZN3aaa9GG1222122E, 6,
  &(vtc__ZN3aaa9GG1222122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222123  : ::aaa::EE122 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12221233fooEv
  virtual void  bar(); // _ZN3aaa9GG12221233barEv
  ~GG1222123(); // tgen
  GG1222123(); // tgen
};
//SIG(1 _ZN3aaa9GG1222123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12221233fooEv");}
void  aaa::GG1222123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12221233barEv");}
aaa::GG1222123 ::~GG1222123(){ note_dtor("_ZN3aaa9GG1222123E", this);} // tgen
aaa::GG1222123 ::GG1222123(){ note_ctor("_ZN3aaa9GG1222123E", this);} // tgen
}
static void Test__ZN3aaa9GG1222123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222123E, buf);
    ::aaa::GG1222123 *dp, &lv = *(dp=new (buf) ::aaa::GG1222123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222123E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1222123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1222123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1222123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222123E);
    dp->::aaa::GG1222123::~GG1222123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222123E(Test__ZN3aaa9GG1222123E, "_ZN3aaa9GG1222123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222123C1Ev();
extern void _ZN3aaa9GG1222123D1Ev();
Name_Map name_map__ZN3aaa9GG1222123E[] = {
  NSPAIR(_ZN3aaa9GG1222123C1Ev),
  NSPAIR(_ZN3aaa9GG1222123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1222123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222123E[];
extern void _ZN3aaa9GG12221233fooEv();
extern void _ZN3aaa9GG12221233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12221233barEv,_ZThn8_N3aaa9GG12221233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12221233barEv,_ZThn20_N3aaa9GG12221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12221233fooEv,_ZThn28_N3aaa9GG12221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12221233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12221233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12221233barEv,_ZThn8_N3aaa9GG12221233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221233barEv,_ZThn20_N3aaa9GG12221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12221233fooEv,_ZThn28_N3aaa9GG12221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222123E[];
Class_Descriptor cd__ZN3aaa9GG1222123E = {  "_ZN3aaa9GG1222123E", // class name
  bases__ZN3aaa9GG1222123E, 6,
  &(vtc__ZN3aaa9GG1222123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222131  : ::aaa::EE122 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12221313fooEv
  ~GG1222131(); // tgen
  GG1222131(); // tgen
};
//SIG(1 _ZN3aaa9GG1222131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12221313fooEv");}
aaa::GG1222131 ::~GG1222131(){ note_dtor("_ZN3aaa9GG1222131E", this);} // tgen
aaa::GG1222131 ::GG1222131(){ note_ctor("_ZN3aaa9GG1222131E", this);} // tgen
}
static void Test__ZN3aaa9GG1222131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222131E, buf);
    ::aaa::GG1222131 *dp, &lv = *(dp=new (buf) ::aaa::GG1222131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222131E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1222131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1222131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1222131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222131E);
    dp->::aaa::GG1222131::~GG1222131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222131E(Test__ZN3aaa9GG1222131E, "_ZN3aaa9GG1222131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222131C1Ev();
extern void _ZN3aaa9GG1222131D1Ev();
Name_Map name_map__ZN3aaa9GG1222131E[] = {
  NSPAIR(_ZN3aaa9GG1222131C1Ev),
  NSPAIR(_ZN3aaa9GG1222131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1222131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222131E[];
extern void _ZN3aaa9GG12221313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12221313fooEv,_ZThn20_N3aaa9GG12221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12221313fooEv,_ZThn28_N3aaa9GG12221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12221313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221313fooEv,_ZThn20_N3aaa9GG12221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12221313fooEv,_ZThn28_N3aaa9GG12221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222131E[];
Class_Descriptor cd__ZN3aaa9GG1222131E = {  "_ZN3aaa9GG1222131E", // class name
  bases__ZN3aaa9GG1222131E, 6,
  &(vtc__ZN3aaa9GG1222131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222132  : ::aaa::EE122 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12221323barEv
  ~GG1222132(); // tgen
  GG1222132(); // tgen
};
//SIG(1 _ZN3aaa9GG1222132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12221323barEv");}
aaa::GG1222132 ::~GG1222132(){ note_dtor("_ZN3aaa9GG1222132E", this);} // tgen
aaa::GG1222132 ::GG1222132(){ note_ctor("_ZN3aaa9GG1222132E", this);} // tgen
}
static void Test__ZN3aaa9GG1222132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222132E, buf);
    ::aaa::GG1222132 *dp, &lv = *(dp=new (buf) ::aaa::GG1222132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222132E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1222132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1222132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1222132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222132E);
    dp->::aaa::GG1222132::~GG1222132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222132E(Test__ZN3aaa9GG1222132E, "_ZN3aaa9GG1222132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222132C1Ev();
extern void _ZN3aaa9GG1222132D1Ev();
Name_Map name_map__ZN3aaa9GG1222132E[] = {
  NSPAIR(_ZN3aaa9GG1222132C1Ev),
  NSPAIR(_ZN3aaa9GG1222132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1222132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12221323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12221323barEv,_ZThn8_N3aaa9GG12221323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12221323barEv,_ZThn20_N3aaa9GG12221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12221323barEv,_ZThn8_N3aaa9GG12221323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221323barEv,_ZThn20_N3aaa9GG12221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222132E[];
Class_Descriptor cd__ZN3aaa9GG1222132E = {  "_ZN3aaa9GG1222132E", // class name
  bases__ZN3aaa9GG1222132E, 6,
  &(vtc__ZN3aaa9GG1222132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222133  : ::aaa::EE122 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12221333fooEv
  virtual void  bar(); // _ZN3aaa9GG12221333barEv
  ~GG1222133(); // tgen
  GG1222133(); // tgen
};
//SIG(1 _ZN3aaa9GG1222133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12221333fooEv");}
void  aaa::GG1222133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12221333barEv");}
aaa::GG1222133 ::~GG1222133(){ note_dtor("_ZN3aaa9GG1222133E", this);} // tgen
aaa::GG1222133 ::GG1222133(){ note_ctor("_ZN3aaa9GG1222133E", this);} // tgen
}
static void Test__ZN3aaa9GG1222133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222133E, buf);
    ::aaa::GG1222133 *dp, &lv = *(dp=new (buf) ::aaa::GG1222133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222133E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1222133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1222133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1222133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222133E);
    dp->::aaa::GG1222133::~GG1222133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222133E(Test__ZN3aaa9GG1222133E, "_ZN3aaa9GG1222133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222133C1Ev();
extern void _ZN3aaa9GG1222133D1Ev();
Name_Map name_map__ZN3aaa9GG1222133E[] = {
  NSPAIR(_ZN3aaa9GG1222133C1Ev),
  NSPAIR(_ZN3aaa9GG1222133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1222133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222133E[];
extern void _ZN3aaa9GG12221333fooEv();
extern void _ZN3aaa9GG12221333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12221333barEv,_ZThn8_N3aaa9GG12221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12221333barEv,_ZThn20_N3aaa9GG12221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12221333fooEv,_ZThn20_N3aaa9GG12221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12221333fooEv,_ZThn28_N3aaa9GG12221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12221333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12221333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12221333barEv,_ZThn8_N3aaa9GG12221333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221333barEv,_ZThn20_N3aaa9GG12221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12221333fooEv,_ZThn20_N3aaa9GG12221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12221333fooEv,_ZThn28_N3aaa9GG12221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222133E[];
Class_Descriptor cd__ZN3aaa9GG1222133E = {  "_ZN3aaa9GG1222133E", // class name
  bases__ZN3aaa9GG1222133E, 6,
  &(vtc__ZN3aaa9GG1222133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222211  : ::aaa::EE122 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12222113fooEv
  ~GG1222211(); // tgen
  GG1222211(); // tgen
};
//SIG(1 _ZN3aaa9GG1222211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12222113fooEv");}
aaa::GG1222211 ::~GG1222211(){ note_dtor("_ZN3aaa9GG1222211E", this);} // tgen
aaa::GG1222211 ::GG1222211(){ note_ctor("_ZN3aaa9GG1222211E", this);} // tgen
}
static void Test__ZN3aaa9GG1222211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222211E, buf);
    ::aaa::GG1222211 *dp, &lv = *(dp=new (buf) ::aaa::GG1222211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222211E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1222211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1222211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1222211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222211E);
    dp->::aaa::GG1222211::~GG1222211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222211E(Test__ZN3aaa9GG1222211E, "_ZN3aaa9GG1222211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222211C1Ev();
extern void _ZN3aaa9GG1222211D1Ev();
Name_Map name_map__ZN3aaa9GG1222211E[] = {
  NSPAIR(_ZN3aaa9GG1222211C1Ev),
  NSPAIR(_ZN3aaa9GG1222211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1222211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222211E[];
extern void _ZN3aaa9GG12222113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12222113fooEv,_ZThn20_N3aaa9GG12222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12222113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222113fooEv,_ZThn20_N3aaa9GG12222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222211E[];
Class_Descriptor cd__ZN3aaa9GG1222211E = {  "_ZN3aaa9GG1222211E", // class name
  bases__ZN3aaa9GG1222211E, 6,
  &(vtc__ZN3aaa9GG1222211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222212  : ::aaa::EE122 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12222123barEv
  ~GG1222212(); // tgen
  GG1222212(); // tgen
};
//SIG(1 _ZN3aaa9GG1222212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12222123barEv");}
aaa::GG1222212 ::~GG1222212(){ note_dtor("_ZN3aaa9GG1222212E", this);} // tgen
aaa::GG1222212 ::GG1222212(){ note_ctor("_ZN3aaa9GG1222212E", this);} // tgen
}
static void Test__ZN3aaa9GG1222212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222212E, buf);
    ::aaa::GG1222212 *dp, &lv = *(dp=new (buf) ::aaa::GG1222212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222212E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1222212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1222212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1222212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222212E);
    dp->::aaa::GG1222212::~GG1222212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222212E(Test__ZN3aaa9GG1222212E, "_ZN3aaa9GG1222212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222212C1Ev();
extern void _ZN3aaa9GG1222212D1Ev();
Name_Map name_map__ZN3aaa9GG1222212E[] = {
  NSPAIR(_ZN3aaa9GG1222212C1Ev),
  NSPAIR(_ZN3aaa9GG1222212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1222212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12222123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12222123barEv,_ZThn8_N3aaa9GG12222123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12222123barEv,_ZThn20_N3aaa9GG12222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12222123barEv,_ZThn28_N3aaa9GG12222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12222123barEv,_ZThn8_N3aaa9GG12222123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222123barEv,_ZThn20_N3aaa9GG12222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12222123barEv,_ZThn28_N3aaa9GG12222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222212E[];
Class_Descriptor cd__ZN3aaa9GG1222212E = {  "_ZN3aaa9GG1222212E", // class name
  bases__ZN3aaa9GG1222212E, 6,
  &(vtc__ZN3aaa9GG1222212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222213  : ::aaa::EE122 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12222133fooEv
  virtual void  bar(); // _ZN3aaa9GG12222133barEv
  ~GG1222213(); // tgen
  GG1222213(); // tgen
};
//SIG(1 _ZN3aaa9GG1222213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12222133fooEv");}
void  aaa::GG1222213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12222133barEv");}
aaa::GG1222213 ::~GG1222213(){ note_dtor("_ZN3aaa9GG1222213E", this);} // tgen
aaa::GG1222213 ::GG1222213(){ note_ctor("_ZN3aaa9GG1222213E", this);} // tgen
}
static void Test__ZN3aaa9GG1222213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222213E, buf);
    ::aaa::GG1222213 *dp, &lv = *(dp=new (buf) ::aaa::GG1222213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222213E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1222213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1222213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1222213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222213E);
    dp->::aaa::GG1222213::~GG1222213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222213E(Test__ZN3aaa9GG1222213E, "_ZN3aaa9GG1222213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222213C1Ev();
extern void _ZN3aaa9GG1222213D1Ev();
Name_Map name_map__ZN3aaa9GG1222213E[] = {
  NSPAIR(_ZN3aaa9GG1222213C1Ev),
  NSPAIR(_ZN3aaa9GG1222213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1222213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222213E[];
extern void _ZN3aaa9GG12222133fooEv();
extern void _ZN3aaa9GG12222133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12222133barEv,_ZThn8_N3aaa9GG12222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12222133barEv,_ZThn20_N3aaa9GG12222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12222133fooEv,_ZThn20_N3aaa9GG12222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12222133barEv,_ZThn28_N3aaa9GG12222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12222133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12222133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12222133barEv,_ZThn8_N3aaa9GG12222133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222133barEv,_ZThn20_N3aaa9GG12222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222133fooEv,_ZThn20_N3aaa9GG12222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12222133barEv,_ZThn28_N3aaa9GG12222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222213E[];
Class_Descriptor cd__ZN3aaa9GG1222213E = {  "_ZN3aaa9GG1222213E", // class name
  bases__ZN3aaa9GG1222213E, 6,
  &(vtc__ZN3aaa9GG1222213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222221  : ::aaa::EE122 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12222213fooEv
  ~GG1222221(); // tgen
  GG1222221(); // tgen
};
//SIG(1 _ZN3aaa9GG1222221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12222213fooEv");}
aaa::GG1222221 ::~GG1222221(){ note_dtor("_ZN3aaa9GG1222221E", this);} // tgen
aaa::GG1222221 ::GG1222221(){ note_ctor("_ZN3aaa9GG1222221E", this);} // tgen
}
static void Test__ZN3aaa9GG1222221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222221E, buf);
    ::aaa::GG1222221 *dp, &lv = *(dp=new (buf) ::aaa::GG1222221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222221E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1222221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1222221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1222221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222221E);
    dp->::aaa::GG1222221::~GG1222221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222221E(Test__ZN3aaa9GG1222221E, "_ZN3aaa9GG1222221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222221C1Ev();
extern void _ZN3aaa9GG1222221D1Ev();
Name_Map name_map__ZN3aaa9GG1222221E[] = {
  NSPAIR(_ZN3aaa9GG1222221C1Ev),
  NSPAIR(_ZN3aaa9GG1222221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1222221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222221E[];
extern void _ZN3aaa9GG12222213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12222213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222221E[];
Class_Descriptor cd__ZN3aaa9GG1222221E = {  "_ZN3aaa9GG1222221E", // class name
  bases__ZN3aaa9GG1222221E, 6,
  &(vtc__ZN3aaa9GG1222221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222222  : ::aaa::EE122 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12222223barEv
  ~GG1222222(); // tgen
  GG1222222(); // tgen
};
//SIG(1 _ZN3aaa9GG1222222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12222223barEv");}
aaa::GG1222222 ::~GG1222222(){ note_dtor("_ZN3aaa9GG1222222E", this);} // tgen
aaa::GG1222222 ::GG1222222(){ note_ctor("_ZN3aaa9GG1222222E", this);} // tgen
}
static void Test__ZN3aaa9GG1222222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222222E, buf);
    ::aaa::GG1222222 *dp, &lv = *(dp=new (buf) ::aaa::GG1222222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222222E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1222222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1222222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1222222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222222E);
    dp->::aaa::GG1222222::~GG1222222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222222E(Test__ZN3aaa9GG1222222E, "_ZN3aaa9GG1222222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222222C1Ev();
extern void _ZN3aaa9GG1222222D1Ev();
Name_Map name_map__ZN3aaa9GG1222222E[] = {
  NSPAIR(_ZN3aaa9GG1222222C1Ev),
  NSPAIR(_ZN3aaa9GG1222222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1222222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12222223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12222223barEv,_ZThn8_N3aaa9GG12222223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12222223barEv,_ZThn20_N3aaa9GG12222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12222223barEv,_ZThn28_N3aaa9GG12222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12222223barEv,_ZThn8_N3aaa9GG12222223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222223barEv,_ZThn20_N3aaa9GG12222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12222223barEv,_ZThn28_N3aaa9GG12222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222222E[];
Class_Descriptor cd__ZN3aaa9GG1222222E = {  "_ZN3aaa9GG1222222E", // class name
  bases__ZN3aaa9GG1222222E, 6,
  &(vtc__ZN3aaa9GG1222222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222223  : ::aaa::EE122 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12222233fooEv
  virtual void  bar(); // _ZN3aaa9GG12222233barEv
  ~GG1222223(); // tgen
  GG1222223(); // tgen
};
//SIG(1 _ZN3aaa9GG1222223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12222233fooEv");}
void  aaa::GG1222223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12222233barEv");}
aaa::GG1222223 ::~GG1222223(){ note_dtor("_ZN3aaa9GG1222223E", this);} // tgen
aaa::GG1222223 ::GG1222223(){ note_ctor("_ZN3aaa9GG1222223E", this);} // tgen
}
static void Test__ZN3aaa9GG1222223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222223E, buf);
    ::aaa::GG1222223 *dp, &lv = *(dp=new (buf) ::aaa::GG1222223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222223E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1222223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1222223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1222223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222223E);
    dp->::aaa::GG1222223::~GG1222223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222223E(Test__ZN3aaa9GG1222223E, "_ZN3aaa9GG1222223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222223C1Ev();
extern void _ZN3aaa9GG1222223D1Ev();
Name_Map name_map__ZN3aaa9GG1222223E[] = {
  NSPAIR(_ZN3aaa9GG1222223C1Ev),
  NSPAIR(_ZN3aaa9GG1222223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1222223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222223E[];
extern void _ZN3aaa9GG12222233fooEv();
extern void _ZN3aaa9GG12222233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12222233barEv,_ZThn8_N3aaa9GG12222233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12222233barEv,_ZThn20_N3aaa9GG12222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12222233barEv,_ZThn28_N3aaa9GG12222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12222233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12222233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12222233barEv,_ZThn8_N3aaa9GG12222233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222233barEv,_ZThn20_N3aaa9GG12222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12222233barEv,_ZThn28_N3aaa9GG12222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222223E[];
Class_Descriptor cd__ZN3aaa9GG1222223E = {  "_ZN3aaa9GG1222223E", // class name
  bases__ZN3aaa9GG1222223E, 6,
  &(vtc__ZN3aaa9GG1222223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222231  : ::aaa::EE122 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12222313fooEv
  ~GG1222231(); // tgen
  GG1222231(); // tgen
};
//SIG(1 _ZN3aaa9GG1222231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12222313fooEv");}
aaa::GG1222231 ::~GG1222231(){ note_dtor("_ZN3aaa9GG1222231E", this);} // tgen
aaa::GG1222231 ::GG1222231(){ note_ctor("_ZN3aaa9GG1222231E", this);} // tgen
}
static void Test__ZN3aaa9GG1222231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222231E, buf);
    ::aaa::GG1222231 *dp, &lv = *(dp=new (buf) ::aaa::GG1222231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222231E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1222231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1222231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1222231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222231E);
    dp->::aaa::GG1222231::~GG1222231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222231E(Test__ZN3aaa9GG1222231E, "_ZN3aaa9GG1222231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222231C1Ev();
extern void _ZN3aaa9GG1222231D1Ev();
Name_Map name_map__ZN3aaa9GG1222231E[] = {
  NSPAIR(_ZN3aaa9GG1222231C1Ev),
  NSPAIR(_ZN3aaa9GG1222231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1222231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222231E[];
extern void _ZN3aaa9GG12222313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12222313fooEv,_ZThn20_N3aaa9GG12222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12222313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222313fooEv,_ZThn20_N3aaa9GG12222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222231E[];
Class_Descriptor cd__ZN3aaa9GG1222231E = {  "_ZN3aaa9GG1222231E", // class name
  bases__ZN3aaa9GG1222231E, 6,
  &(vtc__ZN3aaa9GG1222231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222232  : ::aaa::EE122 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12222323barEv
  ~GG1222232(); // tgen
  GG1222232(); // tgen
};
//SIG(1 _ZN3aaa9GG1222232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12222323barEv");}
aaa::GG1222232 ::~GG1222232(){ note_dtor("_ZN3aaa9GG1222232E", this);} // tgen
aaa::GG1222232 ::GG1222232(){ note_ctor("_ZN3aaa9GG1222232E", this);} // tgen
}
static void Test__ZN3aaa9GG1222232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222232E, buf);
    ::aaa::GG1222232 *dp, &lv = *(dp=new (buf) ::aaa::GG1222232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222232E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1222232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1222232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1222232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222232E);
    dp->::aaa::GG1222232::~GG1222232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222232E(Test__ZN3aaa9GG1222232E, "_ZN3aaa9GG1222232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222232C1Ev();
extern void _ZN3aaa9GG1222232D1Ev();
Name_Map name_map__ZN3aaa9GG1222232E[] = {
  NSPAIR(_ZN3aaa9GG1222232C1Ev),
  NSPAIR(_ZN3aaa9GG1222232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1222232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12222323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12222323barEv,_ZThn8_N3aaa9GG12222323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12222323barEv,_ZThn20_N3aaa9GG12222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12222323barEv,_ZThn28_N3aaa9GG12222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12222323barEv,_ZThn8_N3aaa9GG12222323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222323barEv,_ZThn20_N3aaa9GG12222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12222323barEv,_ZThn28_N3aaa9GG12222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222232E[];
Class_Descriptor cd__ZN3aaa9GG1222232E = {  "_ZN3aaa9GG1222232E", // class name
  bases__ZN3aaa9GG1222232E, 6,
  &(vtc__ZN3aaa9GG1222232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222233  : ::aaa::EE122 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12222333fooEv
  virtual void  bar(); // _ZN3aaa9GG12222333barEv
  ~GG1222233(); // tgen
  GG1222233(); // tgen
};
//SIG(1 _ZN3aaa9GG1222233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12222333fooEv");}
void  aaa::GG1222233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12222333barEv");}
aaa::GG1222233 ::~GG1222233(){ note_dtor("_ZN3aaa9GG1222233E", this);} // tgen
aaa::GG1222233 ::GG1222233(){ note_ctor("_ZN3aaa9GG1222233E", this);} // tgen
}
static void Test__ZN3aaa9GG1222233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222233E, buf);
    ::aaa::GG1222233 *dp, &lv = *(dp=new (buf) ::aaa::GG1222233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222233E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1222233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1222233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1222233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222233E);
    dp->::aaa::GG1222233::~GG1222233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222233E(Test__ZN3aaa9GG1222233E, "_ZN3aaa9GG1222233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222233C1Ev();
extern void _ZN3aaa9GG1222233D1Ev();
Name_Map name_map__ZN3aaa9GG1222233E[] = {
  NSPAIR(_ZN3aaa9GG1222233C1Ev),
  NSPAIR(_ZN3aaa9GG1222233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1222233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222233E[];
extern void _ZN3aaa9GG12222333fooEv();
extern void _ZN3aaa9GG12222333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12222333barEv,_ZThn8_N3aaa9GG12222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12222333barEv,_ZThn20_N3aaa9GG12222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12222333fooEv,_ZThn20_N3aaa9GG12222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12222333barEv,_ZThn28_N3aaa9GG12222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12222333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12222333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12222333barEv,_ZThn8_N3aaa9GG12222333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222333barEv,_ZThn20_N3aaa9GG12222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12222333fooEv,_ZThn20_N3aaa9GG12222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12222333barEv,_ZThn28_N3aaa9GG12222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222233E[];
Class_Descriptor cd__ZN3aaa9GG1222233E = {  "_ZN3aaa9GG1222233E", // class name
  bases__ZN3aaa9GG1222233E, 6,
  &(vtc__ZN3aaa9GG1222233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222311  : ::aaa::EE122 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12223113fooEv
  ~GG1222311(); // tgen
  GG1222311(); // tgen
};
//SIG(1 _ZN3aaa9GG1222311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12223113fooEv");}
aaa::GG1222311 ::~GG1222311(){ note_dtor("_ZN3aaa9GG1222311E", this);} // tgen
aaa::GG1222311 ::GG1222311(){ note_ctor("_ZN3aaa9GG1222311E", this);} // tgen
}
static void Test__ZN3aaa9GG1222311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222311E, buf);
    ::aaa::GG1222311 *dp, &lv = *(dp=new (buf) ::aaa::GG1222311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222311E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1222311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1222311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1222311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222311E);
    dp->::aaa::GG1222311::~GG1222311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222311E(Test__ZN3aaa9GG1222311E, "_ZN3aaa9GG1222311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222311C1Ev();
extern void _ZN3aaa9GG1222311D1Ev();
Name_Map name_map__ZN3aaa9GG1222311E[] = {
  NSPAIR(_ZN3aaa9GG1222311C1Ev),
  NSPAIR(_ZN3aaa9GG1222311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1222311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222311E[];
extern void _ZN3aaa9GG12223113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12223113fooEv,_ZThn20_N3aaa9GG12223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223113fooEv,_ZThn28_N3aaa9GG12223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12223113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223113fooEv,_ZThn20_N3aaa9GG12223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223113fooEv,_ZThn28_N3aaa9GG12223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222311E[];
Class_Descriptor cd__ZN3aaa9GG1222311E = {  "_ZN3aaa9GG1222311E", // class name
  bases__ZN3aaa9GG1222311E, 6,
  &(vtc__ZN3aaa9GG1222311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222312  : ::aaa::EE122 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12223123barEv
  ~GG1222312(); // tgen
  GG1222312(); // tgen
};
//SIG(1 _ZN3aaa9GG1222312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12223123barEv");}
aaa::GG1222312 ::~GG1222312(){ note_dtor("_ZN3aaa9GG1222312E", this);} // tgen
aaa::GG1222312 ::GG1222312(){ note_ctor("_ZN3aaa9GG1222312E", this);} // tgen
}
static void Test__ZN3aaa9GG1222312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222312E, buf);
    ::aaa::GG1222312 *dp, &lv = *(dp=new (buf) ::aaa::GG1222312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222312E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1222312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1222312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1222312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222312E);
    dp->::aaa::GG1222312::~GG1222312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222312E(Test__ZN3aaa9GG1222312E, "_ZN3aaa9GG1222312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222312C1Ev();
extern void _ZN3aaa9GG1222312D1Ev();
Name_Map name_map__ZN3aaa9GG1222312E[] = {
  NSPAIR(_ZN3aaa9GG1222312C1Ev),
  NSPAIR(_ZN3aaa9GG1222312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1222312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12223123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12223123barEv,_ZThn8_N3aaa9GG12223123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12223123barEv,_ZThn20_N3aaa9GG12223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223123barEv,_ZThn28_N3aaa9GG12223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12223123barEv,_ZThn8_N3aaa9GG12223123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223123barEv,_ZThn20_N3aaa9GG12223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223123barEv,_ZThn28_N3aaa9GG12223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222312E[];
Class_Descriptor cd__ZN3aaa9GG1222312E = {  "_ZN3aaa9GG1222312E", // class name
  bases__ZN3aaa9GG1222312E, 6,
  &(vtc__ZN3aaa9GG1222312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222313  : ::aaa::EE122 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12223133fooEv
  virtual void  bar(); // _ZN3aaa9GG12223133barEv
  ~GG1222313(); // tgen
  GG1222313(); // tgen
};
//SIG(1 _ZN3aaa9GG1222313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12223133fooEv");}
void  aaa::GG1222313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12223133barEv");}
aaa::GG1222313 ::~GG1222313(){ note_dtor("_ZN3aaa9GG1222313E", this);} // tgen
aaa::GG1222313 ::GG1222313(){ note_ctor("_ZN3aaa9GG1222313E", this);} // tgen
}
static void Test__ZN3aaa9GG1222313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222313E, buf);
    ::aaa::GG1222313 *dp, &lv = *(dp=new (buf) ::aaa::GG1222313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222313E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1222313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1222313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1222313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222313E);
    dp->::aaa::GG1222313::~GG1222313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222313E(Test__ZN3aaa9GG1222313E, "_ZN3aaa9GG1222313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222313C1Ev();
extern void _ZN3aaa9GG1222313D1Ev();
Name_Map name_map__ZN3aaa9GG1222313E[] = {
  NSPAIR(_ZN3aaa9GG1222313C1Ev),
  NSPAIR(_ZN3aaa9GG1222313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1222313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222313E[];
extern void _ZN3aaa9GG12223133fooEv();
extern void _ZN3aaa9GG12223133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12223133barEv,_ZThn8_N3aaa9GG12223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12223133barEv,_ZThn20_N3aaa9GG12223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12223133fooEv,_ZThn20_N3aaa9GG12223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223133fooEv,_ZThn28_N3aaa9GG12223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223133barEv,_ZThn28_N3aaa9GG12223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12223133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12223133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12223133barEv,_ZThn8_N3aaa9GG12223133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223133barEv,_ZThn20_N3aaa9GG12223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223133fooEv,_ZThn20_N3aaa9GG12223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223133fooEv,_ZThn28_N3aaa9GG12223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223133barEv,_ZThn28_N3aaa9GG12223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222313E[];
Class_Descriptor cd__ZN3aaa9GG1222313E = {  "_ZN3aaa9GG1222313E", // class name
  bases__ZN3aaa9GG1222313E, 6,
  &(vtc__ZN3aaa9GG1222313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222321  : ::aaa::EE122 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12223213fooEv
  ~GG1222321(); // tgen
  GG1222321(); // tgen
};
//SIG(1 _ZN3aaa9GG1222321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12223213fooEv");}
aaa::GG1222321 ::~GG1222321(){ note_dtor("_ZN3aaa9GG1222321E", this);} // tgen
aaa::GG1222321 ::GG1222321(){ note_ctor("_ZN3aaa9GG1222321E", this);} // tgen
}
static void Test__ZN3aaa9GG1222321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222321E, buf);
    ::aaa::GG1222321 *dp, &lv = *(dp=new (buf) ::aaa::GG1222321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222321E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1222321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1222321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1222321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222321E);
    dp->::aaa::GG1222321::~GG1222321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222321E(Test__ZN3aaa9GG1222321E, "_ZN3aaa9GG1222321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222321C1Ev();
extern void _ZN3aaa9GG1222321D1Ev();
Name_Map name_map__ZN3aaa9GG1222321E[] = {
  NSPAIR(_ZN3aaa9GG1222321C1Ev),
  NSPAIR(_ZN3aaa9GG1222321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1222321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222321E[];
extern void _ZN3aaa9GG12223213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12223213fooEv,_ZThn28_N3aaa9GG12223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12223213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223213fooEv,_ZThn28_N3aaa9GG12223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222321E[];
Class_Descriptor cd__ZN3aaa9GG1222321E = {  "_ZN3aaa9GG1222321E", // class name
  bases__ZN3aaa9GG1222321E, 6,
  &(vtc__ZN3aaa9GG1222321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222322  : ::aaa::EE122 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12223223barEv
  ~GG1222322(); // tgen
  GG1222322(); // tgen
};
//SIG(1 _ZN3aaa9GG1222322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12223223barEv");}
aaa::GG1222322 ::~GG1222322(){ note_dtor("_ZN3aaa9GG1222322E", this);} // tgen
aaa::GG1222322 ::GG1222322(){ note_ctor("_ZN3aaa9GG1222322E", this);} // tgen
}
static void Test__ZN3aaa9GG1222322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222322E, buf);
    ::aaa::GG1222322 *dp, &lv = *(dp=new (buf) ::aaa::GG1222322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222322E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1222322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1222322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1222322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222322E);
    dp->::aaa::GG1222322::~GG1222322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222322E(Test__ZN3aaa9GG1222322E, "_ZN3aaa9GG1222322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222322C1Ev();
extern void _ZN3aaa9GG1222322D1Ev();
Name_Map name_map__ZN3aaa9GG1222322E[] = {
  NSPAIR(_ZN3aaa9GG1222322C1Ev),
  NSPAIR(_ZN3aaa9GG1222322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1222322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12223223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12223223barEv,_ZThn8_N3aaa9GG12223223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12223223barEv,_ZThn20_N3aaa9GG12223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12223223barEv,_ZThn28_N3aaa9GG12223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12223223barEv,_ZThn8_N3aaa9GG12223223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223223barEv,_ZThn20_N3aaa9GG12223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223223barEv,_ZThn28_N3aaa9GG12223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222322E[];
Class_Descriptor cd__ZN3aaa9GG1222322E = {  "_ZN3aaa9GG1222322E", // class name
  bases__ZN3aaa9GG1222322E, 6,
  &(vtc__ZN3aaa9GG1222322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222323  : ::aaa::EE122 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12223233fooEv
  virtual void  bar(); // _ZN3aaa9GG12223233barEv
  ~GG1222323(); // tgen
  GG1222323(); // tgen
};
//SIG(1 _ZN3aaa9GG1222323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12223233fooEv");}
void  aaa::GG1222323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12223233barEv");}
aaa::GG1222323 ::~GG1222323(){ note_dtor("_ZN3aaa9GG1222323E", this);} // tgen
aaa::GG1222323 ::GG1222323(){ note_ctor("_ZN3aaa9GG1222323E", this);} // tgen
}
static void Test__ZN3aaa9GG1222323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222323E, buf);
    ::aaa::GG1222323 *dp, &lv = *(dp=new (buf) ::aaa::GG1222323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222323E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1222323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1222323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1222323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222323E);
    dp->::aaa::GG1222323::~GG1222323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222323E(Test__ZN3aaa9GG1222323E, "_ZN3aaa9GG1222323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222323C1Ev();
extern void _ZN3aaa9GG1222323D1Ev();
Name_Map name_map__ZN3aaa9GG1222323E[] = {
  NSPAIR(_ZN3aaa9GG1222323C1Ev),
  NSPAIR(_ZN3aaa9GG1222323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1222323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222323E[];
extern void _ZN3aaa9GG12223233fooEv();
extern void _ZN3aaa9GG12223233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12223233barEv,_ZThn8_N3aaa9GG12223233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12223233barEv,_ZThn20_N3aaa9GG12223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223233fooEv,_ZThn28_N3aaa9GG12223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223233barEv,_ZThn28_N3aaa9GG12223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12223233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12223233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12223233barEv,_ZThn8_N3aaa9GG12223233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223233barEv,_ZThn20_N3aaa9GG12223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223233fooEv,_ZThn28_N3aaa9GG12223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223233barEv,_ZThn28_N3aaa9GG12223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222323E[];
Class_Descriptor cd__ZN3aaa9GG1222323E = {  "_ZN3aaa9GG1222323E", // class name
  bases__ZN3aaa9GG1222323E, 6,
  &(vtc__ZN3aaa9GG1222323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222331  : ::aaa::EE122 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12223313fooEv
  ~GG1222331(); // tgen
  GG1222331(); // tgen
};
//SIG(1 _ZN3aaa9GG1222331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12223313fooEv");}
aaa::GG1222331 ::~GG1222331(){ note_dtor("_ZN3aaa9GG1222331E", this);} // tgen
aaa::GG1222331 ::GG1222331(){ note_ctor("_ZN3aaa9GG1222331E", this);} // tgen
}
static void Test__ZN3aaa9GG1222331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222331E, buf);
    ::aaa::GG1222331 *dp, &lv = *(dp=new (buf) ::aaa::GG1222331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222331E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1222331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1222331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1222331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222331E);
    dp->::aaa::GG1222331::~GG1222331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222331E(Test__ZN3aaa9GG1222331E, "_ZN3aaa9GG1222331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222331C1Ev();
extern void _ZN3aaa9GG1222331D1Ev();
Name_Map name_map__ZN3aaa9GG1222331E[] = {
  NSPAIR(_ZN3aaa9GG1222331C1Ev),
  NSPAIR(_ZN3aaa9GG1222331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1222331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222331E[];
extern void _ZN3aaa9GG12223313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12223313fooEv,_ZThn20_N3aaa9GG12223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223313fooEv,_ZThn28_N3aaa9GG12223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12223313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223313fooEv,_ZThn20_N3aaa9GG12223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223313fooEv,_ZThn28_N3aaa9GG12223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222331E[];
Class_Descriptor cd__ZN3aaa9GG1222331E = {  "_ZN3aaa9GG1222331E", // class name
  bases__ZN3aaa9GG1222331E, 6,
  &(vtc__ZN3aaa9GG1222331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222332  : ::aaa::EE122 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12223323barEv
  ~GG1222332(); // tgen
  GG1222332(); // tgen
};
//SIG(1 _ZN3aaa9GG1222332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1222332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12223323barEv");}
aaa::GG1222332 ::~GG1222332(){ note_dtor("_ZN3aaa9GG1222332E", this);} // tgen
aaa::GG1222332 ::GG1222332(){ note_ctor("_ZN3aaa9GG1222332E", this);} // tgen
}
static void Test__ZN3aaa9GG1222332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222332E, buf);
    ::aaa::GG1222332 *dp, &lv = *(dp=new (buf) ::aaa::GG1222332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222332E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1222332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1222332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1222332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222332E);
    dp->::aaa::GG1222332::~GG1222332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222332E(Test__ZN3aaa9GG1222332E, "_ZN3aaa9GG1222332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222332C1Ev();
extern void _ZN3aaa9GG1222332D1Ev();
Name_Map name_map__ZN3aaa9GG1222332E[] = {
  NSPAIR(_ZN3aaa9GG1222332C1Ev),
  NSPAIR(_ZN3aaa9GG1222332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1222332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12223323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12223323barEv,_ZThn8_N3aaa9GG12223323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12223323barEv,_ZThn20_N3aaa9GG12223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223323barEv,_ZThn28_N3aaa9GG12223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12223323barEv,_ZThn8_N3aaa9GG12223323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223323barEv,_ZThn20_N3aaa9GG12223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223323barEv,_ZThn28_N3aaa9GG12223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222332E[];
Class_Descriptor cd__ZN3aaa9GG1222332E = {  "_ZN3aaa9GG1222332E", // class name
  bases__ZN3aaa9GG1222332E, 6,
  &(vtc__ZN3aaa9GG1222332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1222333  : ::aaa::EE122 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12223333fooEv
  virtual void  bar(); // _ZN3aaa9GG12223333barEv
  ~GG1222333(); // tgen
  GG1222333(); // tgen
};
//SIG(1 _ZN3aaa9GG1222333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1222333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12223333fooEv");}
void  aaa::GG1222333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12223333barEv");}
aaa::GG1222333 ::~GG1222333(){ note_dtor("_ZN3aaa9GG1222333E", this);} // tgen
aaa::GG1222333 ::GG1222333(){ note_ctor("_ZN3aaa9GG1222333E", this);} // tgen
}
static void Test__ZN3aaa9GG1222333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1222333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1222333E, buf);
    ::aaa::GG1222333 *dp, &lv = *(dp=new (buf) ::aaa::GG1222333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1222333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1222333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1222333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1222333E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1222333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1222333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1222333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1222333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1222333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1222333E);
    dp->::aaa::GG1222333::~GG1222333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1222333E(Test__ZN3aaa9GG1222333E, "_ZN3aaa9GG1222333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1222333C1Ev();
extern void _ZN3aaa9GG1222333D1Ev();
Name_Map name_map__ZN3aaa9GG1222333E[] = {
  NSPAIR(_ZN3aaa9GG1222333C1Ev),
  NSPAIR(_ZN3aaa9GG1222333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1222333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1222333E[];
extern void _ZN3aaa9GG12223333fooEv();
extern void _ZN3aaa9GG12223333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12223333barEv,_ZThn8_N3aaa9GG12223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12223333barEv,_ZThn20_N3aaa9GG12223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12223333fooEv,_ZThn20_N3aaa9GG12223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223333fooEv,_ZThn28_N3aaa9GG12223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12223333barEv,_ZThn28_N3aaa9GG12223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1222333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12223333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12223333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12223333barEv,_ZThn8_N3aaa9GG12223333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223333barEv,_ZThn20_N3aaa9GG12223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12223333fooEv,_ZThn20_N3aaa9GG12223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223333fooEv,_ZThn28_N3aaa9GG12223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12223333barEv,_ZThn28_N3aaa9GG12223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1222333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1222333E[];
Class_Descriptor cd__ZN3aaa9GG1222333E = {  "_ZN3aaa9GG1222333E", // class name
  bases__ZN3aaa9GG1222333E, 6,
  &(vtc__ZN3aaa9GG1222333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1222333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1222333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223111  : ::aaa::EE122 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12231113fooEv
  ~GG1223111(); // tgen
  GG1223111(); // tgen
};
//SIG(1 _ZN3aaa9GG1223111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12231113fooEv");}
aaa::GG1223111 ::~GG1223111(){ note_dtor("_ZN3aaa9GG1223111E", this);} // tgen
aaa::GG1223111 ::GG1223111(){ note_ctor("_ZN3aaa9GG1223111E", this);} // tgen
}
static void Test__ZN3aaa9GG1223111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223111E, buf);
    ::aaa::GG1223111 *dp, &lv = *(dp=new (buf) ::aaa::GG1223111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223111E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1223111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1223111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1223111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223111E);
    dp->::aaa::GG1223111::~GG1223111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223111E(Test__ZN3aaa9GG1223111E, "_ZN3aaa9GG1223111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223111C1Ev();
extern void _ZN3aaa9GG1223111D1Ev();
Name_Map name_map__ZN3aaa9GG1223111E[] = {
  NSPAIR(_ZN3aaa9GG1223111C1Ev),
  NSPAIR(_ZN3aaa9GG1223111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1223111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223111E[];
extern void _ZN3aaa9GG12231113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231113fooEv,_ZThn20_N3aaa9GG12231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12231113fooEv,_ZThn28_N3aaa9GG12231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12231113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231113fooEv,_ZThn20_N3aaa9GG12231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12231113fooEv,_ZThn28_N3aaa9GG12231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223111E[];
Class_Descriptor cd__ZN3aaa9GG1223111E = {  "_ZN3aaa9GG1223111E", // class name
  bases__ZN3aaa9GG1223111E, 6,
  &(vtc__ZN3aaa9GG1223111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223112  : ::aaa::EE122 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12231123barEv
  ~GG1223112(); // tgen
  GG1223112(); // tgen
};
//SIG(1 _ZN3aaa9GG1223112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12231123barEv");}
aaa::GG1223112 ::~GG1223112(){ note_dtor("_ZN3aaa9GG1223112E", this);} // tgen
aaa::GG1223112 ::GG1223112(){ note_ctor("_ZN3aaa9GG1223112E", this);} // tgen
}
static void Test__ZN3aaa9GG1223112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223112E, buf);
    ::aaa::GG1223112 *dp, &lv = *(dp=new (buf) ::aaa::GG1223112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223112E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1223112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1223112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1223112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223112E);
    dp->::aaa::GG1223112::~GG1223112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223112E(Test__ZN3aaa9GG1223112E, "_ZN3aaa9GG1223112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223112C1Ev();
extern void _ZN3aaa9GG1223112D1Ev();
Name_Map name_map__ZN3aaa9GG1223112E[] = {
  NSPAIR(_ZN3aaa9GG1223112C1Ev),
  NSPAIR(_ZN3aaa9GG1223112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1223112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12231123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12231123barEv,_ZThn8_N3aaa9GG12231123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12231123barEv,_ZThn20_N3aaa9GG12231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12231123barEv,_ZThn8_N3aaa9GG12231123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231123barEv,_ZThn20_N3aaa9GG12231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223112E[];
Class_Descriptor cd__ZN3aaa9GG1223112E = {  "_ZN3aaa9GG1223112E", // class name
  bases__ZN3aaa9GG1223112E, 6,
  &(vtc__ZN3aaa9GG1223112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223113  : ::aaa::EE122 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12231133fooEv
  virtual void  bar(); // _ZN3aaa9GG12231133barEv
  ~GG1223113(); // tgen
  GG1223113(); // tgen
};
//SIG(1 _ZN3aaa9GG1223113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12231133fooEv");}
void  aaa::GG1223113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12231133barEv");}
aaa::GG1223113 ::~GG1223113(){ note_dtor("_ZN3aaa9GG1223113E", this);} // tgen
aaa::GG1223113 ::GG1223113(){ note_ctor("_ZN3aaa9GG1223113E", this);} // tgen
}
static void Test__ZN3aaa9GG1223113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223113E, buf);
    ::aaa::GG1223113 *dp, &lv = *(dp=new (buf) ::aaa::GG1223113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223113E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1223113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1223113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1223113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223113E);
    dp->::aaa::GG1223113::~GG1223113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223113E(Test__ZN3aaa9GG1223113E, "_ZN3aaa9GG1223113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223113C1Ev();
extern void _ZN3aaa9GG1223113D1Ev();
Name_Map name_map__ZN3aaa9GG1223113E[] = {
  NSPAIR(_ZN3aaa9GG1223113C1Ev),
  NSPAIR(_ZN3aaa9GG1223113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1223113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223113E[];
extern void _ZN3aaa9GG12231133fooEv();
extern void _ZN3aaa9GG12231133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12231133barEv,_ZThn8_N3aaa9GG12231133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231133fooEv,_ZThn20_N3aaa9GG12231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231133barEv,_ZThn20_N3aaa9GG12231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12231133fooEv,_ZThn28_N3aaa9GG12231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12231133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12231133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12231133barEv,_ZThn8_N3aaa9GG12231133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231133fooEv,_ZThn20_N3aaa9GG12231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231133barEv,_ZThn20_N3aaa9GG12231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12231133fooEv,_ZThn28_N3aaa9GG12231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223113E[];
Class_Descriptor cd__ZN3aaa9GG1223113E = {  "_ZN3aaa9GG1223113E", // class name
  bases__ZN3aaa9GG1223113E, 6,
  &(vtc__ZN3aaa9GG1223113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223121  : ::aaa::EE122 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12231213fooEv
  ~GG1223121(); // tgen
  GG1223121(); // tgen
};
//SIG(1 _ZN3aaa9GG1223121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12231213fooEv");}
aaa::GG1223121 ::~GG1223121(){ note_dtor("_ZN3aaa9GG1223121E", this);} // tgen
aaa::GG1223121 ::GG1223121(){ note_ctor("_ZN3aaa9GG1223121E", this);} // tgen
}
static void Test__ZN3aaa9GG1223121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223121E, buf);
    ::aaa::GG1223121 *dp, &lv = *(dp=new (buf) ::aaa::GG1223121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223121E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1223121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1223121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1223121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223121E);
    dp->::aaa::GG1223121::~GG1223121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223121E(Test__ZN3aaa9GG1223121E, "_ZN3aaa9GG1223121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223121C1Ev();
extern void _ZN3aaa9GG1223121D1Ev();
Name_Map name_map__ZN3aaa9GG1223121E[] = {
  NSPAIR(_ZN3aaa9GG1223121C1Ev),
  NSPAIR(_ZN3aaa9GG1223121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1223121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223121E[];
extern void _ZN3aaa9GG12231213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231213fooEv,_ZThn20_N3aaa9GG12231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12231213fooEv,_ZThn28_N3aaa9GG12231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12231213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231213fooEv,_ZThn20_N3aaa9GG12231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12231213fooEv,_ZThn28_N3aaa9GG12231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223121E[];
Class_Descriptor cd__ZN3aaa9GG1223121E = {  "_ZN3aaa9GG1223121E", // class name
  bases__ZN3aaa9GG1223121E, 6,
  &(vtc__ZN3aaa9GG1223121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223122  : ::aaa::EE122 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12231223barEv
  ~GG1223122(); // tgen
  GG1223122(); // tgen
};
//SIG(1 _ZN3aaa9GG1223122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12231223barEv");}
aaa::GG1223122 ::~GG1223122(){ note_dtor("_ZN3aaa9GG1223122E", this);} // tgen
aaa::GG1223122 ::GG1223122(){ note_ctor("_ZN3aaa9GG1223122E", this);} // tgen
}
static void Test__ZN3aaa9GG1223122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223122E, buf);
    ::aaa::GG1223122 *dp, &lv = *(dp=new (buf) ::aaa::GG1223122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223122E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1223122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1223122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1223122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223122E);
    dp->::aaa::GG1223122::~GG1223122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223122E(Test__ZN3aaa9GG1223122E, "_ZN3aaa9GG1223122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223122C1Ev();
extern void _ZN3aaa9GG1223122D1Ev();
Name_Map name_map__ZN3aaa9GG1223122E[] = {
  NSPAIR(_ZN3aaa9GG1223122C1Ev),
  NSPAIR(_ZN3aaa9GG1223122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1223122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12231223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12231223barEv,_ZThn8_N3aaa9GG12231223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12231223barEv,_ZThn20_N3aaa9GG12231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12231223barEv,_ZThn8_N3aaa9GG12231223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231223barEv,_ZThn20_N3aaa9GG12231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223122E[];
Class_Descriptor cd__ZN3aaa9GG1223122E = {  "_ZN3aaa9GG1223122E", // class name
  bases__ZN3aaa9GG1223122E, 6,
  &(vtc__ZN3aaa9GG1223122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223123  : ::aaa::EE122 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12231233fooEv
  virtual void  bar(); // _ZN3aaa9GG12231233barEv
  ~GG1223123(); // tgen
  GG1223123(); // tgen
};
//SIG(1 _ZN3aaa9GG1223123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12231233fooEv");}
void  aaa::GG1223123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12231233barEv");}
aaa::GG1223123 ::~GG1223123(){ note_dtor("_ZN3aaa9GG1223123E", this);} // tgen
aaa::GG1223123 ::GG1223123(){ note_ctor("_ZN3aaa9GG1223123E", this);} // tgen
}
static void Test__ZN3aaa9GG1223123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223123E, buf);
    ::aaa::GG1223123 *dp, &lv = *(dp=new (buf) ::aaa::GG1223123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223123E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1223123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1223123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1223123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223123E);
    dp->::aaa::GG1223123::~GG1223123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223123E(Test__ZN3aaa9GG1223123E, "_ZN3aaa9GG1223123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223123C1Ev();
extern void _ZN3aaa9GG1223123D1Ev();
Name_Map name_map__ZN3aaa9GG1223123E[] = {
  NSPAIR(_ZN3aaa9GG1223123C1Ev),
  NSPAIR(_ZN3aaa9GG1223123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1223123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223123E[];
extern void _ZN3aaa9GG12231233fooEv();
extern void _ZN3aaa9GG12231233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12231233barEv,_ZThn8_N3aaa9GG12231233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231233fooEv,_ZThn20_N3aaa9GG12231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231233barEv,_ZThn20_N3aaa9GG12231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12231233fooEv,_ZThn28_N3aaa9GG12231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12231233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12231233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12231233barEv,_ZThn8_N3aaa9GG12231233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231233fooEv,_ZThn20_N3aaa9GG12231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231233barEv,_ZThn20_N3aaa9GG12231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12231233fooEv,_ZThn28_N3aaa9GG12231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223123E[];
Class_Descriptor cd__ZN3aaa9GG1223123E = {  "_ZN3aaa9GG1223123E", // class name
  bases__ZN3aaa9GG1223123E, 6,
  &(vtc__ZN3aaa9GG1223123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223131  : ::aaa::EE122 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12231313fooEv
  ~GG1223131(); // tgen
  GG1223131(); // tgen
};
//SIG(1 _ZN3aaa9GG1223131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12231313fooEv");}
aaa::GG1223131 ::~GG1223131(){ note_dtor("_ZN3aaa9GG1223131E", this);} // tgen
aaa::GG1223131 ::GG1223131(){ note_ctor("_ZN3aaa9GG1223131E", this);} // tgen
}
static void Test__ZN3aaa9GG1223131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223131E, buf);
    ::aaa::GG1223131 *dp, &lv = *(dp=new (buf) ::aaa::GG1223131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223131E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1223131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1223131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1223131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223131E);
    dp->::aaa::GG1223131::~GG1223131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223131E(Test__ZN3aaa9GG1223131E, "_ZN3aaa9GG1223131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223131C1Ev();
extern void _ZN3aaa9GG1223131D1Ev();
Name_Map name_map__ZN3aaa9GG1223131E[] = {
  NSPAIR(_ZN3aaa9GG1223131C1Ev),
  NSPAIR(_ZN3aaa9GG1223131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1223131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223131E[];
extern void _ZN3aaa9GG12231313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231313fooEv,_ZThn20_N3aaa9GG12231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12231313fooEv,_ZThn28_N3aaa9GG12231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12231313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231313fooEv,_ZThn20_N3aaa9GG12231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12231313fooEv,_ZThn28_N3aaa9GG12231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223131E[];
Class_Descriptor cd__ZN3aaa9GG1223131E = {  "_ZN3aaa9GG1223131E", // class name
  bases__ZN3aaa9GG1223131E, 6,
  &(vtc__ZN3aaa9GG1223131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223132  : ::aaa::EE122 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12231323barEv
  ~GG1223132(); // tgen
  GG1223132(); // tgen
};
//SIG(1 _ZN3aaa9GG1223132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12231323barEv");}
aaa::GG1223132 ::~GG1223132(){ note_dtor("_ZN3aaa9GG1223132E", this);} // tgen
aaa::GG1223132 ::GG1223132(){ note_ctor("_ZN3aaa9GG1223132E", this);} // tgen
}
static void Test__ZN3aaa9GG1223132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223132E, buf);
    ::aaa::GG1223132 *dp, &lv = *(dp=new (buf) ::aaa::GG1223132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223132E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1223132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1223132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1223132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223132E);
    dp->::aaa::GG1223132::~GG1223132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223132E(Test__ZN3aaa9GG1223132E, "_ZN3aaa9GG1223132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223132C1Ev();
extern void _ZN3aaa9GG1223132D1Ev();
Name_Map name_map__ZN3aaa9GG1223132E[] = {
  NSPAIR(_ZN3aaa9GG1223132C1Ev),
  NSPAIR(_ZN3aaa9GG1223132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1223132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12231323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12231323barEv,_ZThn8_N3aaa9GG12231323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12231323barEv,_ZThn20_N3aaa9GG12231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12231323barEv,_ZThn8_N3aaa9GG12231323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231323barEv,_ZThn20_N3aaa9GG12231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223132E[];
Class_Descriptor cd__ZN3aaa9GG1223132E = {  "_ZN3aaa9GG1223132E", // class name
  bases__ZN3aaa9GG1223132E, 6,
  &(vtc__ZN3aaa9GG1223132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223133  : ::aaa::EE122 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12231333fooEv
  virtual void  bar(); // _ZN3aaa9GG12231333barEv
  ~GG1223133(); // tgen
  GG1223133(); // tgen
};
//SIG(1 _ZN3aaa9GG1223133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12231333fooEv");}
void  aaa::GG1223133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12231333barEv");}
aaa::GG1223133 ::~GG1223133(){ note_dtor("_ZN3aaa9GG1223133E", this);} // tgen
aaa::GG1223133 ::GG1223133(){ note_ctor("_ZN3aaa9GG1223133E", this);} // tgen
}
static void Test__ZN3aaa9GG1223133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223133E, buf);
    ::aaa::GG1223133 *dp, &lv = *(dp=new (buf) ::aaa::GG1223133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223133E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1223133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1223133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1223133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223133E);
    dp->::aaa::GG1223133::~GG1223133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223133E(Test__ZN3aaa9GG1223133E, "_ZN3aaa9GG1223133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223133C1Ev();
extern void _ZN3aaa9GG1223133D1Ev();
Name_Map name_map__ZN3aaa9GG1223133E[] = {
  NSPAIR(_ZN3aaa9GG1223133C1Ev),
  NSPAIR(_ZN3aaa9GG1223133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1223133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223133E[];
extern void _ZN3aaa9GG12231333fooEv();
extern void _ZN3aaa9GG12231333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12231333barEv,_ZThn8_N3aaa9GG12231333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231333fooEv,_ZThn20_N3aaa9GG12231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12231333barEv,_ZThn20_N3aaa9GG12231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12231333fooEv,_ZThn28_N3aaa9GG12231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12231333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12231333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12231333barEv,_ZThn8_N3aaa9GG12231333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231333fooEv,_ZThn20_N3aaa9GG12231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12231333barEv,_ZThn20_N3aaa9GG12231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12231333fooEv,_ZThn28_N3aaa9GG12231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223133E[];
Class_Descriptor cd__ZN3aaa9GG1223133E = {  "_ZN3aaa9GG1223133E", // class name
  bases__ZN3aaa9GG1223133E, 6,
  &(vtc__ZN3aaa9GG1223133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223211  : ::aaa::EE122 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12232113fooEv
  ~GG1223211(); // tgen
  GG1223211(); // tgen
};
//SIG(1 _ZN3aaa9GG1223211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12232113fooEv");}
aaa::GG1223211 ::~GG1223211(){ note_dtor("_ZN3aaa9GG1223211E", this);} // tgen
aaa::GG1223211 ::GG1223211(){ note_ctor("_ZN3aaa9GG1223211E", this);} // tgen
}
static void Test__ZN3aaa9GG1223211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223211E, buf);
    ::aaa::GG1223211 *dp, &lv = *(dp=new (buf) ::aaa::GG1223211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223211E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1223211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1223211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1223211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223211E);
    dp->::aaa::GG1223211::~GG1223211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223211E(Test__ZN3aaa9GG1223211E, "_ZN3aaa9GG1223211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223211C1Ev();
extern void _ZN3aaa9GG1223211D1Ev();
Name_Map name_map__ZN3aaa9GG1223211E[] = {
  NSPAIR(_ZN3aaa9GG1223211C1Ev),
  NSPAIR(_ZN3aaa9GG1223211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1223211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223211E[];
extern void _ZN3aaa9GG12232113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232113fooEv,_ZThn20_N3aaa9GG12232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12232113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232113fooEv,_ZThn20_N3aaa9GG12232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223211E[];
Class_Descriptor cd__ZN3aaa9GG1223211E = {  "_ZN3aaa9GG1223211E", // class name
  bases__ZN3aaa9GG1223211E, 6,
  &(vtc__ZN3aaa9GG1223211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223212  : ::aaa::EE122 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12232123barEv
  ~GG1223212(); // tgen
  GG1223212(); // tgen
};
//SIG(1 _ZN3aaa9GG1223212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12232123barEv");}
aaa::GG1223212 ::~GG1223212(){ note_dtor("_ZN3aaa9GG1223212E", this);} // tgen
aaa::GG1223212 ::GG1223212(){ note_ctor("_ZN3aaa9GG1223212E", this);} // tgen
}
static void Test__ZN3aaa9GG1223212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223212E, buf);
    ::aaa::GG1223212 *dp, &lv = *(dp=new (buf) ::aaa::GG1223212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223212E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1223212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1223212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1223212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223212E);
    dp->::aaa::GG1223212::~GG1223212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223212E(Test__ZN3aaa9GG1223212E, "_ZN3aaa9GG1223212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223212C1Ev();
extern void _ZN3aaa9GG1223212D1Ev();
Name_Map name_map__ZN3aaa9GG1223212E[] = {
  NSPAIR(_ZN3aaa9GG1223212C1Ev),
  NSPAIR(_ZN3aaa9GG1223212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1223212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12232123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12232123barEv,_ZThn8_N3aaa9GG12232123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12232123barEv,_ZThn20_N3aaa9GG12232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12232123barEv,_ZThn28_N3aaa9GG12232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12232123barEv,_ZThn8_N3aaa9GG12232123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232123barEv,_ZThn20_N3aaa9GG12232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12232123barEv,_ZThn28_N3aaa9GG12232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223212E[];
Class_Descriptor cd__ZN3aaa9GG1223212E = {  "_ZN3aaa9GG1223212E", // class name
  bases__ZN3aaa9GG1223212E, 6,
  &(vtc__ZN3aaa9GG1223212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223213  : ::aaa::EE122 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12232133fooEv
  virtual void  bar(); // _ZN3aaa9GG12232133barEv
  ~GG1223213(); // tgen
  GG1223213(); // tgen
};
//SIG(1 _ZN3aaa9GG1223213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12232133fooEv");}
void  aaa::GG1223213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12232133barEv");}
aaa::GG1223213 ::~GG1223213(){ note_dtor("_ZN3aaa9GG1223213E", this);} // tgen
aaa::GG1223213 ::GG1223213(){ note_ctor("_ZN3aaa9GG1223213E", this);} // tgen
}
static void Test__ZN3aaa9GG1223213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223213E, buf);
    ::aaa::GG1223213 *dp, &lv = *(dp=new (buf) ::aaa::GG1223213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223213E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1223213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1223213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1223213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223213E);
    dp->::aaa::GG1223213::~GG1223213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223213E(Test__ZN3aaa9GG1223213E, "_ZN3aaa9GG1223213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223213C1Ev();
extern void _ZN3aaa9GG1223213D1Ev();
Name_Map name_map__ZN3aaa9GG1223213E[] = {
  NSPAIR(_ZN3aaa9GG1223213C1Ev),
  NSPAIR(_ZN3aaa9GG1223213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1223213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223213E[];
extern void _ZN3aaa9GG12232133fooEv();
extern void _ZN3aaa9GG12232133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12232133barEv,_ZThn8_N3aaa9GG12232133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232133fooEv,_ZThn20_N3aaa9GG12232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232133barEv,_ZThn20_N3aaa9GG12232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12232133barEv,_ZThn28_N3aaa9GG12232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12232133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12232133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12232133barEv,_ZThn8_N3aaa9GG12232133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232133fooEv,_ZThn20_N3aaa9GG12232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232133barEv,_ZThn20_N3aaa9GG12232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12232133barEv,_ZThn28_N3aaa9GG12232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223213E[];
Class_Descriptor cd__ZN3aaa9GG1223213E = {  "_ZN3aaa9GG1223213E", // class name
  bases__ZN3aaa9GG1223213E, 6,
  &(vtc__ZN3aaa9GG1223213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223221  : ::aaa::EE122 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12232213fooEv
  ~GG1223221(); // tgen
  GG1223221(); // tgen
};
//SIG(1 _ZN3aaa9GG1223221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12232213fooEv");}
aaa::GG1223221 ::~GG1223221(){ note_dtor("_ZN3aaa9GG1223221E", this);} // tgen
aaa::GG1223221 ::GG1223221(){ note_ctor("_ZN3aaa9GG1223221E", this);} // tgen
}
static void Test__ZN3aaa9GG1223221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223221E, buf);
    ::aaa::GG1223221 *dp, &lv = *(dp=new (buf) ::aaa::GG1223221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223221E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1223221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1223221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1223221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223221E);
    dp->::aaa::GG1223221::~GG1223221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223221E(Test__ZN3aaa9GG1223221E, "_ZN3aaa9GG1223221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223221C1Ev();
extern void _ZN3aaa9GG1223221D1Ev();
Name_Map name_map__ZN3aaa9GG1223221E[] = {
  NSPAIR(_ZN3aaa9GG1223221C1Ev),
  NSPAIR(_ZN3aaa9GG1223221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1223221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223221E[];
extern void _ZN3aaa9GG12232213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232213fooEv,_ZThn20_N3aaa9GG12232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12232213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232213fooEv,_ZThn20_N3aaa9GG12232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223221E[];
Class_Descriptor cd__ZN3aaa9GG1223221E = {  "_ZN3aaa9GG1223221E", // class name
  bases__ZN3aaa9GG1223221E, 6,
  &(vtc__ZN3aaa9GG1223221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223222  : ::aaa::EE122 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12232223barEv
  ~GG1223222(); // tgen
  GG1223222(); // tgen
};
//SIG(1 _ZN3aaa9GG1223222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12232223barEv");}
aaa::GG1223222 ::~GG1223222(){ note_dtor("_ZN3aaa9GG1223222E", this);} // tgen
aaa::GG1223222 ::GG1223222(){ note_ctor("_ZN3aaa9GG1223222E", this);} // tgen
}
static void Test__ZN3aaa9GG1223222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223222E, buf);
    ::aaa::GG1223222 *dp, &lv = *(dp=new (buf) ::aaa::GG1223222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223222E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1223222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1223222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1223222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223222E);
    dp->::aaa::GG1223222::~GG1223222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223222E(Test__ZN3aaa9GG1223222E, "_ZN3aaa9GG1223222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223222C1Ev();
extern void _ZN3aaa9GG1223222D1Ev();
Name_Map name_map__ZN3aaa9GG1223222E[] = {
  NSPAIR(_ZN3aaa9GG1223222C1Ev),
  NSPAIR(_ZN3aaa9GG1223222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1223222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12232223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12232223barEv,_ZThn8_N3aaa9GG12232223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12232223barEv,_ZThn20_N3aaa9GG12232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12232223barEv,_ZThn28_N3aaa9GG12232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12232223barEv,_ZThn8_N3aaa9GG12232223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232223barEv,_ZThn20_N3aaa9GG12232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12232223barEv,_ZThn28_N3aaa9GG12232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223222E[];
Class_Descriptor cd__ZN3aaa9GG1223222E = {  "_ZN3aaa9GG1223222E", // class name
  bases__ZN3aaa9GG1223222E, 6,
  &(vtc__ZN3aaa9GG1223222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223223  : ::aaa::EE122 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12232233fooEv
  virtual void  bar(); // _ZN3aaa9GG12232233barEv
  ~GG1223223(); // tgen
  GG1223223(); // tgen
};
//SIG(1 _ZN3aaa9GG1223223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12232233fooEv");}
void  aaa::GG1223223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12232233barEv");}
aaa::GG1223223 ::~GG1223223(){ note_dtor("_ZN3aaa9GG1223223E", this);} // tgen
aaa::GG1223223 ::GG1223223(){ note_ctor("_ZN3aaa9GG1223223E", this);} // tgen
}
static void Test__ZN3aaa9GG1223223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223223E, buf);
    ::aaa::GG1223223 *dp, &lv = *(dp=new (buf) ::aaa::GG1223223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223223E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1223223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1223223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1223223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223223E);
    dp->::aaa::GG1223223::~GG1223223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223223E(Test__ZN3aaa9GG1223223E, "_ZN3aaa9GG1223223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223223C1Ev();
extern void _ZN3aaa9GG1223223D1Ev();
Name_Map name_map__ZN3aaa9GG1223223E[] = {
  NSPAIR(_ZN3aaa9GG1223223C1Ev),
  NSPAIR(_ZN3aaa9GG1223223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1223223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223223E[];
extern void _ZN3aaa9GG12232233fooEv();
extern void _ZN3aaa9GG12232233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12232233barEv,_ZThn8_N3aaa9GG12232233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232233fooEv,_ZThn20_N3aaa9GG12232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232233barEv,_ZThn20_N3aaa9GG12232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12232233barEv,_ZThn28_N3aaa9GG12232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12232233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12232233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12232233barEv,_ZThn8_N3aaa9GG12232233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232233fooEv,_ZThn20_N3aaa9GG12232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232233barEv,_ZThn20_N3aaa9GG12232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12232233barEv,_ZThn28_N3aaa9GG12232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223223E[];
Class_Descriptor cd__ZN3aaa9GG1223223E = {  "_ZN3aaa9GG1223223E", // class name
  bases__ZN3aaa9GG1223223E, 6,
  &(vtc__ZN3aaa9GG1223223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223231  : ::aaa::EE122 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12232313fooEv
  ~GG1223231(); // tgen
  GG1223231(); // tgen
};
//SIG(1 _ZN3aaa9GG1223231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12232313fooEv");}
aaa::GG1223231 ::~GG1223231(){ note_dtor("_ZN3aaa9GG1223231E", this);} // tgen
aaa::GG1223231 ::GG1223231(){ note_ctor("_ZN3aaa9GG1223231E", this);} // tgen
}
static void Test__ZN3aaa9GG1223231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223231E, buf);
    ::aaa::GG1223231 *dp, &lv = *(dp=new (buf) ::aaa::GG1223231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223231E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1223231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1223231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1223231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223231E);
    dp->::aaa::GG1223231::~GG1223231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223231E(Test__ZN3aaa9GG1223231E, "_ZN3aaa9GG1223231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223231C1Ev();
extern void _ZN3aaa9GG1223231D1Ev();
Name_Map name_map__ZN3aaa9GG1223231E[] = {
  NSPAIR(_ZN3aaa9GG1223231C1Ev),
  NSPAIR(_ZN3aaa9GG1223231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1223231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223231E[];
extern void _ZN3aaa9GG12232313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232313fooEv,_ZThn20_N3aaa9GG12232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12232313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232313fooEv,_ZThn20_N3aaa9GG12232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223231E[];
Class_Descriptor cd__ZN3aaa9GG1223231E = {  "_ZN3aaa9GG1223231E", // class name
  bases__ZN3aaa9GG1223231E, 6,
  &(vtc__ZN3aaa9GG1223231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223232  : ::aaa::EE122 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12232323barEv
  ~GG1223232(); // tgen
  GG1223232(); // tgen
};
//SIG(1 _ZN3aaa9GG1223232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12232323barEv");}
aaa::GG1223232 ::~GG1223232(){ note_dtor("_ZN3aaa9GG1223232E", this);} // tgen
aaa::GG1223232 ::GG1223232(){ note_ctor("_ZN3aaa9GG1223232E", this);} // tgen
}
static void Test__ZN3aaa9GG1223232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223232E, buf);
    ::aaa::GG1223232 *dp, &lv = *(dp=new (buf) ::aaa::GG1223232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223232E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1223232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1223232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1223232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223232E);
    dp->::aaa::GG1223232::~GG1223232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223232E(Test__ZN3aaa9GG1223232E, "_ZN3aaa9GG1223232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223232C1Ev();
extern void _ZN3aaa9GG1223232D1Ev();
Name_Map name_map__ZN3aaa9GG1223232E[] = {
  NSPAIR(_ZN3aaa9GG1223232C1Ev),
  NSPAIR(_ZN3aaa9GG1223232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1223232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12232323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12232323barEv,_ZThn8_N3aaa9GG12232323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12232323barEv,_ZThn20_N3aaa9GG12232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12232323barEv,_ZThn28_N3aaa9GG12232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12232323barEv,_ZThn8_N3aaa9GG12232323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232323barEv,_ZThn20_N3aaa9GG12232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12232323barEv,_ZThn28_N3aaa9GG12232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223232E[];
Class_Descriptor cd__ZN3aaa9GG1223232E = {  "_ZN3aaa9GG1223232E", // class name
  bases__ZN3aaa9GG1223232E, 6,
  &(vtc__ZN3aaa9GG1223232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223233  : ::aaa::EE122 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12232333fooEv
  virtual void  bar(); // _ZN3aaa9GG12232333barEv
  ~GG1223233(); // tgen
  GG1223233(); // tgen
};
//SIG(1 _ZN3aaa9GG1223233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12232333fooEv");}
void  aaa::GG1223233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12232333barEv");}
aaa::GG1223233 ::~GG1223233(){ note_dtor("_ZN3aaa9GG1223233E", this);} // tgen
aaa::GG1223233 ::GG1223233(){ note_ctor("_ZN3aaa9GG1223233E", this);} // tgen
}
static void Test__ZN3aaa9GG1223233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223233E, buf);
    ::aaa::GG1223233 *dp, &lv = *(dp=new (buf) ::aaa::GG1223233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223233E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1223233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1223233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1223233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223233E);
    dp->::aaa::GG1223233::~GG1223233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223233E(Test__ZN3aaa9GG1223233E, "_ZN3aaa9GG1223233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223233C1Ev();
extern void _ZN3aaa9GG1223233D1Ev();
Name_Map name_map__ZN3aaa9GG1223233E[] = {
  NSPAIR(_ZN3aaa9GG1223233C1Ev),
  NSPAIR(_ZN3aaa9GG1223233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1223233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223233E[];
extern void _ZN3aaa9GG12232333fooEv();
extern void _ZN3aaa9GG12232333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12232333barEv,_ZThn8_N3aaa9GG12232333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232333fooEv,_ZThn20_N3aaa9GG12232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12232333barEv,_ZThn20_N3aaa9GG12232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12232333barEv,_ZThn28_N3aaa9GG12232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12232333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12232333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12232333barEv,_ZThn8_N3aaa9GG12232333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232333fooEv,_ZThn20_N3aaa9GG12232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12232333barEv,_ZThn20_N3aaa9GG12232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12232333barEv,_ZThn28_N3aaa9GG12232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223233E[];
Class_Descriptor cd__ZN3aaa9GG1223233E = {  "_ZN3aaa9GG1223233E", // class name
  bases__ZN3aaa9GG1223233E, 6,
  &(vtc__ZN3aaa9GG1223233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223311  : ::aaa::EE122 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12233113fooEv
  ~GG1223311(); // tgen
  GG1223311(); // tgen
};
//SIG(1 _ZN3aaa9GG1223311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12233113fooEv");}
aaa::GG1223311 ::~GG1223311(){ note_dtor("_ZN3aaa9GG1223311E", this);} // tgen
aaa::GG1223311 ::GG1223311(){ note_ctor("_ZN3aaa9GG1223311E", this);} // tgen
}
static void Test__ZN3aaa9GG1223311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223311E, buf);
    ::aaa::GG1223311 *dp, &lv = *(dp=new (buf) ::aaa::GG1223311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223311E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1223311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1223311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1223311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223311E);
    dp->::aaa::GG1223311::~GG1223311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223311E(Test__ZN3aaa9GG1223311E, "_ZN3aaa9GG1223311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223311C1Ev();
extern void _ZN3aaa9GG1223311D1Ev();
Name_Map name_map__ZN3aaa9GG1223311E[] = {
  NSPAIR(_ZN3aaa9GG1223311C1Ev),
  NSPAIR(_ZN3aaa9GG1223311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1223311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223311E[];
extern void _ZN3aaa9GG12233113fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233113fooEv,_ZThn20_N3aaa9GG12233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12233113fooEv,_ZThn28_N3aaa9GG12233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12233113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233113fooEv,_ZThn20_N3aaa9GG12233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233113fooEv,_ZThn28_N3aaa9GG12233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223311E[];
Class_Descriptor cd__ZN3aaa9GG1223311E = {  "_ZN3aaa9GG1223311E", // class name
  bases__ZN3aaa9GG1223311E, 6,
  &(vtc__ZN3aaa9GG1223311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223312  : ::aaa::EE122 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12233123barEv
  ~GG1223312(); // tgen
  GG1223312(); // tgen
};
//SIG(1 _ZN3aaa9GG1223312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12233123barEv");}
aaa::GG1223312 ::~GG1223312(){ note_dtor("_ZN3aaa9GG1223312E", this);} // tgen
aaa::GG1223312 ::GG1223312(){ note_ctor("_ZN3aaa9GG1223312E", this);} // tgen
}
static void Test__ZN3aaa9GG1223312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223312E, buf);
    ::aaa::GG1223312 *dp, &lv = *(dp=new (buf) ::aaa::GG1223312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223312E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1223312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1223312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1223312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223312E);
    dp->::aaa::GG1223312::~GG1223312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223312E(Test__ZN3aaa9GG1223312E, "_ZN3aaa9GG1223312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223312C1Ev();
extern void _ZN3aaa9GG1223312D1Ev();
Name_Map name_map__ZN3aaa9GG1223312E[] = {
  NSPAIR(_ZN3aaa9GG1223312C1Ev),
  NSPAIR(_ZN3aaa9GG1223312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1223312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12233123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12233123barEv,_ZThn8_N3aaa9GG12233123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12233123barEv,_ZThn20_N3aaa9GG12233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12233123barEv,_ZThn28_N3aaa9GG12233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12233123barEv,_ZThn8_N3aaa9GG12233123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233123barEv,_ZThn20_N3aaa9GG12233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233123barEv,_ZThn28_N3aaa9GG12233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223312E[];
Class_Descriptor cd__ZN3aaa9GG1223312E = {  "_ZN3aaa9GG1223312E", // class name
  bases__ZN3aaa9GG1223312E, 6,
  &(vtc__ZN3aaa9GG1223312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223313  : ::aaa::EE122 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12233133fooEv
  virtual void  bar(); // _ZN3aaa9GG12233133barEv
  ~GG1223313(); // tgen
  GG1223313(); // tgen
};
//SIG(1 _ZN3aaa9GG1223313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12233133fooEv");}
void  aaa::GG1223313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12233133barEv");}
aaa::GG1223313 ::~GG1223313(){ note_dtor("_ZN3aaa9GG1223313E", this);} // tgen
aaa::GG1223313 ::GG1223313(){ note_ctor("_ZN3aaa9GG1223313E", this);} // tgen
}
static void Test__ZN3aaa9GG1223313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223313E, buf);
    ::aaa::GG1223313 *dp, &lv = *(dp=new (buf) ::aaa::GG1223313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223313E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1223313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1223313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1223313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223313E);
    dp->::aaa::GG1223313::~GG1223313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223313E(Test__ZN3aaa9GG1223313E, "_ZN3aaa9GG1223313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223313C1Ev();
extern void _ZN3aaa9GG1223313D1Ev();
Name_Map name_map__ZN3aaa9GG1223313E[] = {
  NSPAIR(_ZN3aaa9GG1223313C1Ev),
  NSPAIR(_ZN3aaa9GG1223313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1223313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223313E[];
extern void _ZN3aaa9GG12233133fooEv();
extern void _ZN3aaa9GG12233133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12233133barEv,_ZThn8_N3aaa9GG12233133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233133fooEv,_ZThn20_N3aaa9GG12233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233133barEv,_ZThn20_N3aaa9GG12233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12233133fooEv,_ZThn28_N3aaa9GG12233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12233133barEv,_ZThn28_N3aaa9GG12233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12233133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12233133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12233133barEv,_ZThn8_N3aaa9GG12233133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233133fooEv,_ZThn20_N3aaa9GG12233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233133barEv,_ZThn20_N3aaa9GG12233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233133fooEv,_ZThn28_N3aaa9GG12233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233133barEv,_ZThn28_N3aaa9GG12233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223313E[];
Class_Descriptor cd__ZN3aaa9GG1223313E = {  "_ZN3aaa9GG1223313E", // class name
  bases__ZN3aaa9GG1223313E, 6,
  &(vtc__ZN3aaa9GG1223313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223321  : ::aaa::EE122 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12233213fooEv
  ~GG1223321(); // tgen
  GG1223321(); // tgen
};
//SIG(1 _ZN3aaa9GG1223321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12233213fooEv");}
aaa::GG1223321 ::~GG1223321(){ note_dtor("_ZN3aaa9GG1223321E", this);} // tgen
aaa::GG1223321 ::GG1223321(){ note_ctor("_ZN3aaa9GG1223321E", this);} // tgen
}
static void Test__ZN3aaa9GG1223321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223321E, buf);
    ::aaa::GG1223321 *dp, &lv = *(dp=new (buf) ::aaa::GG1223321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223321E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1223321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1223321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1223321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223321E);
    dp->::aaa::GG1223321::~GG1223321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223321E(Test__ZN3aaa9GG1223321E, "_ZN3aaa9GG1223321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223321C1Ev();
extern void _ZN3aaa9GG1223321D1Ev();
Name_Map name_map__ZN3aaa9GG1223321E[] = {
  NSPAIR(_ZN3aaa9GG1223321C1Ev),
  NSPAIR(_ZN3aaa9GG1223321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1223321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223321E[];
extern void _ZN3aaa9GG12233213fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233213fooEv,_ZThn20_N3aaa9GG12233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12233213fooEv,_ZThn28_N3aaa9GG12233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12233213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233213fooEv,_ZThn20_N3aaa9GG12233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233213fooEv,_ZThn28_N3aaa9GG12233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223321E[];
Class_Descriptor cd__ZN3aaa9GG1223321E = {  "_ZN3aaa9GG1223321E", // class name
  bases__ZN3aaa9GG1223321E, 6,
  &(vtc__ZN3aaa9GG1223321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223322  : ::aaa::EE122 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12233223barEv
  ~GG1223322(); // tgen
  GG1223322(); // tgen
};
//SIG(1 _ZN3aaa9GG1223322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12233223barEv");}
aaa::GG1223322 ::~GG1223322(){ note_dtor("_ZN3aaa9GG1223322E", this);} // tgen
aaa::GG1223322 ::GG1223322(){ note_ctor("_ZN3aaa9GG1223322E", this);} // tgen
}
static void Test__ZN3aaa9GG1223322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223322E, buf);
    ::aaa::GG1223322 *dp, &lv = *(dp=new (buf) ::aaa::GG1223322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223322E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1223322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1223322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1223322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223322E);
    dp->::aaa::GG1223322::~GG1223322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223322E(Test__ZN3aaa9GG1223322E, "_ZN3aaa9GG1223322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223322C1Ev();
extern void _ZN3aaa9GG1223322D1Ev();
Name_Map name_map__ZN3aaa9GG1223322E[] = {
  NSPAIR(_ZN3aaa9GG1223322C1Ev),
  NSPAIR(_ZN3aaa9GG1223322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1223322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12233223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12233223barEv,_ZThn8_N3aaa9GG12233223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12233223barEv,_ZThn20_N3aaa9GG12233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12233223barEv,_ZThn28_N3aaa9GG12233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12233223barEv,_ZThn8_N3aaa9GG12233223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233223barEv,_ZThn20_N3aaa9GG12233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233223barEv,_ZThn28_N3aaa9GG12233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223322E[];
Class_Descriptor cd__ZN3aaa9GG1223322E = {  "_ZN3aaa9GG1223322E", // class name
  bases__ZN3aaa9GG1223322E, 6,
  &(vtc__ZN3aaa9GG1223322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223323  : ::aaa::EE122 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12233233fooEv
  virtual void  bar(); // _ZN3aaa9GG12233233barEv
  ~GG1223323(); // tgen
  GG1223323(); // tgen
};
//SIG(1 _ZN3aaa9GG1223323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12233233fooEv");}
void  aaa::GG1223323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12233233barEv");}
aaa::GG1223323 ::~GG1223323(){ note_dtor("_ZN3aaa9GG1223323E", this);} // tgen
aaa::GG1223323 ::GG1223323(){ note_ctor("_ZN3aaa9GG1223323E", this);} // tgen
}
static void Test__ZN3aaa9GG1223323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223323E, buf);
    ::aaa::GG1223323 *dp, &lv = *(dp=new (buf) ::aaa::GG1223323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223323E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1223323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1223323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1223323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223323E);
    dp->::aaa::GG1223323::~GG1223323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223323E(Test__ZN3aaa9GG1223323E, "_ZN3aaa9GG1223323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223323C1Ev();
extern void _ZN3aaa9GG1223323D1Ev();
Name_Map name_map__ZN3aaa9GG1223323E[] = {
  NSPAIR(_ZN3aaa9GG1223323C1Ev),
  NSPAIR(_ZN3aaa9GG1223323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1223323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223323E[];
extern void _ZN3aaa9GG12233233fooEv();
extern void _ZN3aaa9GG12233233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12233233barEv,_ZThn8_N3aaa9GG12233233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233233fooEv,_ZThn20_N3aaa9GG12233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233233barEv,_ZThn20_N3aaa9GG12233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12233233fooEv,_ZThn28_N3aaa9GG12233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12233233barEv,_ZThn28_N3aaa9GG12233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12233233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12233233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12233233barEv,_ZThn8_N3aaa9GG12233233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233233fooEv,_ZThn20_N3aaa9GG12233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233233barEv,_ZThn20_N3aaa9GG12233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233233fooEv,_ZThn28_N3aaa9GG12233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233233barEv,_ZThn28_N3aaa9GG12233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223323E[];
Class_Descriptor cd__ZN3aaa9GG1223323E = {  "_ZN3aaa9GG1223323E", // class name
  bases__ZN3aaa9GG1223323E, 6,
  &(vtc__ZN3aaa9GG1223323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223331  : ::aaa::EE122 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12233313fooEv
  ~GG1223331(); // tgen
  GG1223331(); // tgen
};
//SIG(1 _ZN3aaa9GG1223331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12233313fooEv");}
aaa::GG1223331 ::~GG1223331(){ note_dtor("_ZN3aaa9GG1223331E", this);} // tgen
aaa::GG1223331 ::GG1223331(){ note_ctor("_ZN3aaa9GG1223331E", this);} // tgen
}
static void Test__ZN3aaa9GG1223331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223331E, buf);
    ::aaa::GG1223331 *dp, &lv = *(dp=new (buf) ::aaa::GG1223331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223331E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1223331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1223331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1223331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223331E);
    dp->::aaa::GG1223331::~GG1223331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223331E(Test__ZN3aaa9GG1223331E, "_ZN3aaa9GG1223331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223331C1Ev();
extern void _ZN3aaa9GG1223331D1Ev();
Name_Map name_map__ZN3aaa9GG1223331E[] = {
  NSPAIR(_ZN3aaa9GG1223331C1Ev),
  NSPAIR(_ZN3aaa9GG1223331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1223331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223331E[];
extern void _ZN3aaa9GG12233313fooEv();
extern void _ZN3aaa5EE1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233313fooEv,_ZThn20_N3aaa9GG12233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12233313fooEv,_ZThn28_N3aaa9GG12233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12233313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1223barEv,_ZThn8_N3aaa5EE1223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233313fooEv,_ZThn20_N3aaa9GG12233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233313fooEv,_ZThn28_N3aaa9GG12233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223331E[];
Class_Descriptor cd__ZN3aaa9GG1223331E = {  "_ZN3aaa9GG1223331E", // class name
  bases__ZN3aaa9GG1223331E, 6,
  &(vtc__ZN3aaa9GG1223331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223332  : ::aaa::EE122 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12233323barEv
  ~GG1223332(); // tgen
  GG1223332(); // tgen
};
//SIG(1 _ZN3aaa9GG1223332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1223332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12233323barEv");}
aaa::GG1223332 ::~GG1223332(){ note_dtor("_ZN3aaa9GG1223332E", this);} // tgen
aaa::GG1223332 ::GG1223332(){ note_ctor("_ZN3aaa9GG1223332E", this);} // tgen
}
static void Test__ZN3aaa9GG1223332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223332E, buf);
    ::aaa::GG1223332 *dp, &lv = *(dp=new (buf) ::aaa::GG1223332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223332E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1223332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1223332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1223332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223332E);
    dp->::aaa::GG1223332::~GG1223332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223332E(Test__ZN3aaa9GG1223332E, "_ZN3aaa9GG1223332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223332C1Ev();
extern void _ZN3aaa9GG1223332D1Ev();
Name_Map name_map__ZN3aaa9GG1223332E[] = {
  NSPAIR(_ZN3aaa9GG1223332C1Ev),
  NSPAIR(_ZN3aaa9GG1223332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1223332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG12233323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12233323barEv,_ZThn8_N3aaa9GG12233323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12233323barEv,_ZThn20_N3aaa9GG12233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12233323barEv,_ZThn28_N3aaa9GG12233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12233323barEv,_ZThn8_N3aaa9GG12233323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233323barEv,_ZThn20_N3aaa9GG12233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233323barEv,_ZThn28_N3aaa9GG12233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223332E[];
Class_Descriptor cd__ZN3aaa9GG1223332E = {  "_ZN3aaa9GG1223332E", // class name
  bases__ZN3aaa9GG1223332E, 6,
  &(vtc__ZN3aaa9GG1223332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1223333  : ::aaa::EE122 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12233333fooEv
  virtual void  bar(); // _ZN3aaa9GG12233333barEv
  ~GG1223333(); // tgen
  GG1223333(); // tgen
};
//SIG(1 _ZN3aaa9GG1223333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1223333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12233333fooEv");}
void  aaa::GG1223333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12233333barEv");}
aaa::GG1223333 ::~GG1223333(){ note_dtor("_ZN3aaa9GG1223333E", this);} // tgen
aaa::GG1223333 ::GG1223333(){ note_ctor("_ZN3aaa9GG1223333E", this);} // tgen
}
static void Test__ZN3aaa9GG1223333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1223333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1223333E, buf);
    ::aaa::GG1223333 *dp, &lv = *(dp=new (buf) ::aaa::GG1223333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1223333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1223333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE122*), 0, "_ZN3aaa9GG1223333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE122*), ABISELECT(16,8), "_ZN3aaa9GG1223333E");
    check_base_class_offset(lv, (::aaa::EE122*), 0, "_ZN3aaa9GG1223333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1223333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1223333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1223333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1223333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1223333E);
    dp->::aaa::GG1223333::~GG1223333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1223333E(Test__ZN3aaa9GG1223333E, "_ZN3aaa9GG1223333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1223333C1Ev();
extern void _ZN3aaa9GG1223333D1Ev();
Name_Map name_map__ZN3aaa9GG1223333E[] = {
  NSPAIR(_ZN3aaa9GG1223333C1Ev),
  NSPAIR(_ZN3aaa9GG1223333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE122E;
extern VTBL_ENTRY _ZTIN3aaa5EE122E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE122E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1223333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE122E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1223333E[];
extern void _ZN3aaa9GG12233333fooEv();
extern void _ZN3aaa9GG12233333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12233333barEv,_ZThn8_N3aaa9GG12233333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233333fooEv,_ZThn20_N3aaa9GG12233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12233333barEv,_ZThn20_N3aaa9GG12233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12233333fooEv,_ZThn28_N3aaa9GG12233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12233333barEv,_ZThn28_N3aaa9GG12233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1223333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12233333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12233333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12233333barEv,_ZThn8_N3aaa9GG12233333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233333fooEv,_ZThn20_N3aaa9GG12233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12233333barEv,_ZThn20_N3aaa9GG12233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233333fooEv,_ZThn28_N3aaa9GG12233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12233333barEv,_ZThn28_N3aaa9GG12233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1223333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1223333E[];
Class_Descriptor cd__ZN3aaa9GG1223333E = {  "_ZN3aaa9GG1223333E", // class name
  bases__ZN3aaa9GG1223333E, 6,
  &(vtc__ZN3aaa9GG1223333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1223333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1223333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231111  : ::aaa::EE123 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12311113fooEv
  ~GG1231111(); // tgen
  GG1231111(); // tgen
};
//SIG(1 _ZN3aaa9GG1231111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12311113fooEv");}
aaa::GG1231111 ::~GG1231111(){ note_dtor("_ZN3aaa9GG1231111E", this);} // tgen
aaa::GG1231111 ::GG1231111(){ note_ctor("_ZN3aaa9GG1231111E", this);} // tgen
}
static void Test__ZN3aaa9GG1231111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231111E, buf);
    ::aaa::GG1231111 *dp, &lv = *(dp=new (buf) ::aaa::GG1231111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231111E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1231111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1231111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1231111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231111E);
    dp->::aaa::GG1231111::~GG1231111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231111E(Test__ZN3aaa9GG1231111E, "_ZN3aaa9GG1231111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231111C1Ev();
extern void _ZN3aaa9GG1231111D1Ev();
Name_Map name_map__ZN3aaa9GG1231111E[] = {
  NSPAIR(_ZN3aaa9GG1231111C1Ev),
  NSPAIR(_ZN3aaa9GG1231111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1231111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231111E[];
extern void _ZN3aaa9GG12311113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12311113fooEv,_ZThn20_N3aaa9GG12311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12311113fooEv,_ZThn28_N3aaa9GG12311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12311113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311113fooEv,_ZThn20_N3aaa9GG12311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12311113fooEv,_ZThn28_N3aaa9GG12311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231111E[];
Class_Descriptor cd__ZN3aaa9GG1231111E = {  "_ZN3aaa9GG1231111E", // class name
  bases__ZN3aaa9GG1231111E, 6,
  &(vtc__ZN3aaa9GG1231111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231112  : ::aaa::EE123 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12311123barEv
  ~GG1231112(); // tgen
  GG1231112(); // tgen
};
//SIG(1 _ZN3aaa9GG1231112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12311123barEv");}
aaa::GG1231112 ::~GG1231112(){ note_dtor("_ZN3aaa9GG1231112E", this);} // tgen
aaa::GG1231112 ::GG1231112(){ note_ctor("_ZN3aaa9GG1231112E", this);} // tgen
}
static void Test__ZN3aaa9GG1231112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231112E, buf);
    ::aaa::GG1231112 *dp, &lv = *(dp=new (buf) ::aaa::GG1231112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231112E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1231112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1231112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1231112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231112E);
    dp->::aaa::GG1231112::~GG1231112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231112E(Test__ZN3aaa9GG1231112E, "_ZN3aaa9GG1231112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231112C1Ev();
extern void _ZN3aaa9GG1231112D1Ev();
Name_Map name_map__ZN3aaa9GG1231112E[] = {
  NSPAIR(_ZN3aaa9GG1231112C1Ev),
  NSPAIR(_ZN3aaa9GG1231112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1231112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231112E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12311123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12311123barEv,_ZThn8_N3aaa9GG12311123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12311123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12311123barEv,_ZThn8_N3aaa9GG12311123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231112E[];
Class_Descriptor cd__ZN3aaa9GG1231112E = {  "_ZN3aaa9GG1231112E", // class name
  bases__ZN3aaa9GG1231112E, 6,
  &(vtc__ZN3aaa9GG1231112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231113  : ::aaa::EE123 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12311133fooEv
  virtual void  bar(); // _ZN3aaa9GG12311133barEv
  ~GG1231113(); // tgen
  GG1231113(); // tgen
};
//SIG(1 _ZN3aaa9GG1231113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12311133fooEv");}
void  aaa::GG1231113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12311133barEv");}
aaa::GG1231113 ::~GG1231113(){ note_dtor("_ZN3aaa9GG1231113E", this);} // tgen
aaa::GG1231113 ::GG1231113(){ note_ctor("_ZN3aaa9GG1231113E", this);} // tgen
}
static void Test__ZN3aaa9GG1231113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231113E, buf);
    ::aaa::GG1231113 *dp, &lv = *(dp=new (buf) ::aaa::GG1231113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231113E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1231113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1231113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1231113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231113E);
    dp->::aaa::GG1231113::~GG1231113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231113E(Test__ZN3aaa9GG1231113E, "_ZN3aaa9GG1231113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231113C1Ev();
extern void _ZN3aaa9GG1231113D1Ev();
Name_Map name_map__ZN3aaa9GG1231113E[] = {
  NSPAIR(_ZN3aaa9GG1231113C1Ev),
  NSPAIR(_ZN3aaa9GG1231113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1231113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231113E[];
extern void _ZN3aaa9GG12311133fooEv();
extern void _ZN3aaa9GG12311133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12311133barEv,_ZThn8_N3aaa9GG12311133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12311133fooEv,_ZThn20_N3aaa9GG12311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12311133fooEv,_ZThn28_N3aaa9GG12311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12311133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12311133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12311133barEv,_ZThn8_N3aaa9GG12311133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311133fooEv,_ZThn20_N3aaa9GG12311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12311133fooEv,_ZThn28_N3aaa9GG12311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231113E[];
Class_Descriptor cd__ZN3aaa9GG1231113E = {  "_ZN3aaa9GG1231113E", // class name
  bases__ZN3aaa9GG1231113E, 6,
  &(vtc__ZN3aaa9GG1231113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231121  : ::aaa::EE123 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12311213fooEv
  ~GG1231121(); // tgen
  GG1231121(); // tgen
};
//SIG(1 _ZN3aaa9GG1231121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12311213fooEv");}
aaa::GG1231121 ::~GG1231121(){ note_dtor("_ZN3aaa9GG1231121E", this);} // tgen
aaa::GG1231121 ::GG1231121(){ note_ctor("_ZN3aaa9GG1231121E", this);} // tgen
}
static void Test__ZN3aaa9GG1231121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231121E, buf);
    ::aaa::GG1231121 *dp, &lv = *(dp=new (buf) ::aaa::GG1231121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231121E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1231121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1231121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1231121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231121E);
    dp->::aaa::GG1231121::~GG1231121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231121E(Test__ZN3aaa9GG1231121E, "_ZN3aaa9GG1231121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231121C1Ev();
extern void _ZN3aaa9GG1231121D1Ev();
Name_Map name_map__ZN3aaa9GG1231121E[] = {
  NSPAIR(_ZN3aaa9GG1231121C1Ev),
  NSPAIR(_ZN3aaa9GG1231121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1231121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231121E[];
extern void _ZN3aaa9GG12311213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12311213fooEv,_ZThn20_N3aaa9GG12311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12311213fooEv,_ZThn28_N3aaa9GG12311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12311213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311213fooEv,_ZThn20_N3aaa9GG12311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12311213fooEv,_ZThn28_N3aaa9GG12311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231121E[];
Class_Descriptor cd__ZN3aaa9GG1231121E = {  "_ZN3aaa9GG1231121E", // class name
  bases__ZN3aaa9GG1231121E, 6,
  &(vtc__ZN3aaa9GG1231121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231122  : ::aaa::EE123 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12311223barEv
  ~GG1231122(); // tgen
  GG1231122(); // tgen
};
//SIG(1 _ZN3aaa9GG1231122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12311223barEv");}
aaa::GG1231122 ::~GG1231122(){ note_dtor("_ZN3aaa9GG1231122E", this);} // tgen
aaa::GG1231122 ::GG1231122(){ note_ctor("_ZN3aaa9GG1231122E", this);} // tgen
}
static void Test__ZN3aaa9GG1231122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231122E, buf);
    ::aaa::GG1231122 *dp, &lv = *(dp=new (buf) ::aaa::GG1231122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231122E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1231122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1231122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1231122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231122E);
    dp->::aaa::GG1231122::~GG1231122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231122E(Test__ZN3aaa9GG1231122E, "_ZN3aaa9GG1231122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231122C1Ev();
extern void _ZN3aaa9GG1231122D1Ev();
Name_Map name_map__ZN3aaa9GG1231122E[] = {
  NSPAIR(_ZN3aaa9GG1231122C1Ev),
  NSPAIR(_ZN3aaa9GG1231122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1231122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231122E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12311223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12311223barEv,_ZThn8_N3aaa9GG12311223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12311223barEv,_ZThn20_N3aaa9GG12311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12311223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12311223barEv,_ZThn8_N3aaa9GG12311223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311223barEv,_ZThn20_N3aaa9GG12311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231122E[];
Class_Descriptor cd__ZN3aaa9GG1231122E = {  "_ZN3aaa9GG1231122E", // class name
  bases__ZN3aaa9GG1231122E, 6,
  &(vtc__ZN3aaa9GG1231122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231123  : ::aaa::EE123 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12311233fooEv
  virtual void  bar(); // _ZN3aaa9GG12311233barEv
  ~GG1231123(); // tgen
  GG1231123(); // tgen
};
//SIG(1 _ZN3aaa9GG1231123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12311233fooEv");}
void  aaa::GG1231123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12311233barEv");}
aaa::GG1231123 ::~GG1231123(){ note_dtor("_ZN3aaa9GG1231123E", this);} // tgen
aaa::GG1231123 ::GG1231123(){ note_ctor("_ZN3aaa9GG1231123E", this);} // tgen
}
static void Test__ZN3aaa9GG1231123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231123E, buf);
    ::aaa::GG1231123 *dp, &lv = *(dp=new (buf) ::aaa::GG1231123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231123E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1231123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1231123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1231123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231123E);
    dp->::aaa::GG1231123::~GG1231123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231123E(Test__ZN3aaa9GG1231123E, "_ZN3aaa9GG1231123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231123C1Ev();
extern void _ZN3aaa9GG1231123D1Ev();
Name_Map name_map__ZN3aaa9GG1231123E[] = {
  NSPAIR(_ZN3aaa9GG1231123C1Ev),
  NSPAIR(_ZN3aaa9GG1231123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1231123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231123E[];
extern void _ZN3aaa9GG12311233fooEv();
extern void _ZN3aaa9GG12311233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12311233barEv,_ZThn8_N3aaa9GG12311233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12311233fooEv,_ZThn20_N3aaa9GG12311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12311233barEv,_ZThn20_N3aaa9GG12311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12311233fooEv,_ZThn28_N3aaa9GG12311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12311233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12311233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12311233barEv,_ZThn8_N3aaa9GG12311233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311233fooEv,_ZThn20_N3aaa9GG12311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311233barEv,_ZThn20_N3aaa9GG12311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12311233fooEv,_ZThn28_N3aaa9GG12311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231123E[];
Class_Descriptor cd__ZN3aaa9GG1231123E = {  "_ZN3aaa9GG1231123E", // class name
  bases__ZN3aaa9GG1231123E, 6,
  &(vtc__ZN3aaa9GG1231123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231131  : ::aaa::EE123 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12311313fooEv
  ~GG1231131(); // tgen
  GG1231131(); // tgen
};
//SIG(1 _ZN3aaa9GG1231131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12311313fooEv");}
aaa::GG1231131 ::~GG1231131(){ note_dtor("_ZN3aaa9GG1231131E", this);} // tgen
aaa::GG1231131 ::GG1231131(){ note_ctor("_ZN3aaa9GG1231131E", this);} // tgen
}
static void Test__ZN3aaa9GG1231131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231131E, buf);
    ::aaa::GG1231131 *dp, &lv = *(dp=new (buf) ::aaa::GG1231131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231131E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1231131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1231131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1231131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231131E);
    dp->::aaa::GG1231131::~GG1231131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231131E(Test__ZN3aaa9GG1231131E, "_ZN3aaa9GG1231131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231131C1Ev();
extern void _ZN3aaa9GG1231131D1Ev();
Name_Map name_map__ZN3aaa9GG1231131E[] = {
  NSPAIR(_ZN3aaa9GG1231131C1Ev),
  NSPAIR(_ZN3aaa9GG1231131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1231131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231131E[];
extern void _ZN3aaa9GG12311313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12311313fooEv,_ZThn20_N3aaa9GG12311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12311313fooEv,_ZThn28_N3aaa9GG12311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12311313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311313fooEv,_ZThn20_N3aaa9GG12311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12311313fooEv,_ZThn28_N3aaa9GG12311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231131E[];
Class_Descriptor cd__ZN3aaa9GG1231131E = {  "_ZN3aaa9GG1231131E", // class name
  bases__ZN3aaa9GG1231131E, 6,
  &(vtc__ZN3aaa9GG1231131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231132  : ::aaa::EE123 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12311323barEv
  ~GG1231132(); // tgen
  GG1231132(); // tgen
};
//SIG(1 _ZN3aaa9GG1231132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12311323barEv");}
aaa::GG1231132 ::~GG1231132(){ note_dtor("_ZN3aaa9GG1231132E", this);} // tgen
aaa::GG1231132 ::GG1231132(){ note_ctor("_ZN3aaa9GG1231132E", this);} // tgen
}
static void Test__ZN3aaa9GG1231132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231132E, buf);
    ::aaa::GG1231132 *dp, &lv = *(dp=new (buf) ::aaa::GG1231132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231132E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1231132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1231132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1231132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231132E);
    dp->::aaa::GG1231132::~GG1231132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231132E(Test__ZN3aaa9GG1231132E, "_ZN3aaa9GG1231132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231132C1Ev();
extern void _ZN3aaa9GG1231132D1Ev();
Name_Map name_map__ZN3aaa9GG1231132E[] = {
  NSPAIR(_ZN3aaa9GG1231132C1Ev),
  NSPAIR(_ZN3aaa9GG1231132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1231132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231132E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12311323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12311323barEv,_ZThn8_N3aaa9GG12311323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12311323barEv,_ZThn20_N3aaa9GG12311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12311323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12311323barEv,_ZThn8_N3aaa9GG12311323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311323barEv,_ZThn20_N3aaa9GG12311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231132E[];
Class_Descriptor cd__ZN3aaa9GG1231132E = {  "_ZN3aaa9GG1231132E", // class name
  bases__ZN3aaa9GG1231132E, 6,
  &(vtc__ZN3aaa9GG1231132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231133  : ::aaa::EE123 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12311333fooEv
  virtual void  bar(); // _ZN3aaa9GG12311333barEv
  ~GG1231133(); // tgen
  GG1231133(); // tgen
};
//SIG(1 _ZN3aaa9GG1231133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12311333fooEv");}
void  aaa::GG1231133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12311333barEv");}
aaa::GG1231133 ::~GG1231133(){ note_dtor("_ZN3aaa9GG1231133E", this);} // tgen
aaa::GG1231133 ::GG1231133(){ note_ctor("_ZN3aaa9GG1231133E", this);} // tgen
}
static void Test__ZN3aaa9GG1231133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231133E, buf);
    ::aaa::GG1231133 *dp, &lv = *(dp=new (buf) ::aaa::GG1231133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231133E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1231133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1231133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1231133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231133E);
    dp->::aaa::GG1231133::~GG1231133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231133E(Test__ZN3aaa9GG1231133E, "_ZN3aaa9GG1231133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231133C1Ev();
extern void _ZN3aaa9GG1231133D1Ev();
Name_Map name_map__ZN3aaa9GG1231133E[] = {
  NSPAIR(_ZN3aaa9GG1231133C1Ev),
  NSPAIR(_ZN3aaa9GG1231133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1231133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231133E[];
extern void _ZN3aaa9GG12311333fooEv();
extern void _ZN3aaa9GG12311333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12311333barEv,_ZThn8_N3aaa9GG12311333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12311333fooEv,_ZThn20_N3aaa9GG12311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12311333barEv,_ZThn20_N3aaa9GG12311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12311333fooEv,_ZThn28_N3aaa9GG12311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12311333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12311333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12311333barEv,_ZThn8_N3aaa9GG12311333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311333fooEv,_ZThn20_N3aaa9GG12311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12311333barEv,_ZThn20_N3aaa9GG12311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12311333fooEv,_ZThn28_N3aaa9GG12311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231133E[];
Class_Descriptor cd__ZN3aaa9GG1231133E = {  "_ZN3aaa9GG1231133E", // class name
  bases__ZN3aaa9GG1231133E, 6,
  &(vtc__ZN3aaa9GG1231133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231211  : ::aaa::EE123 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12312113fooEv
  ~GG1231211(); // tgen
  GG1231211(); // tgen
};
//SIG(1 _ZN3aaa9GG1231211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12312113fooEv");}
aaa::GG1231211 ::~GG1231211(){ note_dtor("_ZN3aaa9GG1231211E", this);} // tgen
aaa::GG1231211 ::GG1231211(){ note_ctor("_ZN3aaa9GG1231211E", this);} // tgen
}
static void Test__ZN3aaa9GG1231211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231211E, buf);
    ::aaa::GG1231211 *dp, &lv = *(dp=new (buf) ::aaa::GG1231211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231211E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1231211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1231211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1231211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231211E);
    dp->::aaa::GG1231211::~GG1231211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231211E(Test__ZN3aaa9GG1231211E, "_ZN3aaa9GG1231211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231211C1Ev();
extern void _ZN3aaa9GG1231211D1Ev();
Name_Map name_map__ZN3aaa9GG1231211E[] = {
  NSPAIR(_ZN3aaa9GG1231211C1Ev),
  NSPAIR(_ZN3aaa9GG1231211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1231211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231211E[];
extern void _ZN3aaa9GG12312113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12312113fooEv,_ZThn20_N3aaa9GG12312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12312113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312113fooEv,_ZThn20_N3aaa9GG12312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231211E[];
Class_Descriptor cd__ZN3aaa9GG1231211E = {  "_ZN3aaa9GG1231211E", // class name
  bases__ZN3aaa9GG1231211E, 6,
  &(vtc__ZN3aaa9GG1231211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231212  : ::aaa::EE123 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12312123barEv
  ~GG1231212(); // tgen
  GG1231212(); // tgen
};
//SIG(1 _ZN3aaa9GG1231212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12312123barEv");}
aaa::GG1231212 ::~GG1231212(){ note_dtor("_ZN3aaa9GG1231212E", this);} // tgen
aaa::GG1231212 ::GG1231212(){ note_ctor("_ZN3aaa9GG1231212E", this);} // tgen
}
static void Test__ZN3aaa9GG1231212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231212E, buf);
    ::aaa::GG1231212 *dp, &lv = *(dp=new (buf) ::aaa::GG1231212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231212E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1231212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1231212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1231212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231212E);
    dp->::aaa::GG1231212::~GG1231212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231212E(Test__ZN3aaa9GG1231212E, "_ZN3aaa9GG1231212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231212C1Ev();
extern void _ZN3aaa9GG1231212D1Ev();
Name_Map name_map__ZN3aaa9GG1231212E[] = {
  NSPAIR(_ZN3aaa9GG1231212C1Ev),
  NSPAIR(_ZN3aaa9GG1231212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1231212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231212E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12312123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12312123barEv,_ZThn8_N3aaa9GG12312123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12312123barEv,_ZThn28_N3aaa9GG12312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12312123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12312123barEv,_ZThn8_N3aaa9GG12312123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12312123barEv,_ZThn28_N3aaa9GG12312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231212E[];
Class_Descriptor cd__ZN3aaa9GG1231212E = {  "_ZN3aaa9GG1231212E", // class name
  bases__ZN3aaa9GG1231212E, 6,
  &(vtc__ZN3aaa9GG1231212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231213  : ::aaa::EE123 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12312133fooEv
  virtual void  bar(); // _ZN3aaa9GG12312133barEv
  ~GG1231213(); // tgen
  GG1231213(); // tgen
};
//SIG(1 _ZN3aaa9GG1231213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12312133fooEv");}
void  aaa::GG1231213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12312133barEv");}
aaa::GG1231213 ::~GG1231213(){ note_dtor("_ZN3aaa9GG1231213E", this);} // tgen
aaa::GG1231213 ::GG1231213(){ note_ctor("_ZN3aaa9GG1231213E", this);} // tgen
}
static void Test__ZN3aaa9GG1231213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231213E, buf);
    ::aaa::GG1231213 *dp, &lv = *(dp=new (buf) ::aaa::GG1231213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231213E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1231213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1231213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1231213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231213E);
    dp->::aaa::GG1231213::~GG1231213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231213E(Test__ZN3aaa9GG1231213E, "_ZN3aaa9GG1231213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231213C1Ev();
extern void _ZN3aaa9GG1231213D1Ev();
Name_Map name_map__ZN3aaa9GG1231213E[] = {
  NSPAIR(_ZN3aaa9GG1231213C1Ev),
  NSPAIR(_ZN3aaa9GG1231213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1231213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231213E[];
extern void _ZN3aaa9GG12312133fooEv();
extern void _ZN3aaa9GG12312133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12312133barEv,_ZThn8_N3aaa9GG12312133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12312133fooEv,_ZThn20_N3aaa9GG12312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12312133barEv,_ZThn28_N3aaa9GG12312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12312133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12312133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12312133barEv,_ZThn8_N3aaa9GG12312133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312133fooEv,_ZThn20_N3aaa9GG12312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12312133barEv,_ZThn28_N3aaa9GG12312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231213E[];
Class_Descriptor cd__ZN3aaa9GG1231213E = {  "_ZN3aaa9GG1231213E", // class name
  bases__ZN3aaa9GG1231213E, 6,
  &(vtc__ZN3aaa9GG1231213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231221  : ::aaa::EE123 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12312213fooEv
  ~GG1231221(); // tgen
  GG1231221(); // tgen
};
//SIG(1 _ZN3aaa9GG1231221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12312213fooEv");}
aaa::GG1231221 ::~GG1231221(){ note_dtor("_ZN3aaa9GG1231221E", this);} // tgen
aaa::GG1231221 ::GG1231221(){ note_ctor("_ZN3aaa9GG1231221E", this);} // tgen
}
static void Test__ZN3aaa9GG1231221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231221E, buf);
    ::aaa::GG1231221 *dp, &lv = *(dp=new (buf) ::aaa::GG1231221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231221E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1231221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1231221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1231221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231221E);
    dp->::aaa::GG1231221::~GG1231221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231221E(Test__ZN3aaa9GG1231221E, "_ZN3aaa9GG1231221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231221C1Ev();
extern void _ZN3aaa9GG1231221D1Ev();
Name_Map name_map__ZN3aaa9GG1231221E[] = {
  NSPAIR(_ZN3aaa9GG1231221C1Ev),
  NSPAIR(_ZN3aaa9GG1231221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1231221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231221E[];
extern void _ZN3aaa9GG12312213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12312213fooEv,_ZThn20_N3aaa9GG12312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12312213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312213fooEv,_ZThn20_N3aaa9GG12312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231221E[];
Class_Descriptor cd__ZN3aaa9GG1231221E = {  "_ZN3aaa9GG1231221E", // class name
  bases__ZN3aaa9GG1231221E, 6,
  &(vtc__ZN3aaa9GG1231221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231222  : ::aaa::EE123 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12312223barEv
  ~GG1231222(); // tgen
  GG1231222(); // tgen
};
//SIG(1 _ZN3aaa9GG1231222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12312223barEv");}
aaa::GG1231222 ::~GG1231222(){ note_dtor("_ZN3aaa9GG1231222E", this);} // tgen
aaa::GG1231222 ::GG1231222(){ note_ctor("_ZN3aaa9GG1231222E", this);} // tgen
}
static void Test__ZN3aaa9GG1231222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231222E, buf);
    ::aaa::GG1231222 *dp, &lv = *(dp=new (buf) ::aaa::GG1231222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231222E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1231222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1231222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1231222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231222E);
    dp->::aaa::GG1231222::~GG1231222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231222E(Test__ZN3aaa9GG1231222E, "_ZN3aaa9GG1231222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231222C1Ev();
extern void _ZN3aaa9GG1231222D1Ev();
Name_Map name_map__ZN3aaa9GG1231222E[] = {
  NSPAIR(_ZN3aaa9GG1231222C1Ev),
  NSPAIR(_ZN3aaa9GG1231222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1231222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231222E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12312223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12312223barEv,_ZThn8_N3aaa9GG12312223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12312223barEv,_ZThn20_N3aaa9GG12312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12312223barEv,_ZThn28_N3aaa9GG12312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12312223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12312223barEv,_ZThn8_N3aaa9GG12312223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312223barEv,_ZThn20_N3aaa9GG12312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12312223barEv,_ZThn28_N3aaa9GG12312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231222E[];
Class_Descriptor cd__ZN3aaa9GG1231222E = {  "_ZN3aaa9GG1231222E", // class name
  bases__ZN3aaa9GG1231222E, 6,
  &(vtc__ZN3aaa9GG1231222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231223  : ::aaa::EE123 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12312233fooEv
  virtual void  bar(); // _ZN3aaa9GG12312233barEv
  ~GG1231223(); // tgen
  GG1231223(); // tgen
};
//SIG(1 _ZN3aaa9GG1231223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12312233fooEv");}
void  aaa::GG1231223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12312233barEv");}
aaa::GG1231223 ::~GG1231223(){ note_dtor("_ZN3aaa9GG1231223E", this);} // tgen
aaa::GG1231223 ::GG1231223(){ note_ctor("_ZN3aaa9GG1231223E", this);} // tgen
}
static void Test__ZN3aaa9GG1231223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231223E, buf);
    ::aaa::GG1231223 *dp, &lv = *(dp=new (buf) ::aaa::GG1231223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231223E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1231223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1231223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1231223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231223E);
    dp->::aaa::GG1231223::~GG1231223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231223E(Test__ZN3aaa9GG1231223E, "_ZN3aaa9GG1231223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231223C1Ev();
extern void _ZN3aaa9GG1231223D1Ev();
Name_Map name_map__ZN3aaa9GG1231223E[] = {
  NSPAIR(_ZN3aaa9GG1231223C1Ev),
  NSPAIR(_ZN3aaa9GG1231223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1231223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231223E[];
extern void _ZN3aaa9GG12312233fooEv();
extern void _ZN3aaa9GG12312233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12312233barEv,_ZThn8_N3aaa9GG12312233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12312233fooEv,_ZThn20_N3aaa9GG12312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12312233barEv,_ZThn20_N3aaa9GG12312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12312233barEv,_ZThn28_N3aaa9GG12312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12312233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12312233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12312233barEv,_ZThn8_N3aaa9GG12312233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312233fooEv,_ZThn20_N3aaa9GG12312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312233barEv,_ZThn20_N3aaa9GG12312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12312233barEv,_ZThn28_N3aaa9GG12312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231223E[];
Class_Descriptor cd__ZN3aaa9GG1231223E = {  "_ZN3aaa9GG1231223E", // class name
  bases__ZN3aaa9GG1231223E, 6,
  &(vtc__ZN3aaa9GG1231223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231231  : ::aaa::EE123 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12312313fooEv
  ~GG1231231(); // tgen
  GG1231231(); // tgen
};
//SIG(1 _ZN3aaa9GG1231231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12312313fooEv");}
aaa::GG1231231 ::~GG1231231(){ note_dtor("_ZN3aaa9GG1231231E", this);} // tgen
aaa::GG1231231 ::GG1231231(){ note_ctor("_ZN3aaa9GG1231231E", this);} // tgen
}
static void Test__ZN3aaa9GG1231231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231231E, buf);
    ::aaa::GG1231231 *dp, &lv = *(dp=new (buf) ::aaa::GG1231231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231231E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1231231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1231231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1231231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231231E);
    dp->::aaa::GG1231231::~GG1231231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231231E(Test__ZN3aaa9GG1231231E, "_ZN3aaa9GG1231231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231231C1Ev();
extern void _ZN3aaa9GG1231231D1Ev();
Name_Map name_map__ZN3aaa9GG1231231E[] = {
  NSPAIR(_ZN3aaa9GG1231231C1Ev),
  NSPAIR(_ZN3aaa9GG1231231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1231231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231231E[];
extern void _ZN3aaa9GG12312313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12312313fooEv,_ZThn20_N3aaa9GG12312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12312313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312313fooEv,_ZThn20_N3aaa9GG12312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231231E[];
Class_Descriptor cd__ZN3aaa9GG1231231E = {  "_ZN3aaa9GG1231231E", // class name
  bases__ZN3aaa9GG1231231E, 6,
  &(vtc__ZN3aaa9GG1231231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231232  : ::aaa::EE123 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12312323barEv
  ~GG1231232(); // tgen
  GG1231232(); // tgen
};
//SIG(1 _ZN3aaa9GG1231232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12312323barEv");}
aaa::GG1231232 ::~GG1231232(){ note_dtor("_ZN3aaa9GG1231232E", this);} // tgen
aaa::GG1231232 ::GG1231232(){ note_ctor("_ZN3aaa9GG1231232E", this);} // tgen
}
static void Test__ZN3aaa9GG1231232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231232E, buf);
    ::aaa::GG1231232 *dp, &lv = *(dp=new (buf) ::aaa::GG1231232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231232E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1231232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1231232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1231232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231232E);
    dp->::aaa::GG1231232::~GG1231232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231232E(Test__ZN3aaa9GG1231232E, "_ZN3aaa9GG1231232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231232C1Ev();
extern void _ZN3aaa9GG1231232D1Ev();
Name_Map name_map__ZN3aaa9GG1231232E[] = {
  NSPAIR(_ZN3aaa9GG1231232C1Ev),
  NSPAIR(_ZN3aaa9GG1231232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1231232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231232E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12312323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12312323barEv,_ZThn8_N3aaa9GG12312323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12312323barEv,_ZThn20_N3aaa9GG12312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12312323barEv,_ZThn28_N3aaa9GG12312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12312323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12312323barEv,_ZThn8_N3aaa9GG12312323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312323barEv,_ZThn20_N3aaa9GG12312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12312323barEv,_ZThn28_N3aaa9GG12312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231232E[];
Class_Descriptor cd__ZN3aaa9GG1231232E = {  "_ZN3aaa9GG1231232E", // class name
  bases__ZN3aaa9GG1231232E, 6,
  &(vtc__ZN3aaa9GG1231232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231233  : ::aaa::EE123 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12312333fooEv
  virtual void  bar(); // _ZN3aaa9GG12312333barEv
  ~GG1231233(); // tgen
  GG1231233(); // tgen
};
//SIG(1 _ZN3aaa9GG1231233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12312333fooEv");}
void  aaa::GG1231233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12312333barEv");}
aaa::GG1231233 ::~GG1231233(){ note_dtor("_ZN3aaa9GG1231233E", this);} // tgen
aaa::GG1231233 ::GG1231233(){ note_ctor("_ZN3aaa9GG1231233E", this);} // tgen
}
static void Test__ZN3aaa9GG1231233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231233E, buf);
    ::aaa::GG1231233 *dp, &lv = *(dp=new (buf) ::aaa::GG1231233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231233E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1231233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1231233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1231233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231233E);
    dp->::aaa::GG1231233::~GG1231233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231233E(Test__ZN3aaa9GG1231233E, "_ZN3aaa9GG1231233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231233C1Ev();
extern void _ZN3aaa9GG1231233D1Ev();
Name_Map name_map__ZN3aaa9GG1231233E[] = {
  NSPAIR(_ZN3aaa9GG1231233C1Ev),
  NSPAIR(_ZN3aaa9GG1231233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1231233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231233E[];
extern void _ZN3aaa9GG12312333fooEv();
extern void _ZN3aaa9GG12312333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12312333barEv,_ZThn8_N3aaa9GG12312333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12312333fooEv,_ZThn20_N3aaa9GG12312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12312333barEv,_ZThn20_N3aaa9GG12312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12312333barEv,_ZThn28_N3aaa9GG12312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12312333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12312333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12312333barEv,_ZThn8_N3aaa9GG12312333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312333fooEv,_ZThn20_N3aaa9GG12312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12312333barEv,_ZThn20_N3aaa9GG12312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12312333barEv,_ZThn28_N3aaa9GG12312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231233E[];
Class_Descriptor cd__ZN3aaa9GG1231233E = {  "_ZN3aaa9GG1231233E", // class name
  bases__ZN3aaa9GG1231233E, 6,
  &(vtc__ZN3aaa9GG1231233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231311  : ::aaa::EE123 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12313113fooEv
  ~GG1231311(); // tgen
  GG1231311(); // tgen
};
//SIG(1 _ZN3aaa9GG1231311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12313113fooEv");}
aaa::GG1231311 ::~GG1231311(){ note_dtor("_ZN3aaa9GG1231311E", this);} // tgen
aaa::GG1231311 ::GG1231311(){ note_ctor("_ZN3aaa9GG1231311E", this);} // tgen
}
static void Test__ZN3aaa9GG1231311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231311E, buf);
    ::aaa::GG1231311 *dp, &lv = *(dp=new (buf) ::aaa::GG1231311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231311E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1231311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1231311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1231311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231311E);
    dp->::aaa::GG1231311::~GG1231311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231311E(Test__ZN3aaa9GG1231311E, "_ZN3aaa9GG1231311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231311C1Ev();
extern void _ZN3aaa9GG1231311D1Ev();
Name_Map name_map__ZN3aaa9GG1231311E[] = {
  NSPAIR(_ZN3aaa9GG1231311C1Ev),
  NSPAIR(_ZN3aaa9GG1231311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1231311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231311E[];
extern void _ZN3aaa9GG12313113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12313113fooEv,_ZThn20_N3aaa9GG12313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313113fooEv,_ZThn28_N3aaa9GG12313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12313113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313113fooEv,_ZThn20_N3aaa9GG12313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313113fooEv,_ZThn28_N3aaa9GG12313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231311E[];
Class_Descriptor cd__ZN3aaa9GG1231311E = {  "_ZN3aaa9GG1231311E", // class name
  bases__ZN3aaa9GG1231311E, 6,
  &(vtc__ZN3aaa9GG1231311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231312  : ::aaa::EE123 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12313123barEv
  ~GG1231312(); // tgen
  GG1231312(); // tgen
};
//SIG(1 _ZN3aaa9GG1231312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12313123barEv");}
aaa::GG1231312 ::~GG1231312(){ note_dtor("_ZN3aaa9GG1231312E", this);} // tgen
aaa::GG1231312 ::GG1231312(){ note_ctor("_ZN3aaa9GG1231312E", this);} // tgen
}
static void Test__ZN3aaa9GG1231312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231312E, buf);
    ::aaa::GG1231312 *dp, &lv = *(dp=new (buf) ::aaa::GG1231312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231312E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1231312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1231312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1231312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231312E);
    dp->::aaa::GG1231312::~GG1231312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231312E(Test__ZN3aaa9GG1231312E, "_ZN3aaa9GG1231312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231312C1Ev();
extern void _ZN3aaa9GG1231312D1Ev();
Name_Map name_map__ZN3aaa9GG1231312E[] = {
  NSPAIR(_ZN3aaa9GG1231312C1Ev),
  NSPAIR(_ZN3aaa9GG1231312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1231312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231312E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12313123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12313123barEv,_ZThn8_N3aaa9GG12313123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313123barEv,_ZThn28_N3aaa9GG12313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12313123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12313123barEv,_ZThn8_N3aaa9GG12313123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313123barEv,_ZThn28_N3aaa9GG12313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231312E[];
Class_Descriptor cd__ZN3aaa9GG1231312E = {  "_ZN3aaa9GG1231312E", // class name
  bases__ZN3aaa9GG1231312E, 6,
  &(vtc__ZN3aaa9GG1231312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231313  : ::aaa::EE123 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12313133fooEv
  virtual void  bar(); // _ZN3aaa9GG12313133barEv
  ~GG1231313(); // tgen
  GG1231313(); // tgen
};
//SIG(1 _ZN3aaa9GG1231313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12313133fooEv");}
void  aaa::GG1231313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12313133barEv");}
aaa::GG1231313 ::~GG1231313(){ note_dtor("_ZN3aaa9GG1231313E", this);} // tgen
aaa::GG1231313 ::GG1231313(){ note_ctor("_ZN3aaa9GG1231313E", this);} // tgen
}
static void Test__ZN3aaa9GG1231313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231313E, buf);
    ::aaa::GG1231313 *dp, &lv = *(dp=new (buf) ::aaa::GG1231313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231313E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1231313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1231313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1231313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231313E);
    dp->::aaa::GG1231313::~GG1231313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231313E(Test__ZN3aaa9GG1231313E, "_ZN3aaa9GG1231313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231313C1Ev();
extern void _ZN3aaa9GG1231313D1Ev();
Name_Map name_map__ZN3aaa9GG1231313E[] = {
  NSPAIR(_ZN3aaa9GG1231313C1Ev),
  NSPAIR(_ZN3aaa9GG1231313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1231313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231313E[];
extern void _ZN3aaa9GG12313133fooEv();
extern void _ZN3aaa9GG12313133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12313133barEv,_ZThn8_N3aaa9GG12313133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12313133fooEv,_ZThn20_N3aaa9GG12313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313133fooEv,_ZThn28_N3aaa9GG12313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313133barEv,_ZThn28_N3aaa9GG12313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12313133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12313133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12313133barEv,_ZThn8_N3aaa9GG12313133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313133fooEv,_ZThn20_N3aaa9GG12313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313133fooEv,_ZThn28_N3aaa9GG12313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313133barEv,_ZThn28_N3aaa9GG12313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231313E[];
Class_Descriptor cd__ZN3aaa9GG1231313E = {  "_ZN3aaa9GG1231313E", // class name
  bases__ZN3aaa9GG1231313E, 6,
  &(vtc__ZN3aaa9GG1231313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231321  : ::aaa::EE123 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12313213fooEv
  ~GG1231321(); // tgen
  GG1231321(); // tgen
};
//SIG(1 _ZN3aaa9GG1231321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12313213fooEv");}
aaa::GG1231321 ::~GG1231321(){ note_dtor("_ZN3aaa9GG1231321E", this);} // tgen
aaa::GG1231321 ::GG1231321(){ note_ctor("_ZN3aaa9GG1231321E", this);} // tgen
}
static void Test__ZN3aaa9GG1231321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231321E, buf);
    ::aaa::GG1231321 *dp, &lv = *(dp=new (buf) ::aaa::GG1231321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231321E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1231321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1231321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1231321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231321E);
    dp->::aaa::GG1231321::~GG1231321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231321E(Test__ZN3aaa9GG1231321E, "_ZN3aaa9GG1231321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231321C1Ev();
extern void _ZN3aaa9GG1231321D1Ev();
Name_Map name_map__ZN3aaa9GG1231321E[] = {
  NSPAIR(_ZN3aaa9GG1231321C1Ev),
  NSPAIR(_ZN3aaa9GG1231321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1231321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231321E[];
extern void _ZN3aaa9GG12313213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12313213fooEv,_ZThn20_N3aaa9GG12313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12313213fooEv,_ZThn28_N3aaa9GG12313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12313213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313213fooEv,_ZThn20_N3aaa9GG12313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313213fooEv,_ZThn28_N3aaa9GG12313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231321E[];
Class_Descriptor cd__ZN3aaa9GG1231321E = {  "_ZN3aaa9GG1231321E", // class name
  bases__ZN3aaa9GG1231321E, 6,
  &(vtc__ZN3aaa9GG1231321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231322  : ::aaa::EE123 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12313223barEv
  ~GG1231322(); // tgen
  GG1231322(); // tgen
};
//SIG(1 _ZN3aaa9GG1231322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12313223barEv");}
aaa::GG1231322 ::~GG1231322(){ note_dtor("_ZN3aaa9GG1231322E", this);} // tgen
aaa::GG1231322 ::GG1231322(){ note_ctor("_ZN3aaa9GG1231322E", this);} // tgen
}
static void Test__ZN3aaa9GG1231322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231322E, buf);
    ::aaa::GG1231322 *dp, &lv = *(dp=new (buf) ::aaa::GG1231322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231322E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1231322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1231322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1231322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231322E);
    dp->::aaa::GG1231322::~GG1231322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231322E(Test__ZN3aaa9GG1231322E, "_ZN3aaa9GG1231322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231322C1Ev();
extern void _ZN3aaa9GG1231322D1Ev();
Name_Map name_map__ZN3aaa9GG1231322E[] = {
  NSPAIR(_ZN3aaa9GG1231322C1Ev),
  NSPAIR(_ZN3aaa9GG1231322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1231322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231322E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12313223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12313223barEv,_ZThn8_N3aaa9GG12313223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12313223barEv,_ZThn20_N3aaa9GG12313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12313223barEv,_ZThn28_N3aaa9GG12313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12313223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12313223barEv,_ZThn8_N3aaa9GG12313223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313223barEv,_ZThn20_N3aaa9GG12313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313223barEv,_ZThn28_N3aaa9GG12313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231322E[];
Class_Descriptor cd__ZN3aaa9GG1231322E = {  "_ZN3aaa9GG1231322E", // class name
  bases__ZN3aaa9GG1231322E, 6,
  &(vtc__ZN3aaa9GG1231322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231323  : ::aaa::EE123 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12313233fooEv
  virtual void  bar(); // _ZN3aaa9GG12313233barEv
  ~GG1231323(); // tgen
  GG1231323(); // tgen
};
//SIG(1 _ZN3aaa9GG1231323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12313233fooEv");}
void  aaa::GG1231323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12313233barEv");}
aaa::GG1231323 ::~GG1231323(){ note_dtor("_ZN3aaa9GG1231323E", this);} // tgen
aaa::GG1231323 ::GG1231323(){ note_ctor("_ZN3aaa9GG1231323E", this);} // tgen
}
static void Test__ZN3aaa9GG1231323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231323E, buf);
    ::aaa::GG1231323 *dp, &lv = *(dp=new (buf) ::aaa::GG1231323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231323E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1231323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1231323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1231323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231323E);
    dp->::aaa::GG1231323::~GG1231323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231323E(Test__ZN3aaa9GG1231323E, "_ZN3aaa9GG1231323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231323C1Ev();
extern void _ZN3aaa9GG1231323D1Ev();
Name_Map name_map__ZN3aaa9GG1231323E[] = {
  NSPAIR(_ZN3aaa9GG1231323C1Ev),
  NSPAIR(_ZN3aaa9GG1231323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1231323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231323E[];
extern void _ZN3aaa9GG12313233fooEv();
extern void _ZN3aaa9GG12313233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12313233barEv,_ZThn8_N3aaa9GG12313233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12313233fooEv,_ZThn20_N3aaa9GG12313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12313233barEv,_ZThn20_N3aaa9GG12313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313233fooEv,_ZThn28_N3aaa9GG12313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313233barEv,_ZThn28_N3aaa9GG12313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12313233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12313233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12313233barEv,_ZThn8_N3aaa9GG12313233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313233fooEv,_ZThn20_N3aaa9GG12313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313233barEv,_ZThn20_N3aaa9GG12313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313233fooEv,_ZThn28_N3aaa9GG12313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313233barEv,_ZThn28_N3aaa9GG12313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231323E[];
Class_Descriptor cd__ZN3aaa9GG1231323E = {  "_ZN3aaa9GG1231323E", // class name
  bases__ZN3aaa9GG1231323E, 6,
  &(vtc__ZN3aaa9GG1231323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231331  : ::aaa::EE123 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12313313fooEv
  ~GG1231331(); // tgen
  GG1231331(); // tgen
};
//SIG(1 _ZN3aaa9GG1231331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12313313fooEv");}
aaa::GG1231331 ::~GG1231331(){ note_dtor("_ZN3aaa9GG1231331E", this);} // tgen
aaa::GG1231331 ::GG1231331(){ note_ctor("_ZN3aaa9GG1231331E", this);} // tgen
}
static void Test__ZN3aaa9GG1231331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231331E, buf);
    ::aaa::GG1231331 *dp, &lv = *(dp=new (buf) ::aaa::GG1231331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231331E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1231331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1231331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1231331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231331E);
    dp->::aaa::GG1231331::~GG1231331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231331E(Test__ZN3aaa9GG1231331E, "_ZN3aaa9GG1231331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231331C1Ev();
extern void _ZN3aaa9GG1231331D1Ev();
Name_Map name_map__ZN3aaa9GG1231331E[] = {
  NSPAIR(_ZN3aaa9GG1231331C1Ev),
  NSPAIR(_ZN3aaa9GG1231331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1231331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231331E[];
extern void _ZN3aaa9GG12313313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12313313fooEv,_ZThn20_N3aaa9GG12313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12313313fooEv,_ZThn28_N3aaa9GG12313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12313313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313313fooEv,_ZThn20_N3aaa9GG12313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313313fooEv,_ZThn28_N3aaa9GG12313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231331E[];
Class_Descriptor cd__ZN3aaa9GG1231331E = {  "_ZN3aaa9GG1231331E", // class name
  bases__ZN3aaa9GG1231331E, 6,
  &(vtc__ZN3aaa9GG1231331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231332  : ::aaa::EE123 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12313323barEv
  ~GG1231332(); // tgen
  GG1231332(); // tgen
};
//SIG(1 _ZN3aaa9GG1231332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1231332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12313323barEv");}
aaa::GG1231332 ::~GG1231332(){ note_dtor("_ZN3aaa9GG1231332E", this);} // tgen
aaa::GG1231332 ::GG1231332(){ note_ctor("_ZN3aaa9GG1231332E", this);} // tgen
}
static void Test__ZN3aaa9GG1231332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231332E, buf);
    ::aaa::GG1231332 *dp, &lv = *(dp=new (buf) ::aaa::GG1231332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231332E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1231332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1231332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1231332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231332E);
    dp->::aaa::GG1231332::~GG1231332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231332E(Test__ZN3aaa9GG1231332E, "_ZN3aaa9GG1231332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231332C1Ev();
extern void _ZN3aaa9GG1231332D1Ev();
Name_Map name_map__ZN3aaa9GG1231332E[] = {
  NSPAIR(_ZN3aaa9GG1231332C1Ev),
  NSPAIR(_ZN3aaa9GG1231332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1231332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231332E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12313323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12313323barEv,_ZThn8_N3aaa9GG12313323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12313323barEv,_ZThn20_N3aaa9GG12313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313323barEv,_ZThn28_N3aaa9GG12313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12313323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12313323barEv,_ZThn8_N3aaa9GG12313323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313323barEv,_ZThn20_N3aaa9GG12313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313323barEv,_ZThn28_N3aaa9GG12313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231332E[];
Class_Descriptor cd__ZN3aaa9GG1231332E = {  "_ZN3aaa9GG1231332E", // class name
  bases__ZN3aaa9GG1231332E, 6,
  &(vtc__ZN3aaa9GG1231332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1231333  : ::aaa::EE123 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12313333fooEv
  virtual void  bar(); // _ZN3aaa9GG12313333barEv
  ~GG1231333(); // tgen
  GG1231333(); // tgen
};
//SIG(1 _ZN3aaa9GG1231333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1231333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12313333fooEv");}
void  aaa::GG1231333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12313333barEv");}
aaa::GG1231333 ::~GG1231333(){ note_dtor("_ZN3aaa9GG1231333E", this);} // tgen
aaa::GG1231333 ::GG1231333(){ note_ctor("_ZN3aaa9GG1231333E", this);} // tgen
}
static void Test__ZN3aaa9GG1231333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1231333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1231333E, buf);
    ::aaa::GG1231333 *dp, &lv = *(dp=new (buf) ::aaa::GG1231333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1231333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1231333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1231333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1231333E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1231333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1231333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1231333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1231333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1231333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1231333E);
    dp->::aaa::GG1231333::~GG1231333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1231333E(Test__ZN3aaa9GG1231333E, "_ZN3aaa9GG1231333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1231333C1Ev();
extern void _ZN3aaa9GG1231333D1Ev();
Name_Map name_map__ZN3aaa9GG1231333E[] = {
  NSPAIR(_ZN3aaa9GG1231333C1Ev),
  NSPAIR(_ZN3aaa9GG1231333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1231333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1231333E[];
extern void _ZN3aaa9GG12313333fooEv();
extern void _ZN3aaa9GG12313333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12313333barEv,_ZThn8_N3aaa9GG12313333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12313333fooEv,_ZThn20_N3aaa9GG12313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12313333barEv,_ZThn20_N3aaa9GG12313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313333fooEv,_ZThn28_N3aaa9GG12313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12313333barEv,_ZThn28_N3aaa9GG12313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1231333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12313333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12313333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12313333barEv,_ZThn8_N3aaa9GG12313333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313333fooEv,_ZThn20_N3aaa9GG12313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12313333barEv,_ZThn20_N3aaa9GG12313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313333fooEv,_ZThn28_N3aaa9GG12313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12313333barEv,_ZThn28_N3aaa9GG12313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1231333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1231333E[];
Class_Descriptor cd__ZN3aaa9GG1231333E = {  "_ZN3aaa9GG1231333E", // class name
  bases__ZN3aaa9GG1231333E, 6,
  &(vtc__ZN3aaa9GG1231333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1231333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1231333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232111  : ::aaa::EE123 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12321113fooEv
  ~GG1232111(); // tgen
  GG1232111(); // tgen
};
//SIG(1 _ZN3aaa9GG1232111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12321113fooEv");}
aaa::GG1232111 ::~GG1232111(){ note_dtor("_ZN3aaa9GG1232111E", this);} // tgen
aaa::GG1232111 ::GG1232111(){ note_ctor("_ZN3aaa9GG1232111E", this);} // tgen
}
static void Test__ZN3aaa9GG1232111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232111E, buf);
    ::aaa::GG1232111 *dp, &lv = *(dp=new (buf) ::aaa::GG1232111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232111E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1232111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1232111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1232111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232111E);
    dp->::aaa::GG1232111::~GG1232111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232111E(Test__ZN3aaa9GG1232111E, "_ZN3aaa9GG1232111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232111C1Ev();
extern void _ZN3aaa9GG1232111D1Ev();
Name_Map name_map__ZN3aaa9GG1232111E[] = {
  NSPAIR(_ZN3aaa9GG1232111C1Ev),
  NSPAIR(_ZN3aaa9GG1232111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1232111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232111E[];
extern void _ZN3aaa9GG12321113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12321113fooEv,_ZThn20_N3aaa9GG12321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12321113fooEv,_ZThn28_N3aaa9GG12321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12321113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321113fooEv,_ZThn20_N3aaa9GG12321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12321113fooEv,_ZThn28_N3aaa9GG12321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232111E[];
Class_Descriptor cd__ZN3aaa9GG1232111E = {  "_ZN3aaa9GG1232111E", // class name
  bases__ZN3aaa9GG1232111E, 6,
  &(vtc__ZN3aaa9GG1232111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232112  : ::aaa::EE123 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12321123barEv
  ~GG1232112(); // tgen
  GG1232112(); // tgen
};
//SIG(1 _ZN3aaa9GG1232112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12321123barEv");}
aaa::GG1232112 ::~GG1232112(){ note_dtor("_ZN3aaa9GG1232112E", this);} // tgen
aaa::GG1232112 ::GG1232112(){ note_ctor("_ZN3aaa9GG1232112E", this);} // tgen
}
static void Test__ZN3aaa9GG1232112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232112E, buf);
    ::aaa::GG1232112 *dp, &lv = *(dp=new (buf) ::aaa::GG1232112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232112E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1232112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1232112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1232112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232112E);
    dp->::aaa::GG1232112::~GG1232112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232112E(Test__ZN3aaa9GG1232112E, "_ZN3aaa9GG1232112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232112C1Ev();
extern void _ZN3aaa9GG1232112D1Ev();
Name_Map name_map__ZN3aaa9GG1232112E[] = {
  NSPAIR(_ZN3aaa9GG1232112C1Ev),
  NSPAIR(_ZN3aaa9GG1232112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1232112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232112E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12321123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12321123barEv,_ZThn8_N3aaa9GG12321123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12321123barEv,_ZThn20_N3aaa9GG12321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12321123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12321123barEv,_ZThn8_N3aaa9GG12321123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321123barEv,_ZThn20_N3aaa9GG12321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232112E[];
Class_Descriptor cd__ZN3aaa9GG1232112E = {  "_ZN3aaa9GG1232112E", // class name
  bases__ZN3aaa9GG1232112E, 6,
  &(vtc__ZN3aaa9GG1232112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232113  : ::aaa::EE123 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12321133fooEv
  virtual void  bar(); // _ZN3aaa9GG12321133barEv
  ~GG1232113(); // tgen
  GG1232113(); // tgen
};
//SIG(1 _ZN3aaa9GG1232113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12321133fooEv");}
void  aaa::GG1232113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12321133barEv");}
aaa::GG1232113 ::~GG1232113(){ note_dtor("_ZN3aaa9GG1232113E", this);} // tgen
aaa::GG1232113 ::GG1232113(){ note_ctor("_ZN3aaa9GG1232113E", this);} // tgen
}
static void Test__ZN3aaa9GG1232113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232113E, buf);
    ::aaa::GG1232113 *dp, &lv = *(dp=new (buf) ::aaa::GG1232113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232113E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1232113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1232113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1232113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232113E);
    dp->::aaa::GG1232113::~GG1232113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232113E(Test__ZN3aaa9GG1232113E, "_ZN3aaa9GG1232113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232113C1Ev();
extern void _ZN3aaa9GG1232113D1Ev();
Name_Map name_map__ZN3aaa9GG1232113E[] = {
  NSPAIR(_ZN3aaa9GG1232113C1Ev),
  NSPAIR(_ZN3aaa9GG1232113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1232113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232113E[];
extern void _ZN3aaa9GG12321133fooEv();
extern void _ZN3aaa9GG12321133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12321133barEv,_ZThn8_N3aaa9GG12321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12321133barEv,_ZThn20_N3aaa9GG12321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12321133fooEv,_ZThn20_N3aaa9GG12321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12321133fooEv,_ZThn28_N3aaa9GG12321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12321133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12321133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12321133barEv,_ZThn8_N3aaa9GG12321133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321133barEv,_ZThn20_N3aaa9GG12321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321133fooEv,_ZThn20_N3aaa9GG12321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12321133fooEv,_ZThn28_N3aaa9GG12321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232113E[];
Class_Descriptor cd__ZN3aaa9GG1232113E = {  "_ZN3aaa9GG1232113E", // class name
  bases__ZN3aaa9GG1232113E, 6,
  &(vtc__ZN3aaa9GG1232113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232121  : ::aaa::EE123 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12321213fooEv
  ~GG1232121(); // tgen
  GG1232121(); // tgen
};
//SIG(1 _ZN3aaa9GG1232121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12321213fooEv");}
aaa::GG1232121 ::~GG1232121(){ note_dtor("_ZN3aaa9GG1232121E", this);} // tgen
aaa::GG1232121 ::GG1232121(){ note_ctor("_ZN3aaa9GG1232121E", this);} // tgen
}
static void Test__ZN3aaa9GG1232121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232121E, buf);
    ::aaa::GG1232121 *dp, &lv = *(dp=new (buf) ::aaa::GG1232121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232121E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1232121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1232121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1232121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232121E);
    dp->::aaa::GG1232121::~GG1232121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232121E(Test__ZN3aaa9GG1232121E, "_ZN3aaa9GG1232121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232121C1Ev();
extern void _ZN3aaa9GG1232121D1Ev();
Name_Map name_map__ZN3aaa9GG1232121E[] = {
  NSPAIR(_ZN3aaa9GG1232121C1Ev),
  NSPAIR(_ZN3aaa9GG1232121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1232121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232121E[];
extern void _ZN3aaa9GG12321213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12321213fooEv,_ZThn28_N3aaa9GG12321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12321213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12321213fooEv,_ZThn28_N3aaa9GG12321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232121E[];
Class_Descriptor cd__ZN3aaa9GG1232121E = {  "_ZN3aaa9GG1232121E", // class name
  bases__ZN3aaa9GG1232121E, 6,
  &(vtc__ZN3aaa9GG1232121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232122  : ::aaa::EE123 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12321223barEv
  ~GG1232122(); // tgen
  GG1232122(); // tgen
};
//SIG(1 _ZN3aaa9GG1232122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12321223barEv");}
aaa::GG1232122 ::~GG1232122(){ note_dtor("_ZN3aaa9GG1232122E", this);} // tgen
aaa::GG1232122 ::GG1232122(){ note_ctor("_ZN3aaa9GG1232122E", this);} // tgen
}
static void Test__ZN3aaa9GG1232122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232122E, buf);
    ::aaa::GG1232122 *dp, &lv = *(dp=new (buf) ::aaa::GG1232122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232122E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1232122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1232122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1232122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232122E);
    dp->::aaa::GG1232122::~GG1232122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232122E(Test__ZN3aaa9GG1232122E, "_ZN3aaa9GG1232122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232122C1Ev();
extern void _ZN3aaa9GG1232122D1Ev();
Name_Map name_map__ZN3aaa9GG1232122E[] = {
  NSPAIR(_ZN3aaa9GG1232122C1Ev),
  NSPAIR(_ZN3aaa9GG1232122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1232122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232122E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12321223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12321223barEv,_ZThn8_N3aaa9GG12321223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12321223barEv,_ZThn20_N3aaa9GG12321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12321223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12321223barEv,_ZThn8_N3aaa9GG12321223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321223barEv,_ZThn20_N3aaa9GG12321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232122E[];
Class_Descriptor cd__ZN3aaa9GG1232122E = {  "_ZN3aaa9GG1232122E", // class name
  bases__ZN3aaa9GG1232122E, 6,
  &(vtc__ZN3aaa9GG1232122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232123  : ::aaa::EE123 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12321233fooEv
  virtual void  bar(); // _ZN3aaa9GG12321233barEv
  ~GG1232123(); // tgen
  GG1232123(); // tgen
};
//SIG(1 _ZN3aaa9GG1232123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12321233fooEv");}
void  aaa::GG1232123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12321233barEv");}
aaa::GG1232123 ::~GG1232123(){ note_dtor("_ZN3aaa9GG1232123E", this);} // tgen
aaa::GG1232123 ::GG1232123(){ note_ctor("_ZN3aaa9GG1232123E", this);} // tgen
}
static void Test__ZN3aaa9GG1232123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232123E, buf);
    ::aaa::GG1232123 *dp, &lv = *(dp=new (buf) ::aaa::GG1232123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232123E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1232123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1232123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1232123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232123E);
    dp->::aaa::GG1232123::~GG1232123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232123E(Test__ZN3aaa9GG1232123E, "_ZN3aaa9GG1232123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232123C1Ev();
extern void _ZN3aaa9GG1232123D1Ev();
Name_Map name_map__ZN3aaa9GG1232123E[] = {
  NSPAIR(_ZN3aaa9GG1232123C1Ev),
  NSPAIR(_ZN3aaa9GG1232123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1232123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232123E[];
extern void _ZN3aaa9GG12321233fooEv();
extern void _ZN3aaa9GG12321233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12321233barEv,_ZThn8_N3aaa9GG12321233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12321233barEv,_ZThn20_N3aaa9GG12321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12321233fooEv,_ZThn28_N3aaa9GG12321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12321233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12321233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12321233barEv,_ZThn8_N3aaa9GG12321233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321233barEv,_ZThn20_N3aaa9GG12321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12321233fooEv,_ZThn28_N3aaa9GG12321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232123E[];
Class_Descriptor cd__ZN3aaa9GG1232123E = {  "_ZN3aaa9GG1232123E", // class name
  bases__ZN3aaa9GG1232123E, 6,
  &(vtc__ZN3aaa9GG1232123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232131  : ::aaa::EE123 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12321313fooEv
  ~GG1232131(); // tgen
  GG1232131(); // tgen
};
//SIG(1 _ZN3aaa9GG1232131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12321313fooEv");}
aaa::GG1232131 ::~GG1232131(){ note_dtor("_ZN3aaa9GG1232131E", this);} // tgen
aaa::GG1232131 ::GG1232131(){ note_ctor("_ZN3aaa9GG1232131E", this);} // tgen
}
static void Test__ZN3aaa9GG1232131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232131E, buf);
    ::aaa::GG1232131 *dp, &lv = *(dp=new (buf) ::aaa::GG1232131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232131E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1232131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1232131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1232131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232131E);
    dp->::aaa::GG1232131::~GG1232131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232131E(Test__ZN3aaa9GG1232131E, "_ZN3aaa9GG1232131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232131C1Ev();
extern void _ZN3aaa9GG1232131D1Ev();
Name_Map name_map__ZN3aaa9GG1232131E[] = {
  NSPAIR(_ZN3aaa9GG1232131C1Ev),
  NSPAIR(_ZN3aaa9GG1232131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1232131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232131E[];
extern void _ZN3aaa9GG12321313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12321313fooEv,_ZThn20_N3aaa9GG12321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12321313fooEv,_ZThn28_N3aaa9GG12321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12321313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321313fooEv,_ZThn20_N3aaa9GG12321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12321313fooEv,_ZThn28_N3aaa9GG12321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232131E[];
Class_Descriptor cd__ZN3aaa9GG1232131E = {  "_ZN3aaa9GG1232131E", // class name
  bases__ZN3aaa9GG1232131E, 6,
  &(vtc__ZN3aaa9GG1232131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232132  : ::aaa::EE123 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12321323barEv
  ~GG1232132(); // tgen
  GG1232132(); // tgen
};
//SIG(1 _ZN3aaa9GG1232132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12321323barEv");}
aaa::GG1232132 ::~GG1232132(){ note_dtor("_ZN3aaa9GG1232132E", this);} // tgen
aaa::GG1232132 ::GG1232132(){ note_ctor("_ZN3aaa9GG1232132E", this);} // tgen
}
static void Test__ZN3aaa9GG1232132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232132E, buf);
    ::aaa::GG1232132 *dp, &lv = *(dp=new (buf) ::aaa::GG1232132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232132E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1232132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1232132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1232132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232132E);
    dp->::aaa::GG1232132::~GG1232132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232132E(Test__ZN3aaa9GG1232132E, "_ZN3aaa9GG1232132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232132C1Ev();
extern void _ZN3aaa9GG1232132D1Ev();
Name_Map name_map__ZN3aaa9GG1232132E[] = {
  NSPAIR(_ZN3aaa9GG1232132C1Ev),
  NSPAIR(_ZN3aaa9GG1232132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1232132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232132E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12321323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12321323barEv,_ZThn8_N3aaa9GG12321323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12321323barEv,_ZThn20_N3aaa9GG12321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12321323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12321323barEv,_ZThn8_N3aaa9GG12321323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321323barEv,_ZThn20_N3aaa9GG12321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232132E[];
Class_Descriptor cd__ZN3aaa9GG1232132E = {  "_ZN3aaa9GG1232132E", // class name
  bases__ZN3aaa9GG1232132E, 6,
  &(vtc__ZN3aaa9GG1232132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232133  : ::aaa::EE123 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12321333fooEv
  virtual void  bar(); // _ZN3aaa9GG12321333barEv
  ~GG1232133(); // tgen
  GG1232133(); // tgen
};
//SIG(1 _ZN3aaa9GG1232133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12321333fooEv");}
void  aaa::GG1232133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12321333barEv");}
aaa::GG1232133 ::~GG1232133(){ note_dtor("_ZN3aaa9GG1232133E", this);} // tgen
aaa::GG1232133 ::GG1232133(){ note_ctor("_ZN3aaa9GG1232133E", this);} // tgen
}
static void Test__ZN3aaa9GG1232133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232133E, buf);
    ::aaa::GG1232133 *dp, &lv = *(dp=new (buf) ::aaa::GG1232133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232133E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1232133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1232133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1232133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232133E);
    dp->::aaa::GG1232133::~GG1232133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232133E(Test__ZN3aaa9GG1232133E, "_ZN3aaa9GG1232133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232133C1Ev();
extern void _ZN3aaa9GG1232133D1Ev();
Name_Map name_map__ZN3aaa9GG1232133E[] = {
  NSPAIR(_ZN3aaa9GG1232133C1Ev),
  NSPAIR(_ZN3aaa9GG1232133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1232133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232133E[];
extern void _ZN3aaa9GG12321333fooEv();
extern void _ZN3aaa9GG12321333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12321333barEv,_ZThn8_N3aaa9GG12321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12321333barEv,_ZThn20_N3aaa9GG12321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12321333fooEv,_ZThn20_N3aaa9GG12321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12321333fooEv,_ZThn28_N3aaa9GG12321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12321333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12321333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12321333barEv,_ZThn8_N3aaa9GG12321333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321333barEv,_ZThn20_N3aaa9GG12321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12321333fooEv,_ZThn20_N3aaa9GG12321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12321333fooEv,_ZThn28_N3aaa9GG12321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232133E[];
Class_Descriptor cd__ZN3aaa9GG1232133E = {  "_ZN3aaa9GG1232133E", // class name
  bases__ZN3aaa9GG1232133E, 6,
  &(vtc__ZN3aaa9GG1232133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232211  : ::aaa::EE123 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12322113fooEv
  ~GG1232211(); // tgen
  GG1232211(); // tgen
};
//SIG(1 _ZN3aaa9GG1232211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12322113fooEv");}
aaa::GG1232211 ::~GG1232211(){ note_dtor("_ZN3aaa9GG1232211E", this);} // tgen
aaa::GG1232211 ::GG1232211(){ note_ctor("_ZN3aaa9GG1232211E", this);} // tgen
}
static void Test__ZN3aaa9GG1232211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232211E, buf);
    ::aaa::GG1232211 *dp, &lv = *(dp=new (buf) ::aaa::GG1232211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232211E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1232211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1232211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1232211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232211E);
    dp->::aaa::GG1232211::~GG1232211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232211E(Test__ZN3aaa9GG1232211E, "_ZN3aaa9GG1232211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232211C1Ev();
extern void _ZN3aaa9GG1232211D1Ev();
Name_Map name_map__ZN3aaa9GG1232211E[] = {
  NSPAIR(_ZN3aaa9GG1232211C1Ev),
  NSPAIR(_ZN3aaa9GG1232211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1232211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232211E[];
extern void _ZN3aaa9GG12322113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12322113fooEv,_ZThn20_N3aaa9GG12322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12322113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322113fooEv,_ZThn20_N3aaa9GG12322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232211E[];
Class_Descriptor cd__ZN3aaa9GG1232211E = {  "_ZN3aaa9GG1232211E", // class name
  bases__ZN3aaa9GG1232211E, 6,
  &(vtc__ZN3aaa9GG1232211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232212  : ::aaa::EE123 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12322123barEv
  ~GG1232212(); // tgen
  GG1232212(); // tgen
};
//SIG(1 _ZN3aaa9GG1232212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12322123barEv");}
aaa::GG1232212 ::~GG1232212(){ note_dtor("_ZN3aaa9GG1232212E", this);} // tgen
aaa::GG1232212 ::GG1232212(){ note_ctor("_ZN3aaa9GG1232212E", this);} // tgen
}
static void Test__ZN3aaa9GG1232212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232212E, buf);
    ::aaa::GG1232212 *dp, &lv = *(dp=new (buf) ::aaa::GG1232212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232212E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1232212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1232212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1232212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232212E);
    dp->::aaa::GG1232212::~GG1232212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232212E(Test__ZN3aaa9GG1232212E, "_ZN3aaa9GG1232212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232212C1Ev();
extern void _ZN3aaa9GG1232212D1Ev();
Name_Map name_map__ZN3aaa9GG1232212E[] = {
  NSPAIR(_ZN3aaa9GG1232212C1Ev),
  NSPAIR(_ZN3aaa9GG1232212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1232212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232212E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12322123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12322123barEv,_ZThn8_N3aaa9GG12322123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12322123barEv,_ZThn20_N3aaa9GG12322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12322123barEv,_ZThn28_N3aaa9GG12322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12322123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12322123barEv,_ZThn8_N3aaa9GG12322123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322123barEv,_ZThn20_N3aaa9GG12322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12322123barEv,_ZThn28_N3aaa9GG12322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232212E[];
Class_Descriptor cd__ZN3aaa9GG1232212E = {  "_ZN3aaa9GG1232212E", // class name
  bases__ZN3aaa9GG1232212E, 6,
  &(vtc__ZN3aaa9GG1232212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232213  : ::aaa::EE123 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12322133fooEv
  virtual void  bar(); // _ZN3aaa9GG12322133barEv
  ~GG1232213(); // tgen
  GG1232213(); // tgen
};
//SIG(1 _ZN3aaa9GG1232213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12322133fooEv");}
void  aaa::GG1232213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12322133barEv");}
aaa::GG1232213 ::~GG1232213(){ note_dtor("_ZN3aaa9GG1232213E", this);} // tgen
aaa::GG1232213 ::GG1232213(){ note_ctor("_ZN3aaa9GG1232213E", this);} // tgen
}
static void Test__ZN3aaa9GG1232213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232213E, buf);
    ::aaa::GG1232213 *dp, &lv = *(dp=new (buf) ::aaa::GG1232213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232213E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1232213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1232213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1232213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232213E);
    dp->::aaa::GG1232213::~GG1232213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232213E(Test__ZN3aaa9GG1232213E, "_ZN3aaa9GG1232213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232213C1Ev();
extern void _ZN3aaa9GG1232213D1Ev();
Name_Map name_map__ZN3aaa9GG1232213E[] = {
  NSPAIR(_ZN3aaa9GG1232213C1Ev),
  NSPAIR(_ZN3aaa9GG1232213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1232213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232213E[];
extern void _ZN3aaa9GG12322133fooEv();
extern void _ZN3aaa9GG12322133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12322133barEv,_ZThn8_N3aaa9GG12322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12322133barEv,_ZThn20_N3aaa9GG12322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12322133fooEv,_ZThn20_N3aaa9GG12322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12322133barEv,_ZThn28_N3aaa9GG12322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12322133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12322133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12322133barEv,_ZThn8_N3aaa9GG12322133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322133barEv,_ZThn20_N3aaa9GG12322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322133fooEv,_ZThn20_N3aaa9GG12322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12322133barEv,_ZThn28_N3aaa9GG12322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232213E[];
Class_Descriptor cd__ZN3aaa9GG1232213E = {  "_ZN3aaa9GG1232213E", // class name
  bases__ZN3aaa9GG1232213E, 6,
  &(vtc__ZN3aaa9GG1232213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232221  : ::aaa::EE123 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12322213fooEv
  ~GG1232221(); // tgen
  GG1232221(); // tgen
};
//SIG(1 _ZN3aaa9GG1232221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12322213fooEv");}
aaa::GG1232221 ::~GG1232221(){ note_dtor("_ZN3aaa9GG1232221E", this);} // tgen
aaa::GG1232221 ::GG1232221(){ note_ctor("_ZN3aaa9GG1232221E", this);} // tgen
}
static void Test__ZN3aaa9GG1232221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232221E, buf);
    ::aaa::GG1232221 *dp, &lv = *(dp=new (buf) ::aaa::GG1232221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232221E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1232221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1232221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1232221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232221E);
    dp->::aaa::GG1232221::~GG1232221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232221E(Test__ZN3aaa9GG1232221E, "_ZN3aaa9GG1232221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232221C1Ev();
extern void _ZN3aaa9GG1232221D1Ev();
Name_Map name_map__ZN3aaa9GG1232221E[] = {
  NSPAIR(_ZN3aaa9GG1232221C1Ev),
  NSPAIR(_ZN3aaa9GG1232221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1232221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232221E[];
extern void _ZN3aaa9GG12322213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12322213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232221E[];
Class_Descriptor cd__ZN3aaa9GG1232221E = {  "_ZN3aaa9GG1232221E", // class name
  bases__ZN3aaa9GG1232221E, 6,
  &(vtc__ZN3aaa9GG1232221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232222  : ::aaa::EE123 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12322223barEv
  ~GG1232222(); // tgen
  GG1232222(); // tgen
};
//SIG(1 _ZN3aaa9GG1232222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12322223barEv");}
aaa::GG1232222 ::~GG1232222(){ note_dtor("_ZN3aaa9GG1232222E", this);} // tgen
aaa::GG1232222 ::GG1232222(){ note_ctor("_ZN3aaa9GG1232222E", this);} // tgen
}
static void Test__ZN3aaa9GG1232222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232222E, buf);
    ::aaa::GG1232222 *dp, &lv = *(dp=new (buf) ::aaa::GG1232222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232222E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1232222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1232222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1232222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232222E);
    dp->::aaa::GG1232222::~GG1232222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232222E(Test__ZN3aaa9GG1232222E, "_ZN3aaa9GG1232222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232222C1Ev();
extern void _ZN3aaa9GG1232222D1Ev();
Name_Map name_map__ZN3aaa9GG1232222E[] = {
  NSPAIR(_ZN3aaa9GG1232222C1Ev),
  NSPAIR(_ZN3aaa9GG1232222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1232222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232222E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12322223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12322223barEv,_ZThn8_N3aaa9GG12322223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12322223barEv,_ZThn20_N3aaa9GG12322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12322223barEv,_ZThn28_N3aaa9GG12322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12322223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12322223barEv,_ZThn8_N3aaa9GG12322223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322223barEv,_ZThn20_N3aaa9GG12322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12322223barEv,_ZThn28_N3aaa9GG12322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232222E[];
Class_Descriptor cd__ZN3aaa9GG1232222E = {  "_ZN3aaa9GG1232222E", // class name
  bases__ZN3aaa9GG1232222E, 6,
  &(vtc__ZN3aaa9GG1232222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232223  : ::aaa::EE123 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12322233fooEv
  virtual void  bar(); // _ZN3aaa9GG12322233barEv
  ~GG1232223(); // tgen
  GG1232223(); // tgen
};
//SIG(1 _ZN3aaa9GG1232223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12322233fooEv");}
void  aaa::GG1232223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12322233barEv");}
aaa::GG1232223 ::~GG1232223(){ note_dtor("_ZN3aaa9GG1232223E", this);} // tgen
aaa::GG1232223 ::GG1232223(){ note_ctor("_ZN3aaa9GG1232223E", this);} // tgen
}
static void Test__ZN3aaa9GG1232223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232223E, buf);
    ::aaa::GG1232223 *dp, &lv = *(dp=new (buf) ::aaa::GG1232223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232223E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1232223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1232223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1232223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232223E);
    dp->::aaa::GG1232223::~GG1232223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232223E(Test__ZN3aaa9GG1232223E, "_ZN3aaa9GG1232223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232223C1Ev();
extern void _ZN3aaa9GG1232223D1Ev();
Name_Map name_map__ZN3aaa9GG1232223E[] = {
  NSPAIR(_ZN3aaa9GG1232223C1Ev),
  NSPAIR(_ZN3aaa9GG1232223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1232223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232223E[];
extern void _ZN3aaa9GG12322233fooEv();
extern void _ZN3aaa9GG12322233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12322233barEv,_ZThn8_N3aaa9GG12322233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12322233barEv,_ZThn20_N3aaa9GG12322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12322233barEv,_ZThn28_N3aaa9GG12322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12322233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12322233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12322233barEv,_ZThn8_N3aaa9GG12322233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322233barEv,_ZThn20_N3aaa9GG12322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12322233barEv,_ZThn28_N3aaa9GG12322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232223E[];
Class_Descriptor cd__ZN3aaa9GG1232223E = {  "_ZN3aaa9GG1232223E", // class name
  bases__ZN3aaa9GG1232223E, 6,
  &(vtc__ZN3aaa9GG1232223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232231  : ::aaa::EE123 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12322313fooEv
  ~GG1232231(); // tgen
  GG1232231(); // tgen
};
//SIG(1 _ZN3aaa9GG1232231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12322313fooEv");}
aaa::GG1232231 ::~GG1232231(){ note_dtor("_ZN3aaa9GG1232231E", this);} // tgen
aaa::GG1232231 ::GG1232231(){ note_ctor("_ZN3aaa9GG1232231E", this);} // tgen
}
static void Test__ZN3aaa9GG1232231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232231E, buf);
    ::aaa::GG1232231 *dp, &lv = *(dp=new (buf) ::aaa::GG1232231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232231E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1232231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1232231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1232231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232231E);
    dp->::aaa::GG1232231::~GG1232231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232231E(Test__ZN3aaa9GG1232231E, "_ZN3aaa9GG1232231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232231C1Ev();
extern void _ZN3aaa9GG1232231D1Ev();
Name_Map name_map__ZN3aaa9GG1232231E[] = {
  NSPAIR(_ZN3aaa9GG1232231C1Ev),
  NSPAIR(_ZN3aaa9GG1232231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1232231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232231E[];
extern void _ZN3aaa9GG12322313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12322313fooEv,_ZThn20_N3aaa9GG12322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12322313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322313fooEv,_ZThn20_N3aaa9GG12322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232231E[];
Class_Descriptor cd__ZN3aaa9GG1232231E = {  "_ZN3aaa9GG1232231E", // class name
  bases__ZN3aaa9GG1232231E, 6,
  &(vtc__ZN3aaa9GG1232231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232232  : ::aaa::EE123 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12322323barEv
  ~GG1232232(); // tgen
  GG1232232(); // tgen
};
//SIG(1 _ZN3aaa9GG1232232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12322323barEv");}
aaa::GG1232232 ::~GG1232232(){ note_dtor("_ZN3aaa9GG1232232E", this);} // tgen
aaa::GG1232232 ::GG1232232(){ note_ctor("_ZN3aaa9GG1232232E", this);} // tgen
}
static void Test__ZN3aaa9GG1232232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232232E, buf);
    ::aaa::GG1232232 *dp, &lv = *(dp=new (buf) ::aaa::GG1232232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232232E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1232232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1232232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1232232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232232E);
    dp->::aaa::GG1232232::~GG1232232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232232E(Test__ZN3aaa9GG1232232E, "_ZN3aaa9GG1232232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232232C1Ev();
extern void _ZN3aaa9GG1232232D1Ev();
Name_Map name_map__ZN3aaa9GG1232232E[] = {
  NSPAIR(_ZN3aaa9GG1232232C1Ev),
  NSPAIR(_ZN3aaa9GG1232232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1232232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232232E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12322323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12322323barEv,_ZThn8_N3aaa9GG12322323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12322323barEv,_ZThn20_N3aaa9GG12322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12322323barEv,_ZThn28_N3aaa9GG12322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12322323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12322323barEv,_ZThn8_N3aaa9GG12322323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322323barEv,_ZThn20_N3aaa9GG12322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12322323barEv,_ZThn28_N3aaa9GG12322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232232E[];
Class_Descriptor cd__ZN3aaa9GG1232232E = {  "_ZN3aaa9GG1232232E", // class name
  bases__ZN3aaa9GG1232232E, 6,
  &(vtc__ZN3aaa9GG1232232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232233  : ::aaa::EE123 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12322333fooEv
  virtual void  bar(); // _ZN3aaa9GG12322333barEv
  ~GG1232233(); // tgen
  GG1232233(); // tgen
};
//SIG(1 _ZN3aaa9GG1232233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12322333fooEv");}
void  aaa::GG1232233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12322333barEv");}
aaa::GG1232233 ::~GG1232233(){ note_dtor("_ZN3aaa9GG1232233E", this);} // tgen
aaa::GG1232233 ::GG1232233(){ note_ctor("_ZN3aaa9GG1232233E", this);} // tgen
}
static void Test__ZN3aaa9GG1232233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232233E, buf);
    ::aaa::GG1232233 *dp, &lv = *(dp=new (buf) ::aaa::GG1232233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232233E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1232233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1232233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1232233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232233E);
    dp->::aaa::GG1232233::~GG1232233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232233E(Test__ZN3aaa9GG1232233E, "_ZN3aaa9GG1232233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232233C1Ev();
extern void _ZN3aaa9GG1232233D1Ev();
Name_Map name_map__ZN3aaa9GG1232233E[] = {
  NSPAIR(_ZN3aaa9GG1232233C1Ev),
  NSPAIR(_ZN3aaa9GG1232233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1232233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232233E[];
extern void _ZN3aaa9GG12322333fooEv();
extern void _ZN3aaa9GG12322333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12322333barEv,_ZThn8_N3aaa9GG12322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12322333barEv,_ZThn20_N3aaa9GG12322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12322333fooEv,_ZThn20_N3aaa9GG12322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12322333barEv,_ZThn28_N3aaa9GG12322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12322333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12322333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12322333barEv,_ZThn8_N3aaa9GG12322333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322333barEv,_ZThn20_N3aaa9GG12322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12322333fooEv,_ZThn20_N3aaa9GG12322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12322333barEv,_ZThn28_N3aaa9GG12322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232233E[];
Class_Descriptor cd__ZN3aaa9GG1232233E = {  "_ZN3aaa9GG1232233E", // class name
  bases__ZN3aaa9GG1232233E, 6,
  &(vtc__ZN3aaa9GG1232233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232311  : ::aaa::EE123 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12323113fooEv
  ~GG1232311(); // tgen
  GG1232311(); // tgen
};
//SIG(1 _ZN3aaa9GG1232311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12323113fooEv");}
aaa::GG1232311 ::~GG1232311(){ note_dtor("_ZN3aaa9GG1232311E", this);} // tgen
aaa::GG1232311 ::GG1232311(){ note_ctor("_ZN3aaa9GG1232311E", this);} // tgen
}
static void Test__ZN3aaa9GG1232311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232311E, buf);
    ::aaa::GG1232311 *dp, &lv = *(dp=new (buf) ::aaa::GG1232311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232311E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1232311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1232311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1232311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232311E);
    dp->::aaa::GG1232311::~GG1232311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232311E(Test__ZN3aaa9GG1232311E, "_ZN3aaa9GG1232311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232311C1Ev();
extern void _ZN3aaa9GG1232311D1Ev();
Name_Map name_map__ZN3aaa9GG1232311E[] = {
  NSPAIR(_ZN3aaa9GG1232311C1Ev),
  NSPAIR(_ZN3aaa9GG1232311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1232311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232311E[];
extern void _ZN3aaa9GG12323113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12323113fooEv,_ZThn20_N3aaa9GG12323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323113fooEv,_ZThn28_N3aaa9GG12323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12323113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323113fooEv,_ZThn20_N3aaa9GG12323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323113fooEv,_ZThn28_N3aaa9GG12323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232311E[];
Class_Descriptor cd__ZN3aaa9GG1232311E = {  "_ZN3aaa9GG1232311E", // class name
  bases__ZN3aaa9GG1232311E, 6,
  &(vtc__ZN3aaa9GG1232311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232312  : ::aaa::EE123 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12323123barEv
  ~GG1232312(); // tgen
  GG1232312(); // tgen
};
//SIG(1 _ZN3aaa9GG1232312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12323123barEv");}
aaa::GG1232312 ::~GG1232312(){ note_dtor("_ZN3aaa9GG1232312E", this);} // tgen
aaa::GG1232312 ::GG1232312(){ note_ctor("_ZN3aaa9GG1232312E", this);} // tgen
}
static void Test__ZN3aaa9GG1232312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232312E, buf);
    ::aaa::GG1232312 *dp, &lv = *(dp=new (buf) ::aaa::GG1232312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232312E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1232312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1232312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1232312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232312E);
    dp->::aaa::GG1232312::~GG1232312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232312E(Test__ZN3aaa9GG1232312E, "_ZN3aaa9GG1232312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232312C1Ev();
extern void _ZN3aaa9GG1232312D1Ev();
Name_Map name_map__ZN3aaa9GG1232312E[] = {
  NSPAIR(_ZN3aaa9GG1232312C1Ev),
  NSPAIR(_ZN3aaa9GG1232312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1232312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232312E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12323123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12323123barEv,_ZThn8_N3aaa9GG12323123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12323123barEv,_ZThn20_N3aaa9GG12323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323123barEv,_ZThn28_N3aaa9GG12323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12323123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12323123barEv,_ZThn8_N3aaa9GG12323123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323123barEv,_ZThn20_N3aaa9GG12323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323123barEv,_ZThn28_N3aaa9GG12323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232312E[];
Class_Descriptor cd__ZN3aaa9GG1232312E = {  "_ZN3aaa9GG1232312E", // class name
  bases__ZN3aaa9GG1232312E, 6,
  &(vtc__ZN3aaa9GG1232312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232313  : ::aaa::EE123 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12323133fooEv
  virtual void  bar(); // _ZN3aaa9GG12323133barEv
  ~GG1232313(); // tgen
  GG1232313(); // tgen
};
//SIG(1 _ZN3aaa9GG1232313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12323133fooEv");}
void  aaa::GG1232313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12323133barEv");}
aaa::GG1232313 ::~GG1232313(){ note_dtor("_ZN3aaa9GG1232313E", this);} // tgen
aaa::GG1232313 ::GG1232313(){ note_ctor("_ZN3aaa9GG1232313E", this);} // tgen
}
static void Test__ZN3aaa9GG1232313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232313E, buf);
    ::aaa::GG1232313 *dp, &lv = *(dp=new (buf) ::aaa::GG1232313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232313E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1232313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1232313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1232313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232313E);
    dp->::aaa::GG1232313::~GG1232313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232313E(Test__ZN3aaa9GG1232313E, "_ZN3aaa9GG1232313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232313C1Ev();
extern void _ZN3aaa9GG1232313D1Ev();
Name_Map name_map__ZN3aaa9GG1232313E[] = {
  NSPAIR(_ZN3aaa9GG1232313C1Ev),
  NSPAIR(_ZN3aaa9GG1232313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1232313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232313E[];
extern void _ZN3aaa9GG12323133fooEv();
extern void _ZN3aaa9GG12323133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12323133barEv,_ZThn8_N3aaa9GG12323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12323133barEv,_ZThn20_N3aaa9GG12323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12323133fooEv,_ZThn20_N3aaa9GG12323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323133fooEv,_ZThn28_N3aaa9GG12323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323133barEv,_ZThn28_N3aaa9GG12323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12323133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12323133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12323133barEv,_ZThn8_N3aaa9GG12323133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323133barEv,_ZThn20_N3aaa9GG12323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323133fooEv,_ZThn20_N3aaa9GG12323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323133fooEv,_ZThn28_N3aaa9GG12323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323133barEv,_ZThn28_N3aaa9GG12323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232313E[];
Class_Descriptor cd__ZN3aaa9GG1232313E = {  "_ZN3aaa9GG1232313E", // class name
  bases__ZN3aaa9GG1232313E, 6,
  &(vtc__ZN3aaa9GG1232313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232321  : ::aaa::EE123 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12323213fooEv
  ~GG1232321(); // tgen
  GG1232321(); // tgen
};
//SIG(1 _ZN3aaa9GG1232321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12323213fooEv");}
aaa::GG1232321 ::~GG1232321(){ note_dtor("_ZN3aaa9GG1232321E", this);} // tgen
aaa::GG1232321 ::GG1232321(){ note_ctor("_ZN3aaa9GG1232321E", this);} // tgen
}
static void Test__ZN3aaa9GG1232321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232321E, buf);
    ::aaa::GG1232321 *dp, &lv = *(dp=new (buf) ::aaa::GG1232321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232321E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1232321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1232321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1232321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232321E);
    dp->::aaa::GG1232321::~GG1232321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232321E(Test__ZN3aaa9GG1232321E, "_ZN3aaa9GG1232321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232321C1Ev();
extern void _ZN3aaa9GG1232321D1Ev();
Name_Map name_map__ZN3aaa9GG1232321E[] = {
  NSPAIR(_ZN3aaa9GG1232321C1Ev),
  NSPAIR(_ZN3aaa9GG1232321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1232321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232321E[];
extern void _ZN3aaa9GG12323213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12323213fooEv,_ZThn28_N3aaa9GG12323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12323213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323213fooEv,_ZThn28_N3aaa9GG12323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232321E[];
Class_Descriptor cd__ZN3aaa9GG1232321E = {  "_ZN3aaa9GG1232321E", // class name
  bases__ZN3aaa9GG1232321E, 6,
  &(vtc__ZN3aaa9GG1232321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232322  : ::aaa::EE123 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12323223barEv
  ~GG1232322(); // tgen
  GG1232322(); // tgen
};
//SIG(1 _ZN3aaa9GG1232322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12323223barEv");}
aaa::GG1232322 ::~GG1232322(){ note_dtor("_ZN3aaa9GG1232322E", this);} // tgen
aaa::GG1232322 ::GG1232322(){ note_ctor("_ZN3aaa9GG1232322E", this);} // tgen
}
static void Test__ZN3aaa9GG1232322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232322E, buf);
    ::aaa::GG1232322 *dp, &lv = *(dp=new (buf) ::aaa::GG1232322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232322E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1232322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1232322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1232322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232322E);
    dp->::aaa::GG1232322::~GG1232322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232322E(Test__ZN3aaa9GG1232322E, "_ZN3aaa9GG1232322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232322C1Ev();
extern void _ZN3aaa9GG1232322D1Ev();
Name_Map name_map__ZN3aaa9GG1232322E[] = {
  NSPAIR(_ZN3aaa9GG1232322C1Ev),
  NSPAIR(_ZN3aaa9GG1232322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1232322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232322E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12323223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12323223barEv,_ZThn8_N3aaa9GG12323223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12323223barEv,_ZThn20_N3aaa9GG12323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12323223barEv,_ZThn28_N3aaa9GG12323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12323223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12323223barEv,_ZThn8_N3aaa9GG12323223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323223barEv,_ZThn20_N3aaa9GG12323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323223barEv,_ZThn28_N3aaa9GG12323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232322E[];
Class_Descriptor cd__ZN3aaa9GG1232322E = {  "_ZN3aaa9GG1232322E", // class name
  bases__ZN3aaa9GG1232322E, 6,
  &(vtc__ZN3aaa9GG1232322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232323  : ::aaa::EE123 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12323233fooEv
  virtual void  bar(); // _ZN3aaa9GG12323233barEv
  ~GG1232323(); // tgen
  GG1232323(); // tgen
};
//SIG(1 _ZN3aaa9GG1232323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12323233fooEv");}
void  aaa::GG1232323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12323233barEv");}
aaa::GG1232323 ::~GG1232323(){ note_dtor("_ZN3aaa9GG1232323E", this);} // tgen
aaa::GG1232323 ::GG1232323(){ note_ctor("_ZN3aaa9GG1232323E", this);} // tgen
}
static void Test__ZN3aaa9GG1232323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232323E, buf);
    ::aaa::GG1232323 *dp, &lv = *(dp=new (buf) ::aaa::GG1232323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232323E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1232323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1232323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1232323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232323E);
    dp->::aaa::GG1232323::~GG1232323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232323E(Test__ZN3aaa9GG1232323E, "_ZN3aaa9GG1232323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232323C1Ev();
extern void _ZN3aaa9GG1232323D1Ev();
Name_Map name_map__ZN3aaa9GG1232323E[] = {
  NSPAIR(_ZN3aaa9GG1232323C1Ev),
  NSPAIR(_ZN3aaa9GG1232323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1232323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232323E[];
extern void _ZN3aaa9GG12323233fooEv();
extern void _ZN3aaa9GG12323233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12323233barEv,_ZThn8_N3aaa9GG12323233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12323233barEv,_ZThn20_N3aaa9GG12323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323233fooEv,_ZThn28_N3aaa9GG12323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323233barEv,_ZThn28_N3aaa9GG12323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12323233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12323233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12323233barEv,_ZThn8_N3aaa9GG12323233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323233barEv,_ZThn20_N3aaa9GG12323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323233fooEv,_ZThn28_N3aaa9GG12323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323233barEv,_ZThn28_N3aaa9GG12323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232323E[];
Class_Descriptor cd__ZN3aaa9GG1232323E = {  "_ZN3aaa9GG1232323E", // class name
  bases__ZN3aaa9GG1232323E, 6,
  &(vtc__ZN3aaa9GG1232323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232331  : ::aaa::EE123 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12323313fooEv
  ~GG1232331(); // tgen
  GG1232331(); // tgen
};
//SIG(1 _ZN3aaa9GG1232331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12323313fooEv");}
aaa::GG1232331 ::~GG1232331(){ note_dtor("_ZN3aaa9GG1232331E", this);} // tgen
aaa::GG1232331 ::GG1232331(){ note_ctor("_ZN3aaa9GG1232331E", this);} // tgen
}
static void Test__ZN3aaa9GG1232331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232331E, buf);
    ::aaa::GG1232331 *dp, &lv = *(dp=new (buf) ::aaa::GG1232331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232331E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1232331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1232331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1232331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232331E);
    dp->::aaa::GG1232331::~GG1232331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232331E(Test__ZN3aaa9GG1232331E, "_ZN3aaa9GG1232331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232331C1Ev();
extern void _ZN3aaa9GG1232331D1Ev();
Name_Map name_map__ZN3aaa9GG1232331E[] = {
  NSPAIR(_ZN3aaa9GG1232331C1Ev),
  NSPAIR(_ZN3aaa9GG1232331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1232331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232331E[];
extern void _ZN3aaa9GG12323313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12323313fooEv,_ZThn20_N3aaa9GG12323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323313fooEv,_ZThn28_N3aaa9GG12323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12323313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323313fooEv,_ZThn20_N3aaa9GG12323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323313fooEv,_ZThn28_N3aaa9GG12323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232331E[];
Class_Descriptor cd__ZN3aaa9GG1232331E = {  "_ZN3aaa9GG1232331E", // class name
  bases__ZN3aaa9GG1232331E, 6,
  &(vtc__ZN3aaa9GG1232331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232332  : ::aaa::EE123 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12323323barEv
  ~GG1232332(); // tgen
  GG1232332(); // tgen
};
//SIG(1 _ZN3aaa9GG1232332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1232332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12323323barEv");}
aaa::GG1232332 ::~GG1232332(){ note_dtor("_ZN3aaa9GG1232332E", this);} // tgen
aaa::GG1232332 ::GG1232332(){ note_ctor("_ZN3aaa9GG1232332E", this);} // tgen
}
static void Test__ZN3aaa9GG1232332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232332E, buf);
    ::aaa::GG1232332 *dp, &lv = *(dp=new (buf) ::aaa::GG1232332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232332E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1232332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1232332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1232332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232332E);
    dp->::aaa::GG1232332::~GG1232332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232332E(Test__ZN3aaa9GG1232332E, "_ZN3aaa9GG1232332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232332C1Ev();
extern void _ZN3aaa9GG1232332D1Ev();
Name_Map name_map__ZN3aaa9GG1232332E[] = {
  NSPAIR(_ZN3aaa9GG1232332C1Ev),
  NSPAIR(_ZN3aaa9GG1232332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1232332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232332E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12323323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12323323barEv,_ZThn8_N3aaa9GG12323323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12323323barEv,_ZThn20_N3aaa9GG12323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323323barEv,_ZThn28_N3aaa9GG12323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12323323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12323323barEv,_ZThn8_N3aaa9GG12323323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323323barEv,_ZThn20_N3aaa9GG12323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323323barEv,_ZThn28_N3aaa9GG12323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232332E[];
Class_Descriptor cd__ZN3aaa9GG1232332E = {  "_ZN3aaa9GG1232332E", // class name
  bases__ZN3aaa9GG1232332E, 6,
  &(vtc__ZN3aaa9GG1232332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1232333  : ::aaa::EE123 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12323333fooEv
  virtual void  bar(); // _ZN3aaa9GG12323333barEv
  ~GG1232333(); // tgen
  GG1232333(); // tgen
};
//SIG(1 _ZN3aaa9GG1232333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1232333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12323333fooEv");}
void  aaa::GG1232333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12323333barEv");}
aaa::GG1232333 ::~GG1232333(){ note_dtor("_ZN3aaa9GG1232333E", this);} // tgen
aaa::GG1232333 ::GG1232333(){ note_ctor("_ZN3aaa9GG1232333E", this);} // tgen
}
static void Test__ZN3aaa9GG1232333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1232333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1232333E, buf);
    ::aaa::GG1232333 *dp, &lv = *(dp=new (buf) ::aaa::GG1232333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1232333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1232333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1232333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1232333E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1232333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1232333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1232333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1232333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1232333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1232333E);
    dp->::aaa::GG1232333::~GG1232333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1232333E(Test__ZN3aaa9GG1232333E, "_ZN3aaa9GG1232333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1232333C1Ev();
extern void _ZN3aaa9GG1232333D1Ev();
Name_Map name_map__ZN3aaa9GG1232333E[] = {
  NSPAIR(_ZN3aaa9GG1232333C1Ev),
  NSPAIR(_ZN3aaa9GG1232333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1232333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1232333E[];
extern void _ZN3aaa9GG12323333fooEv();
extern void _ZN3aaa9GG12323333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12323333barEv,_ZThn8_N3aaa9GG12323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12323333barEv,_ZThn20_N3aaa9GG12323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12323333fooEv,_ZThn20_N3aaa9GG12323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323333fooEv,_ZThn28_N3aaa9GG12323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12323333barEv,_ZThn28_N3aaa9GG12323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1232333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12323333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12323333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12323333barEv,_ZThn8_N3aaa9GG12323333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323333barEv,_ZThn20_N3aaa9GG12323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12323333fooEv,_ZThn20_N3aaa9GG12323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323333fooEv,_ZThn28_N3aaa9GG12323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12323333barEv,_ZThn28_N3aaa9GG12323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1232333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1232333E[];
Class_Descriptor cd__ZN3aaa9GG1232333E = {  "_ZN3aaa9GG1232333E", // class name
  bases__ZN3aaa9GG1232333E, 6,
  &(vtc__ZN3aaa9GG1232333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1232333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1232333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233111  : ::aaa::EE123 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12331113fooEv
  ~GG1233111(); // tgen
  GG1233111(); // tgen
};
//SIG(1 _ZN3aaa9GG1233111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233111 ::foo(){vfunc_called(this, "_ZN3aaa9GG12331113fooEv");}
aaa::GG1233111 ::~GG1233111(){ note_dtor("_ZN3aaa9GG1233111E", this);} // tgen
aaa::GG1233111 ::GG1233111(){ note_ctor("_ZN3aaa9GG1233111E", this);} // tgen
}
static void Test__ZN3aaa9GG1233111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233111E, buf);
    ::aaa::GG1233111 *dp, &lv = *(dp=new (buf) ::aaa::GG1233111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233111E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1233111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1233111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1233111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233111E);
    dp->::aaa::GG1233111::~GG1233111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233111E(Test__ZN3aaa9GG1233111E, "_ZN3aaa9GG1233111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233111C1Ev();
extern void _ZN3aaa9GG1233111D1Ev();
Name_Map name_map__ZN3aaa9GG1233111E[] = {
  NSPAIR(_ZN3aaa9GG1233111C1Ev),
  NSPAIR(_ZN3aaa9GG1233111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1233111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233111E[];
extern void _ZN3aaa9GG12331113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331113fooEv,_ZThn20_N3aaa9GG12331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12331113fooEv,_ZThn28_N3aaa9GG12331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12331113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331113fooEv,_ZThn20_N3aaa9GG12331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12331113fooEv,_ZThn28_N3aaa9GG12331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233111E[];
Class_Descriptor cd__ZN3aaa9GG1233111E = {  "_ZN3aaa9GG1233111E", // class name
  bases__ZN3aaa9GG1233111E, 6,
  &(vtc__ZN3aaa9GG1233111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233112  : ::aaa::EE123 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12331123barEv
  ~GG1233112(); // tgen
  GG1233112(); // tgen
};
//SIG(1 _ZN3aaa9GG1233112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233112 ::bar(){vfunc_called(this, "_ZN3aaa9GG12331123barEv");}
aaa::GG1233112 ::~GG1233112(){ note_dtor("_ZN3aaa9GG1233112E", this);} // tgen
aaa::GG1233112 ::GG1233112(){ note_ctor("_ZN3aaa9GG1233112E", this);} // tgen
}
static void Test__ZN3aaa9GG1233112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233112E, buf);
    ::aaa::GG1233112 *dp, &lv = *(dp=new (buf) ::aaa::GG1233112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233112E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1233112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1233112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1233112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233112E);
    dp->::aaa::GG1233112::~GG1233112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233112E(Test__ZN3aaa9GG1233112E, "_ZN3aaa9GG1233112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233112C1Ev();
extern void _ZN3aaa9GG1233112D1Ev();
Name_Map name_map__ZN3aaa9GG1233112E[] = {
  NSPAIR(_ZN3aaa9GG1233112C1Ev),
  NSPAIR(_ZN3aaa9GG1233112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1233112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233112E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12331123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12331123barEv,_ZThn8_N3aaa9GG12331123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12331123barEv,_ZThn20_N3aaa9GG12331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12331123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12331123barEv,_ZThn8_N3aaa9GG12331123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331123barEv,_ZThn20_N3aaa9GG12331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233112E[];
Class_Descriptor cd__ZN3aaa9GG1233112E = {  "_ZN3aaa9GG1233112E", // class name
  bases__ZN3aaa9GG1233112E, 6,
  &(vtc__ZN3aaa9GG1233112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233113  : ::aaa::EE123 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12331133fooEv
  virtual void  bar(); // _ZN3aaa9GG12331133barEv
  ~GG1233113(); // tgen
  GG1233113(); // tgen
};
//SIG(1 _ZN3aaa9GG1233113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233113 ::foo(){vfunc_called(this, "_ZN3aaa9GG12331133fooEv");}
void  aaa::GG1233113 ::bar(){vfunc_called(this, "_ZN3aaa9GG12331133barEv");}
aaa::GG1233113 ::~GG1233113(){ note_dtor("_ZN3aaa9GG1233113E", this);} // tgen
aaa::GG1233113 ::GG1233113(){ note_ctor("_ZN3aaa9GG1233113E", this);} // tgen
}
static void Test__ZN3aaa9GG1233113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233113E, buf);
    ::aaa::GG1233113 *dp, &lv = *(dp=new (buf) ::aaa::GG1233113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233113E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1233113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1233113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1233113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233113E);
    dp->::aaa::GG1233113::~GG1233113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233113E(Test__ZN3aaa9GG1233113E, "_ZN3aaa9GG1233113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233113C1Ev();
extern void _ZN3aaa9GG1233113D1Ev();
Name_Map name_map__ZN3aaa9GG1233113E[] = {
  NSPAIR(_ZN3aaa9GG1233113C1Ev),
  NSPAIR(_ZN3aaa9GG1233113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1233113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233113E[];
extern void _ZN3aaa9GG12331133fooEv();
extern void _ZN3aaa9GG12331133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12331133barEv,_ZThn8_N3aaa9GG12331133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331133fooEv,_ZThn20_N3aaa9GG12331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331133barEv,_ZThn20_N3aaa9GG12331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12331133fooEv,_ZThn28_N3aaa9GG12331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12331133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12331133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12331133barEv,_ZThn8_N3aaa9GG12331133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331133fooEv,_ZThn20_N3aaa9GG12331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331133barEv,_ZThn20_N3aaa9GG12331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12331133fooEv,_ZThn28_N3aaa9GG12331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233113E[];
Class_Descriptor cd__ZN3aaa9GG1233113E = {  "_ZN3aaa9GG1233113E", // class name
  bases__ZN3aaa9GG1233113E, 6,
  &(vtc__ZN3aaa9GG1233113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233121  : ::aaa::EE123 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12331213fooEv
  ~GG1233121(); // tgen
  GG1233121(); // tgen
};
//SIG(1 _ZN3aaa9GG1233121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233121 ::foo(){vfunc_called(this, "_ZN3aaa9GG12331213fooEv");}
aaa::GG1233121 ::~GG1233121(){ note_dtor("_ZN3aaa9GG1233121E", this);} // tgen
aaa::GG1233121 ::GG1233121(){ note_ctor("_ZN3aaa9GG1233121E", this);} // tgen
}
static void Test__ZN3aaa9GG1233121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233121E, buf);
    ::aaa::GG1233121 *dp, &lv = *(dp=new (buf) ::aaa::GG1233121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233121E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1233121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1233121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1233121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233121E);
    dp->::aaa::GG1233121::~GG1233121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233121E(Test__ZN3aaa9GG1233121E, "_ZN3aaa9GG1233121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233121C1Ev();
extern void _ZN3aaa9GG1233121D1Ev();
Name_Map name_map__ZN3aaa9GG1233121E[] = {
  NSPAIR(_ZN3aaa9GG1233121C1Ev),
  NSPAIR(_ZN3aaa9GG1233121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1233121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233121E[];
extern void _ZN3aaa9GG12331213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331213fooEv,_ZThn20_N3aaa9GG12331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12331213fooEv,_ZThn28_N3aaa9GG12331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12331213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331213fooEv,_ZThn20_N3aaa9GG12331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12331213fooEv,_ZThn28_N3aaa9GG12331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233121E[];
Class_Descriptor cd__ZN3aaa9GG1233121E = {  "_ZN3aaa9GG1233121E", // class name
  bases__ZN3aaa9GG1233121E, 6,
  &(vtc__ZN3aaa9GG1233121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233122  : ::aaa::EE123 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12331223barEv
  ~GG1233122(); // tgen
  GG1233122(); // tgen
};
//SIG(1 _ZN3aaa9GG1233122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233122 ::bar(){vfunc_called(this, "_ZN3aaa9GG12331223barEv");}
aaa::GG1233122 ::~GG1233122(){ note_dtor("_ZN3aaa9GG1233122E", this);} // tgen
aaa::GG1233122 ::GG1233122(){ note_ctor("_ZN3aaa9GG1233122E", this);} // tgen
}
static void Test__ZN3aaa9GG1233122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233122E, buf);
    ::aaa::GG1233122 *dp, &lv = *(dp=new (buf) ::aaa::GG1233122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233122E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1233122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1233122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1233122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233122E);
    dp->::aaa::GG1233122::~GG1233122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233122E(Test__ZN3aaa9GG1233122E, "_ZN3aaa9GG1233122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233122C1Ev();
extern void _ZN3aaa9GG1233122D1Ev();
Name_Map name_map__ZN3aaa9GG1233122E[] = {
  NSPAIR(_ZN3aaa9GG1233122C1Ev),
  NSPAIR(_ZN3aaa9GG1233122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1233122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233122E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12331223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12331223barEv,_ZThn8_N3aaa9GG12331223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12331223barEv,_ZThn20_N3aaa9GG12331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12331223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12331223barEv,_ZThn8_N3aaa9GG12331223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331223barEv,_ZThn20_N3aaa9GG12331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233122E[];
Class_Descriptor cd__ZN3aaa9GG1233122E = {  "_ZN3aaa9GG1233122E", // class name
  bases__ZN3aaa9GG1233122E, 6,
  &(vtc__ZN3aaa9GG1233122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233123  : ::aaa::EE123 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12331233fooEv
  virtual void  bar(); // _ZN3aaa9GG12331233barEv
  ~GG1233123(); // tgen
  GG1233123(); // tgen
};
//SIG(1 _ZN3aaa9GG1233123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233123 ::foo(){vfunc_called(this, "_ZN3aaa9GG12331233fooEv");}
void  aaa::GG1233123 ::bar(){vfunc_called(this, "_ZN3aaa9GG12331233barEv");}
aaa::GG1233123 ::~GG1233123(){ note_dtor("_ZN3aaa9GG1233123E", this);} // tgen
aaa::GG1233123 ::GG1233123(){ note_ctor("_ZN3aaa9GG1233123E", this);} // tgen
}
static void Test__ZN3aaa9GG1233123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233123E, buf);
    ::aaa::GG1233123 *dp, &lv = *(dp=new (buf) ::aaa::GG1233123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233123E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1233123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1233123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1233123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233123E);
    dp->::aaa::GG1233123::~GG1233123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233123E(Test__ZN3aaa9GG1233123E, "_ZN3aaa9GG1233123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233123C1Ev();
extern void _ZN3aaa9GG1233123D1Ev();
Name_Map name_map__ZN3aaa9GG1233123E[] = {
  NSPAIR(_ZN3aaa9GG1233123C1Ev),
  NSPAIR(_ZN3aaa9GG1233123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1233123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233123E[];
extern void _ZN3aaa9GG12331233fooEv();
extern void _ZN3aaa9GG12331233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12331233barEv,_ZThn8_N3aaa9GG12331233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331233fooEv,_ZThn20_N3aaa9GG12331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331233barEv,_ZThn20_N3aaa9GG12331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12331233fooEv,_ZThn28_N3aaa9GG12331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12331233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12331233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12331233barEv,_ZThn8_N3aaa9GG12331233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331233fooEv,_ZThn20_N3aaa9GG12331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331233barEv,_ZThn20_N3aaa9GG12331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12331233fooEv,_ZThn28_N3aaa9GG12331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233123E[];
Class_Descriptor cd__ZN3aaa9GG1233123E = {  "_ZN3aaa9GG1233123E", // class name
  bases__ZN3aaa9GG1233123E, 6,
  &(vtc__ZN3aaa9GG1233123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233131  : ::aaa::EE123 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12331313fooEv
  ~GG1233131(); // tgen
  GG1233131(); // tgen
};
//SIG(1 _ZN3aaa9GG1233131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233131 ::foo(){vfunc_called(this, "_ZN3aaa9GG12331313fooEv");}
aaa::GG1233131 ::~GG1233131(){ note_dtor("_ZN3aaa9GG1233131E", this);} // tgen
aaa::GG1233131 ::GG1233131(){ note_ctor("_ZN3aaa9GG1233131E", this);} // tgen
}
static void Test__ZN3aaa9GG1233131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233131E, buf);
    ::aaa::GG1233131 *dp, &lv = *(dp=new (buf) ::aaa::GG1233131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233131E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1233131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1233131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1233131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233131E);
    dp->::aaa::GG1233131::~GG1233131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233131E(Test__ZN3aaa9GG1233131E, "_ZN3aaa9GG1233131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233131C1Ev();
extern void _ZN3aaa9GG1233131D1Ev();
Name_Map name_map__ZN3aaa9GG1233131E[] = {
  NSPAIR(_ZN3aaa9GG1233131C1Ev),
  NSPAIR(_ZN3aaa9GG1233131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1233131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233131E[];
extern void _ZN3aaa9GG12331313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331313fooEv,_ZThn20_N3aaa9GG12331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12331313fooEv,_ZThn28_N3aaa9GG12331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12331313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331313fooEv,_ZThn20_N3aaa9GG12331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12331313fooEv,_ZThn28_N3aaa9GG12331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233131E[];
Class_Descriptor cd__ZN3aaa9GG1233131E = {  "_ZN3aaa9GG1233131E", // class name
  bases__ZN3aaa9GG1233131E, 6,
  &(vtc__ZN3aaa9GG1233131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233132  : ::aaa::EE123 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12331323barEv
  ~GG1233132(); // tgen
  GG1233132(); // tgen
};
//SIG(1 _ZN3aaa9GG1233132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233132 ::bar(){vfunc_called(this, "_ZN3aaa9GG12331323barEv");}
aaa::GG1233132 ::~GG1233132(){ note_dtor("_ZN3aaa9GG1233132E", this);} // tgen
aaa::GG1233132 ::GG1233132(){ note_ctor("_ZN3aaa9GG1233132E", this);} // tgen
}
static void Test__ZN3aaa9GG1233132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233132E, buf);
    ::aaa::GG1233132 *dp, &lv = *(dp=new (buf) ::aaa::GG1233132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233132E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1233132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1233132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1233132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233132E);
    dp->::aaa::GG1233132::~GG1233132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233132E(Test__ZN3aaa9GG1233132E, "_ZN3aaa9GG1233132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233132C1Ev();
extern void _ZN3aaa9GG1233132D1Ev();
Name_Map name_map__ZN3aaa9GG1233132E[] = {
  NSPAIR(_ZN3aaa9GG1233132C1Ev),
  NSPAIR(_ZN3aaa9GG1233132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1233132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233132E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12331323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12331323barEv,_ZThn8_N3aaa9GG12331323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12331323barEv,_ZThn20_N3aaa9GG12331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12331323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12331323barEv,_ZThn8_N3aaa9GG12331323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331323barEv,_ZThn20_N3aaa9GG12331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233132E[];
Class_Descriptor cd__ZN3aaa9GG1233132E = {  "_ZN3aaa9GG1233132E", // class name
  bases__ZN3aaa9GG1233132E, 6,
  &(vtc__ZN3aaa9GG1233132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233133  : ::aaa::EE123 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12331333fooEv
  virtual void  bar(); // _ZN3aaa9GG12331333barEv
  ~GG1233133(); // tgen
  GG1233133(); // tgen
};
//SIG(1 _ZN3aaa9GG1233133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233133 ::foo(){vfunc_called(this, "_ZN3aaa9GG12331333fooEv");}
void  aaa::GG1233133 ::bar(){vfunc_called(this, "_ZN3aaa9GG12331333barEv");}
aaa::GG1233133 ::~GG1233133(){ note_dtor("_ZN3aaa9GG1233133E", this);} // tgen
aaa::GG1233133 ::GG1233133(){ note_ctor("_ZN3aaa9GG1233133E", this);} // tgen
}
static void Test__ZN3aaa9GG1233133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233133E, buf);
    ::aaa::GG1233133 *dp, &lv = *(dp=new (buf) ::aaa::GG1233133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233133E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1233133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1233133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1233133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233133E);
    dp->::aaa::GG1233133::~GG1233133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233133E(Test__ZN3aaa9GG1233133E, "_ZN3aaa9GG1233133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233133C1Ev();
extern void _ZN3aaa9GG1233133D1Ev();
Name_Map name_map__ZN3aaa9GG1233133E[] = {
  NSPAIR(_ZN3aaa9GG1233133C1Ev),
  NSPAIR(_ZN3aaa9GG1233133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1233133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233133E[];
extern void _ZN3aaa9GG12331333fooEv();
extern void _ZN3aaa9GG12331333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12331333barEv,_ZThn8_N3aaa9GG12331333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331333fooEv,_ZThn20_N3aaa9GG12331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12331333barEv,_ZThn20_N3aaa9GG12331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12331333fooEv,_ZThn28_N3aaa9GG12331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12331333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12331333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12331333barEv,_ZThn8_N3aaa9GG12331333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331333fooEv,_ZThn20_N3aaa9GG12331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12331333barEv,_ZThn20_N3aaa9GG12331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12331333fooEv,_ZThn28_N3aaa9GG12331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233133E[];
Class_Descriptor cd__ZN3aaa9GG1233133E = {  "_ZN3aaa9GG1233133E", // class name
  bases__ZN3aaa9GG1233133E, 6,
  &(vtc__ZN3aaa9GG1233133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233211  : ::aaa::EE123 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12332113fooEv
  ~GG1233211(); // tgen
  GG1233211(); // tgen
};
//SIG(1 _ZN3aaa9GG1233211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233211 ::foo(){vfunc_called(this, "_ZN3aaa9GG12332113fooEv");}
aaa::GG1233211 ::~GG1233211(){ note_dtor("_ZN3aaa9GG1233211E", this);} // tgen
aaa::GG1233211 ::GG1233211(){ note_ctor("_ZN3aaa9GG1233211E", this);} // tgen
}
static void Test__ZN3aaa9GG1233211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233211E, buf);
    ::aaa::GG1233211 *dp, &lv = *(dp=new (buf) ::aaa::GG1233211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233211E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1233211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1233211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1233211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233211E);
    dp->::aaa::GG1233211::~GG1233211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233211E(Test__ZN3aaa9GG1233211E, "_ZN3aaa9GG1233211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233211C1Ev();
extern void _ZN3aaa9GG1233211D1Ev();
Name_Map name_map__ZN3aaa9GG1233211E[] = {
  NSPAIR(_ZN3aaa9GG1233211C1Ev),
  NSPAIR(_ZN3aaa9GG1233211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1233211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233211E[];
extern void _ZN3aaa9GG12332113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332113fooEv,_ZThn20_N3aaa9GG12332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12332113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332113fooEv,_ZThn20_N3aaa9GG12332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233211E[];
Class_Descriptor cd__ZN3aaa9GG1233211E = {  "_ZN3aaa9GG1233211E", // class name
  bases__ZN3aaa9GG1233211E, 6,
  &(vtc__ZN3aaa9GG1233211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233212  : ::aaa::EE123 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12332123barEv
  ~GG1233212(); // tgen
  GG1233212(); // tgen
};
//SIG(1 _ZN3aaa9GG1233212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233212 ::bar(){vfunc_called(this, "_ZN3aaa9GG12332123barEv");}
aaa::GG1233212 ::~GG1233212(){ note_dtor("_ZN3aaa9GG1233212E", this);} // tgen
aaa::GG1233212 ::GG1233212(){ note_ctor("_ZN3aaa9GG1233212E", this);} // tgen
}
static void Test__ZN3aaa9GG1233212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233212E, buf);
    ::aaa::GG1233212 *dp, &lv = *(dp=new (buf) ::aaa::GG1233212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233212E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1233212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1233212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1233212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233212E);
    dp->::aaa::GG1233212::~GG1233212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233212E(Test__ZN3aaa9GG1233212E, "_ZN3aaa9GG1233212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233212C1Ev();
extern void _ZN3aaa9GG1233212D1Ev();
Name_Map name_map__ZN3aaa9GG1233212E[] = {
  NSPAIR(_ZN3aaa9GG1233212C1Ev),
  NSPAIR(_ZN3aaa9GG1233212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1233212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233212E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12332123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12332123barEv,_ZThn8_N3aaa9GG12332123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12332123barEv,_ZThn20_N3aaa9GG12332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12332123barEv,_ZThn28_N3aaa9GG12332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12332123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12332123barEv,_ZThn8_N3aaa9GG12332123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332123barEv,_ZThn20_N3aaa9GG12332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12332123barEv,_ZThn28_N3aaa9GG12332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233212E[];
Class_Descriptor cd__ZN3aaa9GG1233212E = {  "_ZN3aaa9GG1233212E", // class name
  bases__ZN3aaa9GG1233212E, 6,
  &(vtc__ZN3aaa9GG1233212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233213  : ::aaa::EE123 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12332133fooEv
  virtual void  bar(); // _ZN3aaa9GG12332133barEv
  ~GG1233213(); // tgen
  GG1233213(); // tgen
};
//SIG(1 _ZN3aaa9GG1233213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233213 ::foo(){vfunc_called(this, "_ZN3aaa9GG12332133fooEv");}
void  aaa::GG1233213 ::bar(){vfunc_called(this, "_ZN3aaa9GG12332133barEv");}
aaa::GG1233213 ::~GG1233213(){ note_dtor("_ZN3aaa9GG1233213E", this);} // tgen
aaa::GG1233213 ::GG1233213(){ note_ctor("_ZN3aaa9GG1233213E", this);} // tgen
}
static void Test__ZN3aaa9GG1233213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233213E, buf);
    ::aaa::GG1233213 *dp, &lv = *(dp=new (buf) ::aaa::GG1233213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233213E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1233213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1233213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1233213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233213E);
    dp->::aaa::GG1233213::~GG1233213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233213E(Test__ZN3aaa9GG1233213E, "_ZN3aaa9GG1233213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233213C1Ev();
extern void _ZN3aaa9GG1233213D1Ev();
Name_Map name_map__ZN3aaa9GG1233213E[] = {
  NSPAIR(_ZN3aaa9GG1233213C1Ev),
  NSPAIR(_ZN3aaa9GG1233213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1233213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233213E[];
extern void _ZN3aaa9GG12332133fooEv();
extern void _ZN3aaa9GG12332133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12332133barEv,_ZThn8_N3aaa9GG12332133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332133fooEv,_ZThn20_N3aaa9GG12332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332133barEv,_ZThn20_N3aaa9GG12332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12332133barEv,_ZThn28_N3aaa9GG12332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12332133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12332133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12332133barEv,_ZThn8_N3aaa9GG12332133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332133fooEv,_ZThn20_N3aaa9GG12332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332133barEv,_ZThn20_N3aaa9GG12332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12332133barEv,_ZThn28_N3aaa9GG12332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233213E[];
Class_Descriptor cd__ZN3aaa9GG1233213E = {  "_ZN3aaa9GG1233213E", // class name
  bases__ZN3aaa9GG1233213E, 6,
  &(vtc__ZN3aaa9GG1233213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233221  : ::aaa::EE123 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12332213fooEv
  ~GG1233221(); // tgen
  GG1233221(); // tgen
};
//SIG(1 _ZN3aaa9GG1233221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233221 ::foo(){vfunc_called(this, "_ZN3aaa9GG12332213fooEv");}
aaa::GG1233221 ::~GG1233221(){ note_dtor("_ZN3aaa9GG1233221E", this);} // tgen
aaa::GG1233221 ::GG1233221(){ note_ctor("_ZN3aaa9GG1233221E", this);} // tgen
}
static void Test__ZN3aaa9GG1233221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233221E, buf);
    ::aaa::GG1233221 *dp, &lv = *(dp=new (buf) ::aaa::GG1233221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233221E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1233221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1233221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1233221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233221E);
    dp->::aaa::GG1233221::~GG1233221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233221E(Test__ZN3aaa9GG1233221E, "_ZN3aaa9GG1233221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233221C1Ev();
extern void _ZN3aaa9GG1233221D1Ev();
Name_Map name_map__ZN3aaa9GG1233221E[] = {
  NSPAIR(_ZN3aaa9GG1233221C1Ev),
  NSPAIR(_ZN3aaa9GG1233221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1233221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233221E[];
extern void _ZN3aaa9GG12332213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332213fooEv,_ZThn20_N3aaa9GG12332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12332213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332213fooEv,_ZThn20_N3aaa9GG12332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233221E[];
Class_Descriptor cd__ZN3aaa9GG1233221E = {  "_ZN3aaa9GG1233221E", // class name
  bases__ZN3aaa9GG1233221E, 6,
  &(vtc__ZN3aaa9GG1233221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233222  : ::aaa::EE123 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12332223barEv
  ~GG1233222(); // tgen
  GG1233222(); // tgen
};
//SIG(1 _ZN3aaa9GG1233222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233222 ::bar(){vfunc_called(this, "_ZN3aaa9GG12332223barEv");}
aaa::GG1233222 ::~GG1233222(){ note_dtor("_ZN3aaa9GG1233222E", this);} // tgen
aaa::GG1233222 ::GG1233222(){ note_ctor("_ZN3aaa9GG1233222E", this);} // tgen
}
static void Test__ZN3aaa9GG1233222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233222E, buf);
    ::aaa::GG1233222 *dp, &lv = *(dp=new (buf) ::aaa::GG1233222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233222E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1233222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1233222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1233222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233222E);
    dp->::aaa::GG1233222::~GG1233222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233222E(Test__ZN3aaa9GG1233222E, "_ZN3aaa9GG1233222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233222C1Ev();
extern void _ZN3aaa9GG1233222D1Ev();
Name_Map name_map__ZN3aaa9GG1233222E[] = {
  NSPAIR(_ZN3aaa9GG1233222C1Ev),
  NSPAIR(_ZN3aaa9GG1233222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1233222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233222E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12332223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12332223barEv,_ZThn8_N3aaa9GG12332223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12332223barEv,_ZThn20_N3aaa9GG12332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12332223barEv,_ZThn28_N3aaa9GG12332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12332223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12332223barEv,_ZThn8_N3aaa9GG12332223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332223barEv,_ZThn20_N3aaa9GG12332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12332223barEv,_ZThn28_N3aaa9GG12332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233222E[];
Class_Descriptor cd__ZN3aaa9GG1233222E = {  "_ZN3aaa9GG1233222E", // class name
  bases__ZN3aaa9GG1233222E, 6,
  &(vtc__ZN3aaa9GG1233222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233223  : ::aaa::EE123 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12332233fooEv
  virtual void  bar(); // _ZN3aaa9GG12332233barEv
  ~GG1233223(); // tgen
  GG1233223(); // tgen
};
//SIG(1 _ZN3aaa9GG1233223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233223 ::foo(){vfunc_called(this, "_ZN3aaa9GG12332233fooEv");}
void  aaa::GG1233223 ::bar(){vfunc_called(this, "_ZN3aaa9GG12332233barEv");}
aaa::GG1233223 ::~GG1233223(){ note_dtor("_ZN3aaa9GG1233223E", this);} // tgen
aaa::GG1233223 ::GG1233223(){ note_ctor("_ZN3aaa9GG1233223E", this);} // tgen
}
static void Test__ZN3aaa9GG1233223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233223E, buf);
    ::aaa::GG1233223 *dp, &lv = *(dp=new (buf) ::aaa::GG1233223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233223E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1233223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1233223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1233223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233223E);
    dp->::aaa::GG1233223::~GG1233223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233223E(Test__ZN3aaa9GG1233223E, "_ZN3aaa9GG1233223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233223C1Ev();
extern void _ZN3aaa9GG1233223D1Ev();
Name_Map name_map__ZN3aaa9GG1233223E[] = {
  NSPAIR(_ZN3aaa9GG1233223C1Ev),
  NSPAIR(_ZN3aaa9GG1233223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1233223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233223E[];
extern void _ZN3aaa9GG12332233fooEv();
extern void _ZN3aaa9GG12332233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12332233barEv,_ZThn8_N3aaa9GG12332233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332233fooEv,_ZThn20_N3aaa9GG12332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332233barEv,_ZThn20_N3aaa9GG12332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12332233barEv,_ZThn28_N3aaa9GG12332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12332233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12332233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12332233barEv,_ZThn8_N3aaa9GG12332233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332233fooEv,_ZThn20_N3aaa9GG12332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332233barEv,_ZThn20_N3aaa9GG12332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12332233barEv,_ZThn28_N3aaa9GG12332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233223E[];
Class_Descriptor cd__ZN3aaa9GG1233223E = {  "_ZN3aaa9GG1233223E", // class name
  bases__ZN3aaa9GG1233223E, 6,
  &(vtc__ZN3aaa9GG1233223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233231  : ::aaa::EE123 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12332313fooEv
  ~GG1233231(); // tgen
  GG1233231(); // tgen
};
//SIG(1 _ZN3aaa9GG1233231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233231 ::foo(){vfunc_called(this, "_ZN3aaa9GG12332313fooEv");}
aaa::GG1233231 ::~GG1233231(){ note_dtor("_ZN3aaa9GG1233231E", this);} // tgen
aaa::GG1233231 ::GG1233231(){ note_ctor("_ZN3aaa9GG1233231E", this);} // tgen
}
static void Test__ZN3aaa9GG1233231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233231E, buf);
    ::aaa::GG1233231 *dp, &lv = *(dp=new (buf) ::aaa::GG1233231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233231E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1233231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1233231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1233231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233231E);
    dp->::aaa::GG1233231::~GG1233231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233231E(Test__ZN3aaa9GG1233231E, "_ZN3aaa9GG1233231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233231C1Ev();
extern void _ZN3aaa9GG1233231D1Ev();
Name_Map name_map__ZN3aaa9GG1233231E[] = {
  NSPAIR(_ZN3aaa9GG1233231C1Ev),
  NSPAIR(_ZN3aaa9GG1233231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1233231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233231E[];
extern void _ZN3aaa9GG12332313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332313fooEv,_ZThn20_N3aaa9GG12332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12332313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332313fooEv,_ZThn20_N3aaa9GG12332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233231E[];
Class_Descriptor cd__ZN3aaa9GG1233231E = {  "_ZN3aaa9GG1233231E", // class name
  bases__ZN3aaa9GG1233231E, 6,
  &(vtc__ZN3aaa9GG1233231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233232  : ::aaa::EE123 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12332323barEv
  ~GG1233232(); // tgen
  GG1233232(); // tgen
};
//SIG(1 _ZN3aaa9GG1233232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233232 ::bar(){vfunc_called(this, "_ZN3aaa9GG12332323barEv");}
aaa::GG1233232 ::~GG1233232(){ note_dtor("_ZN3aaa9GG1233232E", this);} // tgen
aaa::GG1233232 ::GG1233232(){ note_ctor("_ZN3aaa9GG1233232E", this);} // tgen
}
static void Test__ZN3aaa9GG1233232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233232E, buf);
    ::aaa::GG1233232 *dp, &lv = *(dp=new (buf) ::aaa::GG1233232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233232E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1233232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1233232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1233232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233232E);
    dp->::aaa::GG1233232::~GG1233232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233232E(Test__ZN3aaa9GG1233232E, "_ZN3aaa9GG1233232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233232C1Ev();
extern void _ZN3aaa9GG1233232D1Ev();
Name_Map name_map__ZN3aaa9GG1233232E[] = {
  NSPAIR(_ZN3aaa9GG1233232C1Ev),
  NSPAIR(_ZN3aaa9GG1233232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1233232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233232E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12332323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12332323barEv,_ZThn8_N3aaa9GG12332323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12332323barEv,_ZThn20_N3aaa9GG12332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12332323barEv,_ZThn28_N3aaa9GG12332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12332323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12332323barEv,_ZThn8_N3aaa9GG12332323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332323barEv,_ZThn20_N3aaa9GG12332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12332323barEv,_ZThn28_N3aaa9GG12332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233232E[];
Class_Descriptor cd__ZN3aaa9GG1233232E = {  "_ZN3aaa9GG1233232E", // class name
  bases__ZN3aaa9GG1233232E, 6,
  &(vtc__ZN3aaa9GG1233232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233233  : ::aaa::EE123 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12332333fooEv
  virtual void  bar(); // _ZN3aaa9GG12332333barEv
  ~GG1233233(); // tgen
  GG1233233(); // tgen
};
//SIG(1 _ZN3aaa9GG1233233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233233 ::foo(){vfunc_called(this, "_ZN3aaa9GG12332333fooEv");}
void  aaa::GG1233233 ::bar(){vfunc_called(this, "_ZN3aaa9GG12332333barEv");}
aaa::GG1233233 ::~GG1233233(){ note_dtor("_ZN3aaa9GG1233233E", this);} // tgen
aaa::GG1233233 ::GG1233233(){ note_ctor("_ZN3aaa9GG1233233E", this);} // tgen
}
static void Test__ZN3aaa9GG1233233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233233E, buf);
    ::aaa::GG1233233 *dp, &lv = *(dp=new (buf) ::aaa::GG1233233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233233E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1233233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1233233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1233233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233233E);
    dp->::aaa::GG1233233::~GG1233233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233233E(Test__ZN3aaa9GG1233233E, "_ZN3aaa9GG1233233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233233C1Ev();
extern void _ZN3aaa9GG1233233D1Ev();
Name_Map name_map__ZN3aaa9GG1233233E[] = {
  NSPAIR(_ZN3aaa9GG1233233C1Ev),
  NSPAIR(_ZN3aaa9GG1233233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1233233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233233E[];
extern void _ZN3aaa9GG12332333fooEv();
extern void _ZN3aaa9GG12332333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12332333barEv,_ZThn8_N3aaa9GG12332333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332333fooEv,_ZThn20_N3aaa9GG12332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12332333barEv,_ZThn20_N3aaa9GG12332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12332333barEv,_ZThn28_N3aaa9GG12332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12332333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12332333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12332333barEv,_ZThn8_N3aaa9GG12332333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332333fooEv,_ZThn20_N3aaa9GG12332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12332333barEv,_ZThn20_N3aaa9GG12332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12332333barEv,_ZThn28_N3aaa9GG12332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233233E[];
Class_Descriptor cd__ZN3aaa9GG1233233E = {  "_ZN3aaa9GG1233233E", // class name
  bases__ZN3aaa9GG1233233E, 6,
  &(vtc__ZN3aaa9GG1233233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233311  : ::aaa::EE123 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12333113fooEv
  ~GG1233311(); // tgen
  GG1233311(); // tgen
};
//SIG(1 _ZN3aaa9GG1233311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233311 ::foo(){vfunc_called(this, "_ZN3aaa9GG12333113fooEv");}
aaa::GG1233311 ::~GG1233311(){ note_dtor("_ZN3aaa9GG1233311E", this);} // tgen
aaa::GG1233311 ::GG1233311(){ note_ctor("_ZN3aaa9GG1233311E", this);} // tgen
}
static void Test__ZN3aaa9GG1233311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233311E, buf);
    ::aaa::GG1233311 *dp, &lv = *(dp=new (buf) ::aaa::GG1233311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233311E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1233311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1233311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1233311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233311E);
    dp->::aaa::GG1233311::~GG1233311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233311E(Test__ZN3aaa9GG1233311E, "_ZN3aaa9GG1233311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233311C1Ev();
extern void _ZN3aaa9GG1233311D1Ev();
Name_Map name_map__ZN3aaa9GG1233311E[] = {
  NSPAIR(_ZN3aaa9GG1233311C1Ev),
  NSPAIR(_ZN3aaa9GG1233311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1233311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233311E[];
extern void _ZN3aaa9GG12333113fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333113fooEv,_ZThn20_N3aaa9GG12333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12333113fooEv,_ZThn28_N3aaa9GG12333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12333113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333113fooEv,_ZThn20_N3aaa9GG12333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333113fooEv,_ZThn28_N3aaa9GG12333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233311E[];
Class_Descriptor cd__ZN3aaa9GG1233311E = {  "_ZN3aaa9GG1233311E", // class name
  bases__ZN3aaa9GG1233311E, 6,
  &(vtc__ZN3aaa9GG1233311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233312  : ::aaa::EE123 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12333123barEv
  ~GG1233312(); // tgen
  GG1233312(); // tgen
};
//SIG(1 _ZN3aaa9GG1233312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233312 ::bar(){vfunc_called(this, "_ZN3aaa9GG12333123barEv");}
aaa::GG1233312 ::~GG1233312(){ note_dtor("_ZN3aaa9GG1233312E", this);} // tgen
aaa::GG1233312 ::GG1233312(){ note_ctor("_ZN3aaa9GG1233312E", this);} // tgen
}
static void Test__ZN3aaa9GG1233312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233312E, buf);
    ::aaa::GG1233312 *dp, &lv = *(dp=new (buf) ::aaa::GG1233312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233312E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1233312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1233312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1233312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233312E);
    dp->::aaa::GG1233312::~GG1233312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233312E(Test__ZN3aaa9GG1233312E, "_ZN3aaa9GG1233312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233312C1Ev();
extern void _ZN3aaa9GG1233312D1Ev();
Name_Map name_map__ZN3aaa9GG1233312E[] = {
  NSPAIR(_ZN3aaa9GG1233312C1Ev),
  NSPAIR(_ZN3aaa9GG1233312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1233312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233312E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12333123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12333123barEv,_ZThn8_N3aaa9GG12333123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12333123barEv,_ZThn20_N3aaa9GG12333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12333123barEv,_ZThn28_N3aaa9GG12333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12333123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12333123barEv,_ZThn8_N3aaa9GG12333123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333123barEv,_ZThn20_N3aaa9GG12333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333123barEv,_ZThn28_N3aaa9GG12333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233312E[];
Class_Descriptor cd__ZN3aaa9GG1233312E = {  "_ZN3aaa9GG1233312E", // class name
  bases__ZN3aaa9GG1233312E, 6,
  &(vtc__ZN3aaa9GG1233312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233313  : ::aaa::EE123 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12333133fooEv
  virtual void  bar(); // _ZN3aaa9GG12333133barEv
  ~GG1233313(); // tgen
  GG1233313(); // tgen
};
//SIG(1 _ZN3aaa9GG1233313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233313 ::foo(){vfunc_called(this, "_ZN3aaa9GG12333133fooEv");}
void  aaa::GG1233313 ::bar(){vfunc_called(this, "_ZN3aaa9GG12333133barEv");}
aaa::GG1233313 ::~GG1233313(){ note_dtor("_ZN3aaa9GG1233313E", this);} // tgen
aaa::GG1233313 ::GG1233313(){ note_ctor("_ZN3aaa9GG1233313E", this);} // tgen
}
static void Test__ZN3aaa9GG1233313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233313E, buf);
    ::aaa::GG1233313 *dp, &lv = *(dp=new (buf) ::aaa::GG1233313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233313E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1233313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1233313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1233313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233313E);
    dp->::aaa::GG1233313::~GG1233313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233313E(Test__ZN3aaa9GG1233313E, "_ZN3aaa9GG1233313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233313C1Ev();
extern void _ZN3aaa9GG1233313D1Ev();
Name_Map name_map__ZN3aaa9GG1233313E[] = {
  NSPAIR(_ZN3aaa9GG1233313C1Ev),
  NSPAIR(_ZN3aaa9GG1233313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1233313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233313E[];
extern void _ZN3aaa9GG12333133fooEv();
extern void _ZN3aaa9GG12333133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12333133barEv,_ZThn8_N3aaa9GG12333133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333133fooEv,_ZThn20_N3aaa9GG12333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333133barEv,_ZThn20_N3aaa9GG12333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12333133fooEv,_ZThn28_N3aaa9GG12333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12333133barEv,_ZThn28_N3aaa9GG12333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12333133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12333133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12333133barEv,_ZThn8_N3aaa9GG12333133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333133fooEv,_ZThn20_N3aaa9GG12333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333133barEv,_ZThn20_N3aaa9GG12333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333133fooEv,_ZThn28_N3aaa9GG12333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333133barEv,_ZThn28_N3aaa9GG12333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233313E[];
Class_Descriptor cd__ZN3aaa9GG1233313E = {  "_ZN3aaa9GG1233313E", // class name
  bases__ZN3aaa9GG1233313E, 6,
  &(vtc__ZN3aaa9GG1233313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233321  : ::aaa::EE123 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12333213fooEv
  ~GG1233321(); // tgen
  GG1233321(); // tgen
};
//SIG(1 _ZN3aaa9GG1233321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233321 ::foo(){vfunc_called(this, "_ZN3aaa9GG12333213fooEv");}
aaa::GG1233321 ::~GG1233321(){ note_dtor("_ZN3aaa9GG1233321E", this);} // tgen
aaa::GG1233321 ::GG1233321(){ note_ctor("_ZN3aaa9GG1233321E", this);} // tgen
}
static void Test__ZN3aaa9GG1233321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233321E, buf);
    ::aaa::GG1233321 *dp, &lv = *(dp=new (buf) ::aaa::GG1233321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233321E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1233321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1233321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1233321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233321E);
    dp->::aaa::GG1233321::~GG1233321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233321E(Test__ZN3aaa9GG1233321E, "_ZN3aaa9GG1233321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233321C1Ev();
extern void _ZN3aaa9GG1233321D1Ev();
Name_Map name_map__ZN3aaa9GG1233321E[] = {
  NSPAIR(_ZN3aaa9GG1233321C1Ev),
  NSPAIR(_ZN3aaa9GG1233321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1233321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233321E[];
extern void _ZN3aaa9GG12333213fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333213fooEv,_ZThn20_N3aaa9GG12333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12333213fooEv,_ZThn28_N3aaa9GG12333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12333213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333213fooEv,_ZThn20_N3aaa9GG12333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333213fooEv,_ZThn28_N3aaa9GG12333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233321E[];
Class_Descriptor cd__ZN3aaa9GG1233321E = {  "_ZN3aaa9GG1233321E", // class name
  bases__ZN3aaa9GG1233321E, 6,
  &(vtc__ZN3aaa9GG1233321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233322  : ::aaa::EE123 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12333223barEv
  ~GG1233322(); // tgen
  GG1233322(); // tgen
};
//SIG(1 _ZN3aaa9GG1233322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233322 ::bar(){vfunc_called(this, "_ZN3aaa9GG12333223barEv");}
aaa::GG1233322 ::~GG1233322(){ note_dtor("_ZN3aaa9GG1233322E", this);} // tgen
aaa::GG1233322 ::GG1233322(){ note_ctor("_ZN3aaa9GG1233322E", this);} // tgen
}
static void Test__ZN3aaa9GG1233322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233322E, buf);
    ::aaa::GG1233322 *dp, &lv = *(dp=new (buf) ::aaa::GG1233322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233322E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1233322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1233322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1233322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233322E);
    dp->::aaa::GG1233322::~GG1233322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233322E(Test__ZN3aaa9GG1233322E, "_ZN3aaa9GG1233322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233322C1Ev();
extern void _ZN3aaa9GG1233322D1Ev();
Name_Map name_map__ZN3aaa9GG1233322E[] = {
  NSPAIR(_ZN3aaa9GG1233322C1Ev),
  NSPAIR(_ZN3aaa9GG1233322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1233322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233322E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12333223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12333223barEv,_ZThn8_N3aaa9GG12333223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12333223barEv,_ZThn20_N3aaa9GG12333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12333223barEv,_ZThn28_N3aaa9GG12333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12333223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12333223barEv,_ZThn8_N3aaa9GG12333223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333223barEv,_ZThn20_N3aaa9GG12333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333223barEv,_ZThn28_N3aaa9GG12333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233322E[];
Class_Descriptor cd__ZN3aaa9GG1233322E = {  "_ZN3aaa9GG1233322E", // class name
  bases__ZN3aaa9GG1233322E, 6,
  &(vtc__ZN3aaa9GG1233322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233323  : ::aaa::EE123 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12333233fooEv
  virtual void  bar(); // _ZN3aaa9GG12333233barEv
  ~GG1233323(); // tgen
  GG1233323(); // tgen
};
//SIG(1 _ZN3aaa9GG1233323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233323 ::foo(){vfunc_called(this, "_ZN3aaa9GG12333233fooEv");}
void  aaa::GG1233323 ::bar(){vfunc_called(this, "_ZN3aaa9GG12333233barEv");}
aaa::GG1233323 ::~GG1233323(){ note_dtor("_ZN3aaa9GG1233323E", this);} // tgen
aaa::GG1233323 ::GG1233323(){ note_ctor("_ZN3aaa9GG1233323E", this);} // tgen
}
static void Test__ZN3aaa9GG1233323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233323E, buf);
    ::aaa::GG1233323 *dp, &lv = *(dp=new (buf) ::aaa::GG1233323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233323E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1233323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1233323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1233323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233323E);
    dp->::aaa::GG1233323::~GG1233323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233323E(Test__ZN3aaa9GG1233323E, "_ZN3aaa9GG1233323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233323C1Ev();
extern void _ZN3aaa9GG1233323D1Ev();
Name_Map name_map__ZN3aaa9GG1233323E[] = {
  NSPAIR(_ZN3aaa9GG1233323C1Ev),
  NSPAIR(_ZN3aaa9GG1233323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1233323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233323E[];
extern void _ZN3aaa9GG12333233fooEv();
extern void _ZN3aaa9GG12333233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12333233barEv,_ZThn8_N3aaa9GG12333233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333233fooEv,_ZThn20_N3aaa9GG12333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333233barEv,_ZThn20_N3aaa9GG12333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12333233fooEv,_ZThn28_N3aaa9GG12333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12333233barEv,_ZThn28_N3aaa9GG12333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12333233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12333233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12333233barEv,_ZThn8_N3aaa9GG12333233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333233fooEv,_ZThn20_N3aaa9GG12333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333233barEv,_ZThn20_N3aaa9GG12333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333233fooEv,_ZThn28_N3aaa9GG12333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333233barEv,_ZThn28_N3aaa9GG12333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233323E[];
Class_Descriptor cd__ZN3aaa9GG1233323E = {  "_ZN3aaa9GG1233323E", // class name
  bases__ZN3aaa9GG1233323E, 6,
  &(vtc__ZN3aaa9GG1233323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233331  : ::aaa::EE123 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12333313fooEv
  ~GG1233331(); // tgen
  GG1233331(); // tgen
};
//SIG(1 _ZN3aaa9GG1233331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233331 ::foo(){vfunc_called(this, "_ZN3aaa9GG12333313fooEv");}
aaa::GG1233331 ::~GG1233331(){ note_dtor("_ZN3aaa9GG1233331E", this);} // tgen
aaa::GG1233331 ::GG1233331(){ note_ctor("_ZN3aaa9GG1233331E", this);} // tgen
}
static void Test__ZN3aaa9GG1233331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233331E, buf);
    ::aaa::GG1233331 *dp, &lv = *(dp=new (buf) ::aaa::GG1233331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233331E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1233331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1233331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1233331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233331E);
    dp->::aaa::GG1233331::~GG1233331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233331E(Test__ZN3aaa9GG1233331E, "_ZN3aaa9GG1233331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233331C1Ev();
extern void _ZN3aaa9GG1233331D1Ev();
Name_Map name_map__ZN3aaa9GG1233331E[] = {
  NSPAIR(_ZN3aaa9GG1233331C1Ev),
  NSPAIR(_ZN3aaa9GG1233331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1233331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233331E[];
extern void _ZN3aaa9GG12333313fooEv();
extern void _ZN3aaa5EE1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333313fooEv,_ZThn20_N3aaa9GG12333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG12333313fooEv,_ZThn28_N3aaa9GG12333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12333313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1233barEv,_ZThn8_N3aaa5EE1233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333313fooEv,_ZThn20_N3aaa9GG12333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333313fooEv,_ZThn28_N3aaa9GG12333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233331E[];
Class_Descriptor cd__ZN3aaa9GG1233331E = {  "_ZN3aaa9GG1233331E", // class name
  bases__ZN3aaa9GG1233331E, 6,
  &(vtc__ZN3aaa9GG1233331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233332  : ::aaa::EE123 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG12333323barEv
  ~GG1233332(); // tgen
  GG1233332(); // tgen
};
//SIG(1 _ZN3aaa9GG1233332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1233332 ::bar(){vfunc_called(this, "_ZN3aaa9GG12333323barEv");}
aaa::GG1233332 ::~GG1233332(){ note_dtor("_ZN3aaa9GG1233332E", this);} // tgen
aaa::GG1233332 ::GG1233332(){ note_ctor("_ZN3aaa9GG1233332E", this);} // tgen
}
static void Test__ZN3aaa9GG1233332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233332E, buf);
    ::aaa::GG1233332 *dp, &lv = *(dp=new (buf) ::aaa::GG1233332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233332E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1233332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1233332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1233332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233332E);
    dp->::aaa::GG1233332::~GG1233332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233332E(Test__ZN3aaa9GG1233332E, "_ZN3aaa9GG1233332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233332C1Ev();
extern void _ZN3aaa9GG1233332D1Ev();
Name_Map name_map__ZN3aaa9GG1233332E[] = {
  NSPAIR(_ZN3aaa9GG1233332C1Ev),
  NSPAIR(_ZN3aaa9GG1233332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1233332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233332E[];
extern void _ZN3aaa5EE1233fooEv();
extern void _ZN3aaa9GG12333323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12333323barEv,_ZThn8_N3aaa9GG12333323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG12333323barEv,_ZThn20_N3aaa9GG12333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12333323barEv,_ZThn28_N3aaa9GG12333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12333323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12333323barEv,_ZThn8_N3aaa9GG12333323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333323barEv,_ZThn20_N3aaa9GG12333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333323barEv,_ZThn28_N3aaa9GG12333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233332E[];
Class_Descriptor cd__ZN3aaa9GG1233332E = {  "_ZN3aaa9GG1233332E", // class name
  bases__ZN3aaa9GG1233332E, 6,
  &(vtc__ZN3aaa9GG1233332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1233333  : ::aaa::EE123 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG12333333fooEv
  virtual void  bar(); // _ZN3aaa9GG12333333barEv
  ~GG1233333(); // tgen
  GG1233333(); // tgen
};
//SIG(1 _ZN3aaa9GG1233333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1233333 ::foo(){vfunc_called(this, "_ZN3aaa9GG12333333fooEv");}
void  aaa::GG1233333 ::bar(){vfunc_called(this, "_ZN3aaa9GG12333333barEv");}
aaa::GG1233333 ::~GG1233333(){ note_dtor("_ZN3aaa9GG1233333E", this);} // tgen
aaa::GG1233333 ::GG1233333(){ note_ctor("_ZN3aaa9GG1233333E", this);} // tgen
}
static void Test__ZN3aaa9GG1233333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1233333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1233333E, buf);
    ::aaa::GG1233333 *dp, &lv = *(dp=new (buf) ::aaa::GG1233333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1233333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1233333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE123*), 0, "_ZN3aaa9GG1233333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE123*), ABISELECT(16,8), "_ZN3aaa9GG1233333E");
    check_base_class_offset(lv, (::aaa::EE123*), 0, "_ZN3aaa9GG1233333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1233333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1233333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1233333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1233333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1233333E);
    dp->::aaa::GG1233333::~GG1233333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1233333E(Test__ZN3aaa9GG1233333E, "_ZN3aaa9GG1233333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1233333C1Ev();
extern void _ZN3aaa9GG1233333D1Ev();
Name_Map name_map__ZN3aaa9GG1233333E[] = {
  NSPAIR(_ZN3aaa9GG1233333C1Ev),
  NSPAIR(_ZN3aaa9GG1233333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE123E;
extern VTBL_ENTRY _ZTIN3aaa5EE123E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE123E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1233333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE123E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1233333E[];
extern void _ZN3aaa9GG12333333fooEv();
extern void _ZN3aaa9GG12333333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG12333333barEv,_ZThn8_N3aaa9GG12333333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333333fooEv,_ZThn20_N3aaa9GG12333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG12333333barEv,_ZThn20_N3aaa9GG12333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12333333fooEv,_ZThn28_N3aaa9GG12333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG12333333barEv,_ZThn28_N3aaa9GG12333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1233333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG12333333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG12333333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG12333333barEv,_ZThn8_N3aaa9GG12333333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333333fooEv,_ZThn20_N3aaa9GG12333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG12333333barEv,_ZThn20_N3aaa9GG12333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333333fooEv,_ZThn28_N3aaa9GG12333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG12333333barEv,_ZThn28_N3aaa9GG12333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1233333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1233333E[];
Class_Descriptor cd__ZN3aaa9GG1233333E = {  "_ZN3aaa9GG1233333E", // class name
  bases__ZN3aaa9GG1233333E, 6,
  &(vtc__ZN3aaa9GG1233333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1233333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1233333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311111  : ::aaa::EE131 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13111113fooEv
  ~GG1311111(); // tgen
  GG1311111(); // tgen
};
//SIG(1 _ZN3aaa9GG1311111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13111113fooEv");}
aaa::GG1311111 ::~GG1311111(){ note_dtor("_ZN3aaa9GG1311111E", this);} // tgen
aaa::GG1311111 ::GG1311111(){ note_ctor("_ZN3aaa9GG1311111E", this);} // tgen
}
static void Test__ZN3aaa9GG1311111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311111E, buf);
    ::aaa::GG1311111 *dp, &lv = *(dp=new (buf) ::aaa::GG1311111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311111E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1311111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1311111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1311111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311111E);
    dp->::aaa::GG1311111::~GG1311111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311111E(Test__ZN3aaa9GG1311111E, "_ZN3aaa9GG1311111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311111C1Ev();
extern void _ZN3aaa9GG1311111D1Ev();
Name_Map name_map__ZN3aaa9GG1311111E[] = {
  NSPAIR(_ZN3aaa9GG1311111C1Ev),
  NSPAIR(_ZN3aaa9GG1311111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1311111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311111E[];
extern void _ZN3aaa9GG13111113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13111113fooEv,_ZThn8_N3aaa9GG13111113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13111113fooEv,_ZThn20_N3aaa9GG13111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13111113fooEv,_ZThn28_N3aaa9GG13111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13111113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111113fooEv,_ZThn8_N3aaa9GG13111113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111113fooEv,_ZThn20_N3aaa9GG13111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13111113fooEv,_ZThn28_N3aaa9GG13111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311111E[];
Class_Descriptor cd__ZN3aaa9GG1311111E = {  "_ZN3aaa9GG1311111E", // class name
  bases__ZN3aaa9GG1311111E, 6,
  &(vtc__ZN3aaa9GG1311111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311112  : ::aaa::EE131 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13111123barEv
  ~GG1311112(); // tgen
  GG1311112(); // tgen
};
//SIG(1 _ZN3aaa9GG1311112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13111123barEv");}
aaa::GG1311112 ::~GG1311112(){ note_dtor("_ZN3aaa9GG1311112E", this);} // tgen
aaa::GG1311112 ::GG1311112(){ note_ctor("_ZN3aaa9GG1311112E", this);} // tgen
}
static void Test__ZN3aaa9GG1311112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311112E, buf);
    ::aaa::GG1311112 *dp, &lv = *(dp=new (buf) ::aaa::GG1311112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311112E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1311112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1311112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1311112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311112E);
    dp->::aaa::GG1311112::~GG1311112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311112E(Test__ZN3aaa9GG1311112E, "_ZN3aaa9GG1311112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311112C1Ev();
extern void _ZN3aaa9GG1311112D1Ev();
Name_Map name_map__ZN3aaa9GG1311112E[] = {
  NSPAIR(_ZN3aaa9GG1311112C1Ev),
  NSPAIR(_ZN3aaa9GG1311112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1311112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311112E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13111123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13111123barEv,_ZThn8_N3aaa9GG13111123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13111123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111123barEv,_ZThn8_N3aaa9GG13111123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311112E[];
Class_Descriptor cd__ZN3aaa9GG1311112E = {  "_ZN3aaa9GG1311112E", // class name
  bases__ZN3aaa9GG1311112E, 6,
  &(vtc__ZN3aaa9GG1311112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311113  : ::aaa::EE131 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13111133fooEv
  virtual void  bar(); // _ZN3aaa9GG13111133barEv
  ~GG1311113(); // tgen
  GG1311113(); // tgen
};
//SIG(1 _ZN3aaa9GG1311113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13111133fooEv");}
void  aaa::GG1311113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13111133barEv");}
aaa::GG1311113 ::~GG1311113(){ note_dtor("_ZN3aaa9GG1311113E", this);} // tgen
aaa::GG1311113 ::GG1311113(){ note_ctor("_ZN3aaa9GG1311113E", this);} // tgen
}
static void Test__ZN3aaa9GG1311113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311113E, buf);
    ::aaa::GG1311113 *dp, &lv = *(dp=new (buf) ::aaa::GG1311113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311113E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1311113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1311113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1311113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311113E);
    dp->::aaa::GG1311113::~GG1311113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311113E(Test__ZN3aaa9GG1311113E, "_ZN3aaa9GG1311113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311113C1Ev();
extern void _ZN3aaa9GG1311113D1Ev();
Name_Map name_map__ZN3aaa9GG1311113E[] = {
  NSPAIR(_ZN3aaa9GG1311113C1Ev),
  NSPAIR(_ZN3aaa9GG1311113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1311113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311113E[];
extern void _ZN3aaa9GG13111133fooEv();
extern void _ZN3aaa9GG13111133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13111133fooEv,_ZThn8_N3aaa9GG13111133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13111133barEv,_ZThn8_N3aaa9GG13111133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13111133fooEv,_ZThn20_N3aaa9GG13111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13111133fooEv,_ZThn28_N3aaa9GG13111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13111133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13111133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111133fooEv,_ZThn8_N3aaa9GG13111133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111133barEv,_ZThn8_N3aaa9GG13111133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111133fooEv,_ZThn20_N3aaa9GG13111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13111133fooEv,_ZThn28_N3aaa9GG13111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311113E[];
Class_Descriptor cd__ZN3aaa9GG1311113E = {  "_ZN3aaa9GG1311113E", // class name
  bases__ZN3aaa9GG1311113E, 6,
  &(vtc__ZN3aaa9GG1311113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311121  : ::aaa::EE131 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13111213fooEv
  ~GG1311121(); // tgen
  GG1311121(); // tgen
};
//SIG(1 _ZN3aaa9GG1311121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13111213fooEv");}
aaa::GG1311121 ::~GG1311121(){ note_dtor("_ZN3aaa9GG1311121E", this);} // tgen
aaa::GG1311121 ::GG1311121(){ note_ctor("_ZN3aaa9GG1311121E", this);} // tgen
}
static void Test__ZN3aaa9GG1311121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311121E, buf);
    ::aaa::GG1311121 *dp, &lv = *(dp=new (buf) ::aaa::GG1311121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311121E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1311121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1311121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1311121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311121E);
    dp->::aaa::GG1311121::~GG1311121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311121E(Test__ZN3aaa9GG1311121E, "_ZN3aaa9GG1311121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311121C1Ev();
extern void _ZN3aaa9GG1311121D1Ev();
Name_Map name_map__ZN3aaa9GG1311121E[] = {
  NSPAIR(_ZN3aaa9GG1311121C1Ev),
  NSPAIR(_ZN3aaa9GG1311121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1311121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311121E[];
extern void _ZN3aaa9GG13111213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13111213fooEv,_ZThn8_N3aaa9GG13111213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13111213fooEv,_ZThn20_N3aaa9GG13111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13111213fooEv,_ZThn28_N3aaa9GG13111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13111213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111213fooEv,_ZThn8_N3aaa9GG13111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111213fooEv,_ZThn20_N3aaa9GG13111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13111213fooEv,_ZThn28_N3aaa9GG13111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311121E[];
Class_Descriptor cd__ZN3aaa9GG1311121E = {  "_ZN3aaa9GG1311121E", // class name
  bases__ZN3aaa9GG1311121E, 6,
  &(vtc__ZN3aaa9GG1311121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311122  : ::aaa::EE131 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13111223barEv
  ~GG1311122(); // tgen
  GG1311122(); // tgen
};
//SIG(1 _ZN3aaa9GG1311122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13111223barEv");}
aaa::GG1311122 ::~GG1311122(){ note_dtor("_ZN3aaa9GG1311122E", this);} // tgen
aaa::GG1311122 ::GG1311122(){ note_ctor("_ZN3aaa9GG1311122E", this);} // tgen
}
static void Test__ZN3aaa9GG1311122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311122E, buf);
    ::aaa::GG1311122 *dp, &lv = *(dp=new (buf) ::aaa::GG1311122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311122E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1311122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1311122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1311122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311122E);
    dp->::aaa::GG1311122::~GG1311122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311122E(Test__ZN3aaa9GG1311122E, "_ZN3aaa9GG1311122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311122C1Ev();
extern void _ZN3aaa9GG1311122D1Ev();
Name_Map name_map__ZN3aaa9GG1311122E[] = {
  NSPAIR(_ZN3aaa9GG1311122C1Ev),
  NSPAIR(_ZN3aaa9GG1311122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1311122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311122E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13111223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13111223barEv,_ZThn8_N3aaa9GG13111223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13111223barEv,_ZThn20_N3aaa9GG13111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13111223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111223barEv,_ZThn8_N3aaa9GG13111223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111223barEv,_ZThn20_N3aaa9GG13111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311122E[];
Class_Descriptor cd__ZN3aaa9GG1311122E = {  "_ZN3aaa9GG1311122E", // class name
  bases__ZN3aaa9GG1311122E, 6,
  &(vtc__ZN3aaa9GG1311122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311123  : ::aaa::EE131 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13111233fooEv
  virtual void  bar(); // _ZN3aaa9GG13111233barEv
  ~GG1311123(); // tgen
  GG1311123(); // tgen
};
//SIG(1 _ZN3aaa9GG1311123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13111233fooEv");}
void  aaa::GG1311123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13111233barEv");}
aaa::GG1311123 ::~GG1311123(){ note_dtor("_ZN3aaa9GG1311123E", this);} // tgen
aaa::GG1311123 ::GG1311123(){ note_ctor("_ZN3aaa9GG1311123E", this);} // tgen
}
static void Test__ZN3aaa9GG1311123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311123E, buf);
    ::aaa::GG1311123 *dp, &lv = *(dp=new (buf) ::aaa::GG1311123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311123E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1311123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1311123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1311123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311123E);
    dp->::aaa::GG1311123::~GG1311123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311123E(Test__ZN3aaa9GG1311123E, "_ZN3aaa9GG1311123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311123C1Ev();
extern void _ZN3aaa9GG1311123D1Ev();
Name_Map name_map__ZN3aaa9GG1311123E[] = {
  NSPAIR(_ZN3aaa9GG1311123C1Ev),
  NSPAIR(_ZN3aaa9GG1311123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1311123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311123E[];
extern void _ZN3aaa9GG13111233fooEv();
extern void _ZN3aaa9GG13111233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13111233fooEv,_ZThn8_N3aaa9GG13111233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13111233barEv,_ZThn8_N3aaa9GG13111233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13111233fooEv,_ZThn20_N3aaa9GG13111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13111233barEv,_ZThn20_N3aaa9GG13111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13111233fooEv,_ZThn28_N3aaa9GG13111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13111233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13111233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111233fooEv,_ZThn8_N3aaa9GG13111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111233barEv,_ZThn8_N3aaa9GG13111233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111233fooEv,_ZThn20_N3aaa9GG13111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111233barEv,_ZThn20_N3aaa9GG13111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13111233fooEv,_ZThn28_N3aaa9GG13111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311123E[];
Class_Descriptor cd__ZN3aaa9GG1311123E = {  "_ZN3aaa9GG1311123E", // class name
  bases__ZN3aaa9GG1311123E, 6,
  &(vtc__ZN3aaa9GG1311123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311131  : ::aaa::EE131 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13111313fooEv
  ~GG1311131(); // tgen
  GG1311131(); // tgen
};
//SIG(1 _ZN3aaa9GG1311131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13111313fooEv");}
aaa::GG1311131 ::~GG1311131(){ note_dtor("_ZN3aaa9GG1311131E", this);} // tgen
aaa::GG1311131 ::GG1311131(){ note_ctor("_ZN3aaa9GG1311131E", this);} // tgen
}
static void Test__ZN3aaa9GG1311131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311131E, buf);
    ::aaa::GG1311131 *dp, &lv = *(dp=new (buf) ::aaa::GG1311131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311131E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1311131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1311131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1311131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311131E);
    dp->::aaa::GG1311131::~GG1311131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311131E(Test__ZN3aaa9GG1311131E, "_ZN3aaa9GG1311131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311131C1Ev();
extern void _ZN3aaa9GG1311131D1Ev();
Name_Map name_map__ZN3aaa9GG1311131E[] = {
  NSPAIR(_ZN3aaa9GG1311131C1Ev),
  NSPAIR(_ZN3aaa9GG1311131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1311131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311131E[];
extern void _ZN3aaa9GG13111313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13111313fooEv,_ZThn8_N3aaa9GG13111313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13111313fooEv,_ZThn20_N3aaa9GG13111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13111313fooEv,_ZThn28_N3aaa9GG13111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13111313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111313fooEv,_ZThn8_N3aaa9GG13111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111313fooEv,_ZThn20_N3aaa9GG13111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13111313fooEv,_ZThn28_N3aaa9GG13111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311131E[];
Class_Descriptor cd__ZN3aaa9GG1311131E = {  "_ZN3aaa9GG1311131E", // class name
  bases__ZN3aaa9GG1311131E, 6,
  &(vtc__ZN3aaa9GG1311131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311132  : ::aaa::EE131 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13111323barEv
  ~GG1311132(); // tgen
  GG1311132(); // tgen
};
//SIG(1 _ZN3aaa9GG1311132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13111323barEv");}
aaa::GG1311132 ::~GG1311132(){ note_dtor("_ZN3aaa9GG1311132E", this);} // tgen
aaa::GG1311132 ::GG1311132(){ note_ctor("_ZN3aaa9GG1311132E", this);} // tgen
}
static void Test__ZN3aaa9GG1311132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311132E, buf);
    ::aaa::GG1311132 *dp, &lv = *(dp=new (buf) ::aaa::GG1311132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311132E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1311132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1311132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1311132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311132E);
    dp->::aaa::GG1311132::~GG1311132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311132E(Test__ZN3aaa9GG1311132E, "_ZN3aaa9GG1311132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311132C1Ev();
extern void _ZN3aaa9GG1311132D1Ev();
Name_Map name_map__ZN3aaa9GG1311132E[] = {
  NSPAIR(_ZN3aaa9GG1311132C1Ev),
  NSPAIR(_ZN3aaa9GG1311132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1311132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311132E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13111323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13111323barEv,_ZThn8_N3aaa9GG13111323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13111323barEv,_ZThn20_N3aaa9GG13111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13111323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111323barEv,_ZThn8_N3aaa9GG13111323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111323barEv,_ZThn20_N3aaa9GG13111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311132E[];
Class_Descriptor cd__ZN3aaa9GG1311132E = {  "_ZN3aaa9GG1311132E", // class name
  bases__ZN3aaa9GG1311132E, 6,
  &(vtc__ZN3aaa9GG1311132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311133  : ::aaa::EE131 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13111333fooEv
  virtual void  bar(); // _ZN3aaa9GG13111333barEv
  ~GG1311133(); // tgen
  GG1311133(); // tgen
};
//SIG(1 _ZN3aaa9GG1311133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13111333fooEv");}
void  aaa::GG1311133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13111333barEv");}
aaa::GG1311133 ::~GG1311133(){ note_dtor("_ZN3aaa9GG1311133E", this);} // tgen
aaa::GG1311133 ::GG1311133(){ note_ctor("_ZN3aaa9GG1311133E", this);} // tgen
}
static void Test__ZN3aaa9GG1311133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311133E, buf);
    ::aaa::GG1311133 *dp, &lv = *(dp=new (buf) ::aaa::GG1311133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311133E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1311133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1311133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1311133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311133E);
    dp->::aaa::GG1311133::~GG1311133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311133E(Test__ZN3aaa9GG1311133E, "_ZN3aaa9GG1311133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311133C1Ev();
extern void _ZN3aaa9GG1311133D1Ev();
Name_Map name_map__ZN3aaa9GG1311133E[] = {
  NSPAIR(_ZN3aaa9GG1311133C1Ev),
  NSPAIR(_ZN3aaa9GG1311133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1311133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311133E[];
extern void _ZN3aaa9GG13111333fooEv();
extern void _ZN3aaa9GG13111333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13111333fooEv,_ZThn8_N3aaa9GG13111333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13111333barEv,_ZThn8_N3aaa9GG13111333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13111333fooEv,_ZThn20_N3aaa9GG13111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13111333barEv,_ZThn20_N3aaa9GG13111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13111333fooEv,_ZThn28_N3aaa9GG13111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13111333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13111333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111333fooEv,_ZThn8_N3aaa9GG13111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13111333barEv,_ZThn8_N3aaa9GG13111333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111333fooEv,_ZThn20_N3aaa9GG13111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13111333barEv,_ZThn20_N3aaa9GG13111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13111333fooEv,_ZThn28_N3aaa9GG13111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311133E[];
Class_Descriptor cd__ZN3aaa9GG1311133E = {  "_ZN3aaa9GG1311133E", // class name
  bases__ZN3aaa9GG1311133E, 6,
  &(vtc__ZN3aaa9GG1311133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311211  : ::aaa::EE131 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13112113fooEv
  ~GG1311211(); // tgen
  GG1311211(); // tgen
};
//SIG(1 _ZN3aaa9GG1311211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13112113fooEv");}
aaa::GG1311211 ::~GG1311211(){ note_dtor("_ZN3aaa9GG1311211E", this);} // tgen
aaa::GG1311211 ::GG1311211(){ note_ctor("_ZN3aaa9GG1311211E", this);} // tgen
}
static void Test__ZN3aaa9GG1311211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311211E, buf);
    ::aaa::GG1311211 *dp, &lv = *(dp=new (buf) ::aaa::GG1311211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311211E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1311211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1311211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1311211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311211E);
    dp->::aaa::GG1311211::~GG1311211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311211E(Test__ZN3aaa9GG1311211E, "_ZN3aaa9GG1311211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311211C1Ev();
extern void _ZN3aaa9GG1311211D1Ev();
Name_Map name_map__ZN3aaa9GG1311211E[] = {
  NSPAIR(_ZN3aaa9GG1311211C1Ev),
  NSPAIR(_ZN3aaa9GG1311211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1311211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311211E[];
extern void _ZN3aaa9GG13112113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13112113fooEv,_ZThn8_N3aaa9GG13112113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13112113fooEv,_ZThn20_N3aaa9GG13112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13112113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112113fooEv,_ZThn8_N3aaa9GG13112113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112113fooEv,_ZThn20_N3aaa9GG13112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311211E[];
Class_Descriptor cd__ZN3aaa9GG1311211E = {  "_ZN3aaa9GG1311211E", // class name
  bases__ZN3aaa9GG1311211E, 6,
  &(vtc__ZN3aaa9GG1311211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311212  : ::aaa::EE131 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13112123barEv
  ~GG1311212(); // tgen
  GG1311212(); // tgen
};
//SIG(1 _ZN3aaa9GG1311212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13112123barEv");}
aaa::GG1311212 ::~GG1311212(){ note_dtor("_ZN3aaa9GG1311212E", this);} // tgen
aaa::GG1311212 ::GG1311212(){ note_ctor("_ZN3aaa9GG1311212E", this);} // tgen
}
static void Test__ZN3aaa9GG1311212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311212E, buf);
    ::aaa::GG1311212 *dp, &lv = *(dp=new (buf) ::aaa::GG1311212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311212E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1311212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1311212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1311212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311212E);
    dp->::aaa::GG1311212::~GG1311212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311212E(Test__ZN3aaa9GG1311212E, "_ZN3aaa9GG1311212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311212C1Ev();
extern void _ZN3aaa9GG1311212D1Ev();
Name_Map name_map__ZN3aaa9GG1311212E[] = {
  NSPAIR(_ZN3aaa9GG1311212C1Ev),
  NSPAIR(_ZN3aaa9GG1311212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1311212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311212E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13112123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13112123barEv,_ZThn8_N3aaa9GG13112123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13112123barEv,_ZThn28_N3aaa9GG13112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13112123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112123barEv,_ZThn8_N3aaa9GG13112123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13112123barEv,_ZThn28_N3aaa9GG13112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311212E[];
Class_Descriptor cd__ZN3aaa9GG1311212E = {  "_ZN3aaa9GG1311212E", // class name
  bases__ZN3aaa9GG1311212E, 6,
  &(vtc__ZN3aaa9GG1311212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311213  : ::aaa::EE131 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13112133fooEv
  virtual void  bar(); // _ZN3aaa9GG13112133barEv
  ~GG1311213(); // tgen
  GG1311213(); // tgen
};
//SIG(1 _ZN3aaa9GG1311213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13112133fooEv");}
void  aaa::GG1311213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13112133barEv");}
aaa::GG1311213 ::~GG1311213(){ note_dtor("_ZN3aaa9GG1311213E", this);} // tgen
aaa::GG1311213 ::GG1311213(){ note_ctor("_ZN3aaa9GG1311213E", this);} // tgen
}
static void Test__ZN3aaa9GG1311213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311213E, buf);
    ::aaa::GG1311213 *dp, &lv = *(dp=new (buf) ::aaa::GG1311213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311213E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1311213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1311213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1311213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311213E);
    dp->::aaa::GG1311213::~GG1311213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311213E(Test__ZN3aaa9GG1311213E, "_ZN3aaa9GG1311213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311213C1Ev();
extern void _ZN3aaa9GG1311213D1Ev();
Name_Map name_map__ZN3aaa9GG1311213E[] = {
  NSPAIR(_ZN3aaa9GG1311213C1Ev),
  NSPAIR(_ZN3aaa9GG1311213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1311213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311213E[];
extern void _ZN3aaa9GG13112133fooEv();
extern void _ZN3aaa9GG13112133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13112133fooEv,_ZThn8_N3aaa9GG13112133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13112133barEv,_ZThn8_N3aaa9GG13112133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13112133fooEv,_ZThn20_N3aaa9GG13112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13112133barEv,_ZThn28_N3aaa9GG13112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13112133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13112133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112133fooEv,_ZThn8_N3aaa9GG13112133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112133barEv,_ZThn8_N3aaa9GG13112133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112133fooEv,_ZThn20_N3aaa9GG13112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13112133barEv,_ZThn28_N3aaa9GG13112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311213E[];
Class_Descriptor cd__ZN3aaa9GG1311213E = {  "_ZN3aaa9GG1311213E", // class name
  bases__ZN3aaa9GG1311213E, 6,
  &(vtc__ZN3aaa9GG1311213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311221  : ::aaa::EE131 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13112213fooEv
  ~GG1311221(); // tgen
  GG1311221(); // tgen
};
//SIG(1 _ZN3aaa9GG1311221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13112213fooEv");}
aaa::GG1311221 ::~GG1311221(){ note_dtor("_ZN3aaa9GG1311221E", this);} // tgen
aaa::GG1311221 ::GG1311221(){ note_ctor("_ZN3aaa9GG1311221E", this);} // tgen
}
static void Test__ZN3aaa9GG1311221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311221E, buf);
    ::aaa::GG1311221 *dp, &lv = *(dp=new (buf) ::aaa::GG1311221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311221E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1311221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1311221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1311221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311221E);
    dp->::aaa::GG1311221::~GG1311221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311221E(Test__ZN3aaa9GG1311221E, "_ZN3aaa9GG1311221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311221C1Ev();
extern void _ZN3aaa9GG1311221D1Ev();
Name_Map name_map__ZN3aaa9GG1311221E[] = {
  NSPAIR(_ZN3aaa9GG1311221C1Ev),
  NSPAIR(_ZN3aaa9GG1311221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1311221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311221E[];
extern void _ZN3aaa9GG13112213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13112213fooEv,_ZThn8_N3aaa9GG13112213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13112213fooEv,_ZThn20_N3aaa9GG13112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13112213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112213fooEv,_ZThn8_N3aaa9GG13112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112213fooEv,_ZThn20_N3aaa9GG13112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311221E[];
Class_Descriptor cd__ZN3aaa9GG1311221E = {  "_ZN3aaa9GG1311221E", // class name
  bases__ZN3aaa9GG1311221E, 6,
  &(vtc__ZN3aaa9GG1311221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311222  : ::aaa::EE131 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13112223barEv
  ~GG1311222(); // tgen
  GG1311222(); // tgen
};
//SIG(1 _ZN3aaa9GG1311222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13112223barEv");}
aaa::GG1311222 ::~GG1311222(){ note_dtor("_ZN3aaa9GG1311222E", this);} // tgen
aaa::GG1311222 ::GG1311222(){ note_ctor("_ZN3aaa9GG1311222E", this);} // tgen
}
static void Test__ZN3aaa9GG1311222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311222E, buf);
    ::aaa::GG1311222 *dp, &lv = *(dp=new (buf) ::aaa::GG1311222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311222E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1311222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1311222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1311222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311222E);
    dp->::aaa::GG1311222::~GG1311222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311222E(Test__ZN3aaa9GG1311222E, "_ZN3aaa9GG1311222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311222C1Ev();
extern void _ZN3aaa9GG1311222D1Ev();
Name_Map name_map__ZN3aaa9GG1311222E[] = {
  NSPAIR(_ZN3aaa9GG1311222C1Ev),
  NSPAIR(_ZN3aaa9GG1311222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1311222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311222E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13112223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13112223barEv,_ZThn8_N3aaa9GG13112223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13112223barEv,_ZThn20_N3aaa9GG13112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13112223barEv,_ZThn28_N3aaa9GG13112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13112223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112223barEv,_ZThn8_N3aaa9GG13112223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112223barEv,_ZThn20_N3aaa9GG13112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13112223barEv,_ZThn28_N3aaa9GG13112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311222E[];
Class_Descriptor cd__ZN3aaa9GG1311222E = {  "_ZN3aaa9GG1311222E", // class name
  bases__ZN3aaa9GG1311222E, 6,
  &(vtc__ZN3aaa9GG1311222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311223  : ::aaa::EE131 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13112233fooEv
  virtual void  bar(); // _ZN3aaa9GG13112233barEv
  ~GG1311223(); // tgen
  GG1311223(); // tgen
};
//SIG(1 _ZN3aaa9GG1311223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13112233fooEv");}
void  aaa::GG1311223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13112233barEv");}
aaa::GG1311223 ::~GG1311223(){ note_dtor("_ZN3aaa9GG1311223E", this);} // tgen
aaa::GG1311223 ::GG1311223(){ note_ctor("_ZN3aaa9GG1311223E", this);} // tgen
}
static void Test__ZN3aaa9GG1311223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311223E, buf);
    ::aaa::GG1311223 *dp, &lv = *(dp=new (buf) ::aaa::GG1311223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311223E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1311223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1311223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1311223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311223E);
    dp->::aaa::GG1311223::~GG1311223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311223E(Test__ZN3aaa9GG1311223E, "_ZN3aaa9GG1311223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311223C1Ev();
extern void _ZN3aaa9GG1311223D1Ev();
Name_Map name_map__ZN3aaa9GG1311223E[] = {
  NSPAIR(_ZN3aaa9GG1311223C1Ev),
  NSPAIR(_ZN3aaa9GG1311223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1311223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311223E[];
extern void _ZN3aaa9GG13112233fooEv();
extern void _ZN3aaa9GG13112233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13112233fooEv,_ZThn8_N3aaa9GG13112233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13112233barEv,_ZThn8_N3aaa9GG13112233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13112233fooEv,_ZThn20_N3aaa9GG13112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13112233barEv,_ZThn20_N3aaa9GG13112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13112233barEv,_ZThn28_N3aaa9GG13112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13112233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13112233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112233fooEv,_ZThn8_N3aaa9GG13112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112233barEv,_ZThn8_N3aaa9GG13112233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112233fooEv,_ZThn20_N3aaa9GG13112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112233barEv,_ZThn20_N3aaa9GG13112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13112233barEv,_ZThn28_N3aaa9GG13112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311223E[];
Class_Descriptor cd__ZN3aaa9GG1311223E = {  "_ZN3aaa9GG1311223E", // class name
  bases__ZN3aaa9GG1311223E, 6,
  &(vtc__ZN3aaa9GG1311223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311231  : ::aaa::EE131 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13112313fooEv
  ~GG1311231(); // tgen
  GG1311231(); // tgen
};
//SIG(1 _ZN3aaa9GG1311231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13112313fooEv");}
aaa::GG1311231 ::~GG1311231(){ note_dtor("_ZN3aaa9GG1311231E", this);} // tgen
aaa::GG1311231 ::GG1311231(){ note_ctor("_ZN3aaa9GG1311231E", this);} // tgen
}
static void Test__ZN3aaa9GG1311231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311231E, buf);
    ::aaa::GG1311231 *dp, &lv = *(dp=new (buf) ::aaa::GG1311231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311231E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1311231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1311231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1311231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311231E);
    dp->::aaa::GG1311231::~GG1311231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311231E(Test__ZN3aaa9GG1311231E, "_ZN3aaa9GG1311231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311231C1Ev();
extern void _ZN3aaa9GG1311231D1Ev();
Name_Map name_map__ZN3aaa9GG1311231E[] = {
  NSPAIR(_ZN3aaa9GG1311231C1Ev),
  NSPAIR(_ZN3aaa9GG1311231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1311231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311231E[];
extern void _ZN3aaa9GG13112313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13112313fooEv,_ZThn8_N3aaa9GG13112313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13112313fooEv,_ZThn20_N3aaa9GG13112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13112313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112313fooEv,_ZThn8_N3aaa9GG13112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112313fooEv,_ZThn20_N3aaa9GG13112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311231E[];
Class_Descriptor cd__ZN3aaa9GG1311231E = {  "_ZN3aaa9GG1311231E", // class name
  bases__ZN3aaa9GG1311231E, 6,
  &(vtc__ZN3aaa9GG1311231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311232  : ::aaa::EE131 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13112323barEv
  ~GG1311232(); // tgen
  GG1311232(); // tgen
};
//SIG(1 _ZN3aaa9GG1311232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13112323barEv");}
aaa::GG1311232 ::~GG1311232(){ note_dtor("_ZN3aaa9GG1311232E", this);} // tgen
aaa::GG1311232 ::GG1311232(){ note_ctor("_ZN3aaa9GG1311232E", this);} // tgen
}
static void Test__ZN3aaa9GG1311232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311232E, buf);
    ::aaa::GG1311232 *dp, &lv = *(dp=new (buf) ::aaa::GG1311232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311232E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1311232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1311232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1311232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311232E);
    dp->::aaa::GG1311232::~GG1311232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311232E(Test__ZN3aaa9GG1311232E, "_ZN3aaa9GG1311232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311232C1Ev();
extern void _ZN3aaa9GG1311232D1Ev();
Name_Map name_map__ZN3aaa9GG1311232E[] = {
  NSPAIR(_ZN3aaa9GG1311232C1Ev),
  NSPAIR(_ZN3aaa9GG1311232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1311232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311232E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13112323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13112323barEv,_ZThn8_N3aaa9GG13112323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13112323barEv,_ZThn20_N3aaa9GG13112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13112323barEv,_ZThn28_N3aaa9GG13112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13112323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112323barEv,_ZThn8_N3aaa9GG13112323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112323barEv,_ZThn20_N3aaa9GG13112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13112323barEv,_ZThn28_N3aaa9GG13112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311232E[];
Class_Descriptor cd__ZN3aaa9GG1311232E = {  "_ZN3aaa9GG1311232E", // class name
  bases__ZN3aaa9GG1311232E, 6,
  &(vtc__ZN3aaa9GG1311232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311233  : ::aaa::EE131 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13112333fooEv
  virtual void  bar(); // _ZN3aaa9GG13112333barEv
  ~GG1311233(); // tgen
  GG1311233(); // tgen
};
//SIG(1 _ZN3aaa9GG1311233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13112333fooEv");}
void  aaa::GG1311233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13112333barEv");}
aaa::GG1311233 ::~GG1311233(){ note_dtor("_ZN3aaa9GG1311233E", this);} // tgen
aaa::GG1311233 ::GG1311233(){ note_ctor("_ZN3aaa9GG1311233E", this);} // tgen
}
static void Test__ZN3aaa9GG1311233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311233E, buf);
    ::aaa::GG1311233 *dp, &lv = *(dp=new (buf) ::aaa::GG1311233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311233E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1311233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1311233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1311233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311233E);
    dp->::aaa::GG1311233::~GG1311233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311233E(Test__ZN3aaa9GG1311233E, "_ZN3aaa9GG1311233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311233C1Ev();
extern void _ZN3aaa9GG1311233D1Ev();
Name_Map name_map__ZN3aaa9GG1311233E[] = {
  NSPAIR(_ZN3aaa9GG1311233C1Ev),
  NSPAIR(_ZN3aaa9GG1311233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1311233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311233E[];
extern void _ZN3aaa9GG13112333fooEv();
extern void _ZN3aaa9GG13112333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13112333fooEv,_ZThn8_N3aaa9GG13112333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13112333barEv,_ZThn8_N3aaa9GG13112333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13112333fooEv,_ZThn20_N3aaa9GG13112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13112333barEv,_ZThn20_N3aaa9GG13112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13112333barEv,_ZThn28_N3aaa9GG13112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13112333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13112333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112333fooEv,_ZThn8_N3aaa9GG13112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13112333barEv,_ZThn8_N3aaa9GG13112333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112333fooEv,_ZThn20_N3aaa9GG13112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13112333barEv,_ZThn20_N3aaa9GG13112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13112333barEv,_ZThn28_N3aaa9GG13112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311233E[];
Class_Descriptor cd__ZN3aaa9GG1311233E = {  "_ZN3aaa9GG1311233E", // class name
  bases__ZN3aaa9GG1311233E, 6,
  &(vtc__ZN3aaa9GG1311233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311311  : ::aaa::EE131 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13113113fooEv
  ~GG1311311(); // tgen
  GG1311311(); // tgen
};
//SIG(1 _ZN3aaa9GG1311311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13113113fooEv");}
aaa::GG1311311 ::~GG1311311(){ note_dtor("_ZN3aaa9GG1311311E", this);} // tgen
aaa::GG1311311 ::GG1311311(){ note_ctor("_ZN3aaa9GG1311311E", this);} // tgen
}
static void Test__ZN3aaa9GG1311311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311311E, buf);
    ::aaa::GG1311311 *dp, &lv = *(dp=new (buf) ::aaa::GG1311311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311311E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1311311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1311311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1311311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311311E);
    dp->::aaa::GG1311311::~GG1311311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311311E(Test__ZN3aaa9GG1311311E, "_ZN3aaa9GG1311311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311311C1Ev();
extern void _ZN3aaa9GG1311311D1Ev();
Name_Map name_map__ZN3aaa9GG1311311E[] = {
  NSPAIR(_ZN3aaa9GG1311311C1Ev),
  NSPAIR(_ZN3aaa9GG1311311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1311311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311311E[];
extern void _ZN3aaa9GG13113113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13113113fooEv,_ZThn8_N3aaa9GG13113113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13113113fooEv,_ZThn20_N3aaa9GG13113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113113fooEv,_ZThn28_N3aaa9GG13113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13113113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113113fooEv,_ZThn8_N3aaa9GG13113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113113fooEv,_ZThn20_N3aaa9GG13113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113113fooEv,_ZThn28_N3aaa9GG13113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311311E[];
Class_Descriptor cd__ZN3aaa9GG1311311E = {  "_ZN3aaa9GG1311311E", // class name
  bases__ZN3aaa9GG1311311E, 6,
  &(vtc__ZN3aaa9GG1311311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311312  : ::aaa::EE131 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13113123barEv
  ~GG1311312(); // tgen
  GG1311312(); // tgen
};
//SIG(1 _ZN3aaa9GG1311312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13113123barEv");}
aaa::GG1311312 ::~GG1311312(){ note_dtor("_ZN3aaa9GG1311312E", this);} // tgen
aaa::GG1311312 ::GG1311312(){ note_ctor("_ZN3aaa9GG1311312E", this);} // tgen
}
static void Test__ZN3aaa9GG1311312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311312E, buf);
    ::aaa::GG1311312 *dp, &lv = *(dp=new (buf) ::aaa::GG1311312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311312E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1311312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1311312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1311312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311312E);
    dp->::aaa::GG1311312::~GG1311312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311312E(Test__ZN3aaa9GG1311312E, "_ZN3aaa9GG1311312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311312C1Ev();
extern void _ZN3aaa9GG1311312D1Ev();
Name_Map name_map__ZN3aaa9GG1311312E[] = {
  NSPAIR(_ZN3aaa9GG1311312C1Ev),
  NSPAIR(_ZN3aaa9GG1311312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1311312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311312E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13113123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13113123barEv,_ZThn8_N3aaa9GG13113123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113123barEv,_ZThn28_N3aaa9GG13113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13113123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113123barEv,_ZThn8_N3aaa9GG13113123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113123barEv,_ZThn28_N3aaa9GG13113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311312E[];
Class_Descriptor cd__ZN3aaa9GG1311312E = {  "_ZN3aaa9GG1311312E", // class name
  bases__ZN3aaa9GG1311312E, 6,
  &(vtc__ZN3aaa9GG1311312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311313  : ::aaa::EE131 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13113133fooEv
  virtual void  bar(); // _ZN3aaa9GG13113133barEv
  ~GG1311313(); // tgen
  GG1311313(); // tgen
};
//SIG(1 _ZN3aaa9GG1311313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13113133fooEv");}
void  aaa::GG1311313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13113133barEv");}
aaa::GG1311313 ::~GG1311313(){ note_dtor("_ZN3aaa9GG1311313E", this);} // tgen
aaa::GG1311313 ::GG1311313(){ note_ctor("_ZN3aaa9GG1311313E", this);} // tgen
}
static void Test__ZN3aaa9GG1311313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311313E, buf);
    ::aaa::GG1311313 *dp, &lv = *(dp=new (buf) ::aaa::GG1311313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311313E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1311313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1311313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1311313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311313E);
    dp->::aaa::GG1311313::~GG1311313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311313E(Test__ZN3aaa9GG1311313E, "_ZN3aaa9GG1311313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311313C1Ev();
extern void _ZN3aaa9GG1311313D1Ev();
Name_Map name_map__ZN3aaa9GG1311313E[] = {
  NSPAIR(_ZN3aaa9GG1311313C1Ev),
  NSPAIR(_ZN3aaa9GG1311313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1311313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311313E[];
extern void _ZN3aaa9GG13113133fooEv();
extern void _ZN3aaa9GG13113133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13113133fooEv,_ZThn8_N3aaa9GG13113133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13113133barEv,_ZThn8_N3aaa9GG13113133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13113133fooEv,_ZThn20_N3aaa9GG13113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113133fooEv,_ZThn28_N3aaa9GG13113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113133barEv,_ZThn28_N3aaa9GG13113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13113133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13113133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113133fooEv,_ZThn8_N3aaa9GG13113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113133barEv,_ZThn8_N3aaa9GG13113133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113133fooEv,_ZThn20_N3aaa9GG13113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113133fooEv,_ZThn28_N3aaa9GG13113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113133barEv,_ZThn28_N3aaa9GG13113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311313E[];
Class_Descriptor cd__ZN3aaa9GG1311313E = {  "_ZN3aaa9GG1311313E", // class name
  bases__ZN3aaa9GG1311313E, 6,
  &(vtc__ZN3aaa9GG1311313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311321  : ::aaa::EE131 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13113213fooEv
  ~GG1311321(); // tgen
  GG1311321(); // tgen
};
//SIG(1 _ZN3aaa9GG1311321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13113213fooEv");}
aaa::GG1311321 ::~GG1311321(){ note_dtor("_ZN3aaa9GG1311321E", this);} // tgen
aaa::GG1311321 ::GG1311321(){ note_ctor("_ZN3aaa9GG1311321E", this);} // tgen
}
static void Test__ZN3aaa9GG1311321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311321E, buf);
    ::aaa::GG1311321 *dp, &lv = *(dp=new (buf) ::aaa::GG1311321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311321E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1311321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1311321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1311321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311321E);
    dp->::aaa::GG1311321::~GG1311321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311321E(Test__ZN3aaa9GG1311321E, "_ZN3aaa9GG1311321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311321C1Ev();
extern void _ZN3aaa9GG1311321D1Ev();
Name_Map name_map__ZN3aaa9GG1311321E[] = {
  NSPAIR(_ZN3aaa9GG1311321C1Ev),
  NSPAIR(_ZN3aaa9GG1311321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1311321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311321E[];
extern void _ZN3aaa9GG13113213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13113213fooEv,_ZThn8_N3aaa9GG13113213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13113213fooEv,_ZThn20_N3aaa9GG13113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13113213fooEv,_ZThn28_N3aaa9GG13113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13113213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113213fooEv,_ZThn8_N3aaa9GG13113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113213fooEv,_ZThn20_N3aaa9GG13113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113213fooEv,_ZThn28_N3aaa9GG13113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311321E[];
Class_Descriptor cd__ZN3aaa9GG1311321E = {  "_ZN3aaa9GG1311321E", // class name
  bases__ZN3aaa9GG1311321E, 6,
  &(vtc__ZN3aaa9GG1311321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311322  : ::aaa::EE131 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13113223barEv
  ~GG1311322(); // tgen
  GG1311322(); // tgen
};
//SIG(1 _ZN3aaa9GG1311322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13113223barEv");}
aaa::GG1311322 ::~GG1311322(){ note_dtor("_ZN3aaa9GG1311322E", this);} // tgen
aaa::GG1311322 ::GG1311322(){ note_ctor("_ZN3aaa9GG1311322E", this);} // tgen
}
static void Test__ZN3aaa9GG1311322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311322E, buf);
    ::aaa::GG1311322 *dp, &lv = *(dp=new (buf) ::aaa::GG1311322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311322E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1311322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1311322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1311322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311322E);
    dp->::aaa::GG1311322::~GG1311322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311322E(Test__ZN3aaa9GG1311322E, "_ZN3aaa9GG1311322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311322C1Ev();
extern void _ZN3aaa9GG1311322D1Ev();
Name_Map name_map__ZN3aaa9GG1311322E[] = {
  NSPAIR(_ZN3aaa9GG1311322C1Ev),
  NSPAIR(_ZN3aaa9GG1311322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1311322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311322E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13113223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13113223barEv,_ZThn8_N3aaa9GG13113223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13113223barEv,_ZThn20_N3aaa9GG13113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13113223barEv,_ZThn28_N3aaa9GG13113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13113223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113223barEv,_ZThn8_N3aaa9GG13113223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113223barEv,_ZThn20_N3aaa9GG13113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113223barEv,_ZThn28_N3aaa9GG13113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311322E[];
Class_Descriptor cd__ZN3aaa9GG1311322E = {  "_ZN3aaa9GG1311322E", // class name
  bases__ZN3aaa9GG1311322E, 6,
  &(vtc__ZN3aaa9GG1311322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311323  : ::aaa::EE131 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13113233fooEv
  virtual void  bar(); // _ZN3aaa9GG13113233barEv
  ~GG1311323(); // tgen
  GG1311323(); // tgen
};
//SIG(1 _ZN3aaa9GG1311323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13113233fooEv");}
void  aaa::GG1311323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13113233barEv");}
aaa::GG1311323 ::~GG1311323(){ note_dtor("_ZN3aaa9GG1311323E", this);} // tgen
aaa::GG1311323 ::GG1311323(){ note_ctor("_ZN3aaa9GG1311323E", this);} // tgen
}
static void Test__ZN3aaa9GG1311323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311323E, buf);
    ::aaa::GG1311323 *dp, &lv = *(dp=new (buf) ::aaa::GG1311323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311323E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1311323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1311323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1311323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311323E);
    dp->::aaa::GG1311323::~GG1311323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311323E(Test__ZN3aaa9GG1311323E, "_ZN3aaa9GG1311323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311323C1Ev();
extern void _ZN3aaa9GG1311323D1Ev();
Name_Map name_map__ZN3aaa9GG1311323E[] = {
  NSPAIR(_ZN3aaa9GG1311323C1Ev),
  NSPAIR(_ZN3aaa9GG1311323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1311323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311323E[];
extern void _ZN3aaa9GG13113233fooEv();
extern void _ZN3aaa9GG13113233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13113233fooEv,_ZThn8_N3aaa9GG13113233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13113233barEv,_ZThn8_N3aaa9GG13113233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13113233fooEv,_ZThn20_N3aaa9GG13113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13113233barEv,_ZThn20_N3aaa9GG13113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113233fooEv,_ZThn28_N3aaa9GG13113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113233barEv,_ZThn28_N3aaa9GG13113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13113233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13113233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113233fooEv,_ZThn8_N3aaa9GG13113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113233barEv,_ZThn8_N3aaa9GG13113233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113233fooEv,_ZThn20_N3aaa9GG13113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113233barEv,_ZThn20_N3aaa9GG13113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113233fooEv,_ZThn28_N3aaa9GG13113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113233barEv,_ZThn28_N3aaa9GG13113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311323E[];
Class_Descriptor cd__ZN3aaa9GG1311323E = {  "_ZN3aaa9GG1311323E", // class name
  bases__ZN3aaa9GG1311323E, 6,
  &(vtc__ZN3aaa9GG1311323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311331  : ::aaa::EE131 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13113313fooEv
  ~GG1311331(); // tgen
  GG1311331(); // tgen
};
//SIG(1 _ZN3aaa9GG1311331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13113313fooEv");}
aaa::GG1311331 ::~GG1311331(){ note_dtor("_ZN3aaa9GG1311331E", this);} // tgen
aaa::GG1311331 ::GG1311331(){ note_ctor("_ZN3aaa9GG1311331E", this);} // tgen
}
static void Test__ZN3aaa9GG1311331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311331E, buf);
    ::aaa::GG1311331 *dp, &lv = *(dp=new (buf) ::aaa::GG1311331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311331E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1311331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1311331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1311331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311331E);
    dp->::aaa::GG1311331::~GG1311331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311331E(Test__ZN3aaa9GG1311331E, "_ZN3aaa9GG1311331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311331C1Ev();
extern void _ZN3aaa9GG1311331D1Ev();
Name_Map name_map__ZN3aaa9GG1311331E[] = {
  NSPAIR(_ZN3aaa9GG1311331C1Ev),
  NSPAIR(_ZN3aaa9GG1311331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1311331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311331E[];
extern void _ZN3aaa9GG13113313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13113313fooEv,_ZThn8_N3aaa9GG13113313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13113313fooEv,_ZThn20_N3aaa9GG13113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13113313fooEv,_ZThn28_N3aaa9GG13113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13113313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113313fooEv,_ZThn8_N3aaa9GG13113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113313fooEv,_ZThn20_N3aaa9GG13113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113313fooEv,_ZThn28_N3aaa9GG13113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311331E[];
Class_Descriptor cd__ZN3aaa9GG1311331E = {  "_ZN3aaa9GG1311331E", // class name
  bases__ZN3aaa9GG1311331E, 6,
  &(vtc__ZN3aaa9GG1311331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311332  : ::aaa::EE131 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13113323barEv
  ~GG1311332(); // tgen
  GG1311332(); // tgen
};
//SIG(1 _ZN3aaa9GG1311332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1311332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13113323barEv");}
aaa::GG1311332 ::~GG1311332(){ note_dtor("_ZN3aaa9GG1311332E", this);} // tgen
aaa::GG1311332 ::GG1311332(){ note_ctor("_ZN3aaa9GG1311332E", this);} // tgen
}
static void Test__ZN3aaa9GG1311332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311332E, buf);
    ::aaa::GG1311332 *dp, &lv = *(dp=new (buf) ::aaa::GG1311332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311332E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1311332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1311332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1311332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311332E);
    dp->::aaa::GG1311332::~GG1311332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311332E(Test__ZN3aaa9GG1311332E, "_ZN3aaa9GG1311332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311332C1Ev();
extern void _ZN3aaa9GG1311332D1Ev();
Name_Map name_map__ZN3aaa9GG1311332E[] = {
  NSPAIR(_ZN3aaa9GG1311332C1Ev),
  NSPAIR(_ZN3aaa9GG1311332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1311332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311332E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13113323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13113323barEv,_ZThn8_N3aaa9GG13113323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13113323barEv,_ZThn20_N3aaa9GG13113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113323barEv,_ZThn28_N3aaa9GG13113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13113323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113323barEv,_ZThn8_N3aaa9GG13113323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113323barEv,_ZThn20_N3aaa9GG13113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113323barEv,_ZThn28_N3aaa9GG13113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311332E[];
Class_Descriptor cd__ZN3aaa9GG1311332E = {  "_ZN3aaa9GG1311332E", // class name
  bases__ZN3aaa9GG1311332E, 6,
  &(vtc__ZN3aaa9GG1311332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1311333  : ::aaa::EE131 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13113333fooEv
  virtual void  bar(); // _ZN3aaa9GG13113333barEv
  ~GG1311333(); // tgen
  GG1311333(); // tgen
};
//SIG(1 _ZN3aaa9GG1311333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1311333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13113333fooEv");}
void  aaa::GG1311333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13113333barEv");}
aaa::GG1311333 ::~GG1311333(){ note_dtor("_ZN3aaa9GG1311333E", this);} // tgen
aaa::GG1311333 ::GG1311333(){ note_ctor("_ZN3aaa9GG1311333E", this);} // tgen
}
static void Test__ZN3aaa9GG1311333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1311333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1311333E, buf);
    ::aaa::GG1311333 *dp, &lv = *(dp=new (buf) ::aaa::GG1311333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1311333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1311333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1311333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1311333E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1311333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1311333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1311333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1311333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1311333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1311333E);
    dp->::aaa::GG1311333::~GG1311333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1311333E(Test__ZN3aaa9GG1311333E, "_ZN3aaa9GG1311333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1311333C1Ev();
extern void _ZN3aaa9GG1311333D1Ev();
Name_Map name_map__ZN3aaa9GG1311333E[] = {
  NSPAIR(_ZN3aaa9GG1311333C1Ev),
  NSPAIR(_ZN3aaa9GG1311333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1311333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1311333E[];
extern void _ZN3aaa9GG13113333fooEv();
extern void _ZN3aaa9GG13113333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13113333fooEv,_ZThn8_N3aaa9GG13113333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13113333barEv,_ZThn8_N3aaa9GG13113333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13113333fooEv,_ZThn20_N3aaa9GG13113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13113333barEv,_ZThn20_N3aaa9GG13113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113333fooEv,_ZThn28_N3aaa9GG13113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13113333barEv,_ZThn28_N3aaa9GG13113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1311333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13113333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13113333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113333fooEv,_ZThn8_N3aaa9GG13113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13113333barEv,_ZThn8_N3aaa9GG13113333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113333fooEv,_ZThn20_N3aaa9GG13113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13113333barEv,_ZThn20_N3aaa9GG13113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113333fooEv,_ZThn28_N3aaa9GG13113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13113333barEv,_ZThn28_N3aaa9GG13113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1311333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1311333E[];
Class_Descriptor cd__ZN3aaa9GG1311333E = {  "_ZN3aaa9GG1311333E", // class name
  bases__ZN3aaa9GG1311333E, 6,
  &(vtc__ZN3aaa9GG1311333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1311333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1311333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312111  : ::aaa::EE131 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13121113fooEv
  ~GG1312111(); // tgen
  GG1312111(); // tgen
};
//SIG(1 _ZN3aaa9GG1312111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13121113fooEv");}
aaa::GG1312111 ::~GG1312111(){ note_dtor("_ZN3aaa9GG1312111E", this);} // tgen
aaa::GG1312111 ::GG1312111(){ note_ctor("_ZN3aaa9GG1312111E", this);} // tgen
}
static void Test__ZN3aaa9GG1312111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312111E, buf);
    ::aaa::GG1312111 *dp, &lv = *(dp=new (buf) ::aaa::GG1312111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312111E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1312111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1312111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1312111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312111E);
    dp->::aaa::GG1312111::~GG1312111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312111E(Test__ZN3aaa9GG1312111E, "_ZN3aaa9GG1312111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312111C1Ev();
extern void _ZN3aaa9GG1312111D1Ev();
Name_Map name_map__ZN3aaa9GG1312111E[] = {
  NSPAIR(_ZN3aaa9GG1312111C1Ev),
  NSPAIR(_ZN3aaa9GG1312111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1312111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312111E[];
extern void _ZN3aaa9GG13121113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13121113fooEv,_ZThn8_N3aaa9GG13121113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13121113fooEv,_ZThn20_N3aaa9GG13121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13121113fooEv,_ZThn28_N3aaa9GG13121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13121113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121113fooEv,_ZThn8_N3aaa9GG13121113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121113fooEv,_ZThn20_N3aaa9GG13121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13121113fooEv,_ZThn28_N3aaa9GG13121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312111E[];
Class_Descriptor cd__ZN3aaa9GG1312111E = {  "_ZN3aaa9GG1312111E", // class name
  bases__ZN3aaa9GG1312111E, 6,
  &(vtc__ZN3aaa9GG1312111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312112  : ::aaa::EE131 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13121123barEv
  ~GG1312112(); // tgen
  GG1312112(); // tgen
};
//SIG(1 _ZN3aaa9GG1312112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13121123barEv");}
aaa::GG1312112 ::~GG1312112(){ note_dtor("_ZN3aaa9GG1312112E", this);} // tgen
aaa::GG1312112 ::GG1312112(){ note_ctor("_ZN3aaa9GG1312112E", this);} // tgen
}
static void Test__ZN3aaa9GG1312112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312112E, buf);
    ::aaa::GG1312112 *dp, &lv = *(dp=new (buf) ::aaa::GG1312112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312112E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1312112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1312112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1312112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312112E);
    dp->::aaa::GG1312112::~GG1312112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312112E(Test__ZN3aaa9GG1312112E, "_ZN3aaa9GG1312112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312112C1Ev();
extern void _ZN3aaa9GG1312112D1Ev();
Name_Map name_map__ZN3aaa9GG1312112E[] = {
  NSPAIR(_ZN3aaa9GG1312112C1Ev),
  NSPAIR(_ZN3aaa9GG1312112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1312112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312112E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13121123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13121123barEv,_ZThn8_N3aaa9GG13121123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13121123barEv,_ZThn20_N3aaa9GG13121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13121123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121123barEv,_ZThn8_N3aaa9GG13121123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121123barEv,_ZThn20_N3aaa9GG13121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312112E[];
Class_Descriptor cd__ZN3aaa9GG1312112E = {  "_ZN3aaa9GG1312112E", // class name
  bases__ZN3aaa9GG1312112E, 6,
  &(vtc__ZN3aaa9GG1312112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312113  : ::aaa::EE131 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13121133fooEv
  virtual void  bar(); // _ZN3aaa9GG13121133barEv
  ~GG1312113(); // tgen
  GG1312113(); // tgen
};
//SIG(1 _ZN3aaa9GG1312113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13121133fooEv");}
void  aaa::GG1312113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13121133barEv");}
aaa::GG1312113 ::~GG1312113(){ note_dtor("_ZN3aaa9GG1312113E", this);} // tgen
aaa::GG1312113 ::GG1312113(){ note_ctor("_ZN3aaa9GG1312113E", this);} // tgen
}
static void Test__ZN3aaa9GG1312113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312113E, buf);
    ::aaa::GG1312113 *dp, &lv = *(dp=new (buf) ::aaa::GG1312113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312113E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1312113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1312113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1312113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312113E);
    dp->::aaa::GG1312113::~GG1312113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312113E(Test__ZN3aaa9GG1312113E, "_ZN3aaa9GG1312113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312113C1Ev();
extern void _ZN3aaa9GG1312113D1Ev();
Name_Map name_map__ZN3aaa9GG1312113E[] = {
  NSPAIR(_ZN3aaa9GG1312113C1Ev),
  NSPAIR(_ZN3aaa9GG1312113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1312113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312113E[];
extern void _ZN3aaa9GG13121133fooEv();
extern void _ZN3aaa9GG13121133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13121133fooEv,_ZThn8_N3aaa9GG13121133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13121133barEv,_ZThn8_N3aaa9GG13121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13121133barEv,_ZThn20_N3aaa9GG13121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13121133fooEv,_ZThn20_N3aaa9GG13121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13121133fooEv,_ZThn28_N3aaa9GG13121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13121133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13121133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121133fooEv,_ZThn8_N3aaa9GG13121133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121133barEv,_ZThn8_N3aaa9GG13121133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121133barEv,_ZThn20_N3aaa9GG13121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121133fooEv,_ZThn20_N3aaa9GG13121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13121133fooEv,_ZThn28_N3aaa9GG13121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312113E[];
Class_Descriptor cd__ZN3aaa9GG1312113E = {  "_ZN3aaa9GG1312113E", // class name
  bases__ZN3aaa9GG1312113E, 6,
  &(vtc__ZN3aaa9GG1312113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312121  : ::aaa::EE131 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13121213fooEv
  ~GG1312121(); // tgen
  GG1312121(); // tgen
};
//SIG(1 _ZN3aaa9GG1312121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13121213fooEv");}
aaa::GG1312121 ::~GG1312121(){ note_dtor("_ZN3aaa9GG1312121E", this);} // tgen
aaa::GG1312121 ::GG1312121(){ note_ctor("_ZN3aaa9GG1312121E", this);} // tgen
}
static void Test__ZN3aaa9GG1312121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312121E, buf);
    ::aaa::GG1312121 *dp, &lv = *(dp=new (buf) ::aaa::GG1312121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312121E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1312121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1312121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1312121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312121E);
    dp->::aaa::GG1312121::~GG1312121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312121E(Test__ZN3aaa9GG1312121E, "_ZN3aaa9GG1312121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312121C1Ev();
extern void _ZN3aaa9GG1312121D1Ev();
Name_Map name_map__ZN3aaa9GG1312121E[] = {
  NSPAIR(_ZN3aaa9GG1312121C1Ev),
  NSPAIR(_ZN3aaa9GG1312121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1312121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312121E[];
extern void _ZN3aaa9GG13121213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13121213fooEv,_ZThn8_N3aaa9GG13121213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13121213fooEv,_ZThn28_N3aaa9GG13121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13121213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121213fooEv,_ZThn8_N3aaa9GG13121213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13121213fooEv,_ZThn28_N3aaa9GG13121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312121E[];
Class_Descriptor cd__ZN3aaa9GG1312121E = {  "_ZN3aaa9GG1312121E", // class name
  bases__ZN3aaa9GG1312121E, 6,
  &(vtc__ZN3aaa9GG1312121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312122  : ::aaa::EE131 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13121223barEv
  ~GG1312122(); // tgen
  GG1312122(); // tgen
};
//SIG(1 _ZN3aaa9GG1312122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13121223barEv");}
aaa::GG1312122 ::~GG1312122(){ note_dtor("_ZN3aaa9GG1312122E", this);} // tgen
aaa::GG1312122 ::GG1312122(){ note_ctor("_ZN3aaa9GG1312122E", this);} // tgen
}
static void Test__ZN3aaa9GG1312122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312122E, buf);
    ::aaa::GG1312122 *dp, &lv = *(dp=new (buf) ::aaa::GG1312122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312122E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1312122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1312122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1312122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312122E);
    dp->::aaa::GG1312122::~GG1312122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312122E(Test__ZN3aaa9GG1312122E, "_ZN3aaa9GG1312122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312122C1Ev();
extern void _ZN3aaa9GG1312122D1Ev();
Name_Map name_map__ZN3aaa9GG1312122E[] = {
  NSPAIR(_ZN3aaa9GG1312122C1Ev),
  NSPAIR(_ZN3aaa9GG1312122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1312122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312122E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13121223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13121223barEv,_ZThn8_N3aaa9GG13121223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13121223barEv,_ZThn20_N3aaa9GG13121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13121223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121223barEv,_ZThn8_N3aaa9GG13121223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121223barEv,_ZThn20_N3aaa9GG13121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312122E[];
Class_Descriptor cd__ZN3aaa9GG1312122E = {  "_ZN3aaa9GG1312122E", // class name
  bases__ZN3aaa9GG1312122E, 6,
  &(vtc__ZN3aaa9GG1312122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312123  : ::aaa::EE131 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13121233fooEv
  virtual void  bar(); // _ZN3aaa9GG13121233barEv
  ~GG1312123(); // tgen
  GG1312123(); // tgen
};
//SIG(1 _ZN3aaa9GG1312123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13121233fooEv");}
void  aaa::GG1312123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13121233barEv");}
aaa::GG1312123 ::~GG1312123(){ note_dtor("_ZN3aaa9GG1312123E", this);} // tgen
aaa::GG1312123 ::GG1312123(){ note_ctor("_ZN3aaa9GG1312123E", this);} // tgen
}
static void Test__ZN3aaa9GG1312123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312123E, buf);
    ::aaa::GG1312123 *dp, &lv = *(dp=new (buf) ::aaa::GG1312123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312123E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1312123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1312123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1312123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312123E);
    dp->::aaa::GG1312123::~GG1312123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312123E(Test__ZN3aaa9GG1312123E, "_ZN3aaa9GG1312123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312123C1Ev();
extern void _ZN3aaa9GG1312123D1Ev();
Name_Map name_map__ZN3aaa9GG1312123E[] = {
  NSPAIR(_ZN3aaa9GG1312123C1Ev),
  NSPAIR(_ZN3aaa9GG1312123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1312123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312123E[];
extern void _ZN3aaa9GG13121233fooEv();
extern void _ZN3aaa9GG13121233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13121233fooEv,_ZThn8_N3aaa9GG13121233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13121233barEv,_ZThn8_N3aaa9GG13121233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13121233barEv,_ZThn20_N3aaa9GG13121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13121233fooEv,_ZThn28_N3aaa9GG13121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13121233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13121233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121233fooEv,_ZThn8_N3aaa9GG13121233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121233barEv,_ZThn8_N3aaa9GG13121233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121233barEv,_ZThn20_N3aaa9GG13121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13121233fooEv,_ZThn28_N3aaa9GG13121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312123E[];
Class_Descriptor cd__ZN3aaa9GG1312123E = {  "_ZN3aaa9GG1312123E", // class name
  bases__ZN3aaa9GG1312123E, 6,
  &(vtc__ZN3aaa9GG1312123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312131  : ::aaa::EE131 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13121313fooEv
  ~GG1312131(); // tgen
  GG1312131(); // tgen
};
//SIG(1 _ZN3aaa9GG1312131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13121313fooEv");}
aaa::GG1312131 ::~GG1312131(){ note_dtor("_ZN3aaa9GG1312131E", this);} // tgen
aaa::GG1312131 ::GG1312131(){ note_ctor("_ZN3aaa9GG1312131E", this);} // tgen
}
static void Test__ZN3aaa9GG1312131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312131E, buf);
    ::aaa::GG1312131 *dp, &lv = *(dp=new (buf) ::aaa::GG1312131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312131E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1312131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1312131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1312131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312131E);
    dp->::aaa::GG1312131::~GG1312131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312131E(Test__ZN3aaa9GG1312131E, "_ZN3aaa9GG1312131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312131C1Ev();
extern void _ZN3aaa9GG1312131D1Ev();
Name_Map name_map__ZN3aaa9GG1312131E[] = {
  NSPAIR(_ZN3aaa9GG1312131C1Ev),
  NSPAIR(_ZN3aaa9GG1312131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1312131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312131E[];
extern void _ZN3aaa9GG13121313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13121313fooEv,_ZThn8_N3aaa9GG13121313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13121313fooEv,_ZThn20_N3aaa9GG13121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13121313fooEv,_ZThn28_N3aaa9GG13121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13121313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121313fooEv,_ZThn8_N3aaa9GG13121313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121313fooEv,_ZThn20_N3aaa9GG13121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13121313fooEv,_ZThn28_N3aaa9GG13121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312131E[];
Class_Descriptor cd__ZN3aaa9GG1312131E = {  "_ZN3aaa9GG1312131E", // class name
  bases__ZN3aaa9GG1312131E, 6,
  &(vtc__ZN3aaa9GG1312131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312132  : ::aaa::EE131 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13121323barEv
  ~GG1312132(); // tgen
  GG1312132(); // tgen
};
//SIG(1 _ZN3aaa9GG1312132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13121323barEv");}
aaa::GG1312132 ::~GG1312132(){ note_dtor("_ZN3aaa9GG1312132E", this);} // tgen
aaa::GG1312132 ::GG1312132(){ note_ctor("_ZN3aaa9GG1312132E", this);} // tgen
}
static void Test__ZN3aaa9GG1312132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312132E, buf);
    ::aaa::GG1312132 *dp, &lv = *(dp=new (buf) ::aaa::GG1312132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312132E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1312132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1312132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1312132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312132E);
    dp->::aaa::GG1312132::~GG1312132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312132E(Test__ZN3aaa9GG1312132E, "_ZN3aaa9GG1312132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312132C1Ev();
extern void _ZN3aaa9GG1312132D1Ev();
Name_Map name_map__ZN3aaa9GG1312132E[] = {
  NSPAIR(_ZN3aaa9GG1312132C1Ev),
  NSPAIR(_ZN3aaa9GG1312132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1312132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312132E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13121323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13121323barEv,_ZThn8_N3aaa9GG13121323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13121323barEv,_ZThn20_N3aaa9GG13121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13121323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121323barEv,_ZThn8_N3aaa9GG13121323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121323barEv,_ZThn20_N3aaa9GG13121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312132E[];
Class_Descriptor cd__ZN3aaa9GG1312132E = {  "_ZN3aaa9GG1312132E", // class name
  bases__ZN3aaa9GG1312132E, 6,
  &(vtc__ZN3aaa9GG1312132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312133  : ::aaa::EE131 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13121333fooEv
  virtual void  bar(); // _ZN3aaa9GG13121333barEv
  ~GG1312133(); // tgen
  GG1312133(); // tgen
};
//SIG(1 _ZN3aaa9GG1312133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13121333fooEv");}
void  aaa::GG1312133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13121333barEv");}
aaa::GG1312133 ::~GG1312133(){ note_dtor("_ZN3aaa9GG1312133E", this);} // tgen
aaa::GG1312133 ::GG1312133(){ note_ctor("_ZN3aaa9GG1312133E", this);} // tgen
}
static void Test__ZN3aaa9GG1312133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312133E, buf);
    ::aaa::GG1312133 *dp, &lv = *(dp=new (buf) ::aaa::GG1312133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312133E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1312133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1312133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1312133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312133E);
    dp->::aaa::GG1312133::~GG1312133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312133E(Test__ZN3aaa9GG1312133E, "_ZN3aaa9GG1312133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312133C1Ev();
extern void _ZN3aaa9GG1312133D1Ev();
Name_Map name_map__ZN3aaa9GG1312133E[] = {
  NSPAIR(_ZN3aaa9GG1312133C1Ev),
  NSPAIR(_ZN3aaa9GG1312133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1312133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312133E[];
extern void _ZN3aaa9GG13121333fooEv();
extern void _ZN3aaa9GG13121333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13121333fooEv,_ZThn8_N3aaa9GG13121333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13121333barEv,_ZThn8_N3aaa9GG13121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13121333barEv,_ZThn20_N3aaa9GG13121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13121333fooEv,_ZThn20_N3aaa9GG13121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13121333fooEv,_ZThn28_N3aaa9GG13121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13121333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13121333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121333fooEv,_ZThn8_N3aaa9GG13121333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13121333barEv,_ZThn8_N3aaa9GG13121333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121333barEv,_ZThn20_N3aaa9GG13121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13121333fooEv,_ZThn20_N3aaa9GG13121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13121333fooEv,_ZThn28_N3aaa9GG13121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312133E[];
Class_Descriptor cd__ZN3aaa9GG1312133E = {  "_ZN3aaa9GG1312133E", // class name
  bases__ZN3aaa9GG1312133E, 6,
  &(vtc__ZN3aaa9GG1312133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312211  : ::aaa::EE131 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13122113fooEv
  ~GG1312211(); // tgen
  GG1312211(); // tgen
};
//SIG(1 _ZN3aaa9GG1312211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13122113fooEv");}
aaa::GG1312211 ::~GG1312211(){ note_dtor("_ZN3aaa9GG1312211E", this);} // tgen
aaa::GG1312211 ::GG1312211(){ note_ctor("_ZN3aaa9GG1312211E", this);} // tgen
}
static void Test__ZN3aaa9GG1312211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312211E, buf);
    ::aaa::GG1312211 *dp, &lv = *(dp=new (buf) ::aaa::GG1312211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312211E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1312211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1312211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1312211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312211E);
    dp->::aaa::GG1312211::~GG1312211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312211E(Test__ZN3aaa9GG1312211E, "_ZN3aaa9GG1312211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312211C1Ev();
extern void _ZN3aaa9GG1312211D1Ev();
Name_Map name_map__ZN3aaa9GG1312211E[] = {
  NSPAIR(_ZN3aaa9GG1312211C1Ev),
  NSPAIR(_ZN3aaa9GG1312211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1312211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312211E[];
extern void _ZN3aaa9GG13122113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13122113fooEv,_ZThn8_N3aaa9GG13122113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13122113fooEv,_ZThn20_N3aaa9GG13122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13122113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122113fooEv,_ZThn8_N3aaa9GG13122113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122113fooEv,_ZThn20_N3aaa9GG13122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312211E[];
Class_Descriptor cd__ZN3aaa9GG1312211E = {  "_ZN3aaa9GG1312211E", // class name
  bases__ZN3aaa9GG1312211E, 6,
  &(vtc__ZN3aaa9GG1312211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312212  : ::aaa::EE131 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13122123barEv
  ~GG1312212(); // tgen
  GG1312212(); // tgen
};
//SIG(1 _ZN3aaa9GG1312212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13122123barEv");}
aaa::GG1312212 ::~GG1312212(){ note_dtor("_ZN3aaa9GG1312212E", this);} // tgen
aaa::GG1312212 ::GG1312212(){ note_ctor("_ZN3aaa9GG1312212E", this);} // tgen
}
static void Test__ZN3aaa9GG1312212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312212E, buf);
    ::aaa::GG1312212 *dp, &lv = *(dp=new (buf) ::aaa::GG1312212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312212E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1312212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1312212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1312212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312212E);
    dp->::aaa::GG1312212::~GG1312212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312212E(Test__ZN3aaa9GG1312212E, "_ZN3aaa9GG1312212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312212C1Ev();
extern void _ZN3aaa9GG1312212D1Ev();
Name_Map name_map__ZN3aaa9GG1312212E[] = {
  NSPAIR(_ZN3aaa9GG1312212C1Ev),
  NSPAIR(_ZN3aaa9GG1312212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1312212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312212E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13122123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13122123barEv,_ZThn8_N3aaa9GG13122123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13122123barEv,_ZThn20_N3aaa9GG13122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13122123barEv,_ZThn28_N3aaa9GG13122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13122123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122123barEv,_ZThn8_N3aaa9GG13122123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122123barEv,_ZThn20_N3aaa9GG13122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13122123barEv,_ZThn28_N3aaa9GG13122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312212E[];
Class_Descriptor cd__ZN3aaa9GG1312212E = {  "_ZN3aaa9GG1312212E", // class name
  bases__ZN3aaa9GG1312212E, 6,
  &(vtc__ZN3aaa9GG1312212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312213  : ::aaa::EE131 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13122133fooEv
  virtual void  bar(); // _ZN3aaa9GG13122133barEv
  ~GG1312213(); // tgen
  GG1312213(); // tgen
};
//SIG(1 _ZN3aaa9GG1312213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13122133fooEv");}
void  aaa::GG1312213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13122133barEv");}
aaa::GG1312213 ::~GG1312213(){ note_dtor("_ZN3aaa9GG1312213E", this);} // tgen
aaa::GG1312213 ::GG1312213(){ note_ctor("_ZN3aaa9GG1312213E", this);} // tgen
}
static void Test__ZN3aaa9GG1312213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312213E, buf);
    ::aaa::GG1312213 *dp, &lv = *(dp=new (buf) ::aaa::GG1312213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312213E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1312213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1312213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1312213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312213E);
    dp->::aaa::GG1312213::~GG1312213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312213E(Test__ZN3aaa9GG1312213E, "_ZN3aaa9GG1312213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312213C1Ev();
extern void _ZN3aaa9GG1312213D1Ev();
Name_Map name_map__ZN3aaa9GG1312213E[] = {
  NSPAIR(_ZN3aaa9GG1312213C1Ev),
  NSPAIR(_ZN3aaa9GG1312213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1312213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312213E[];
extern void _ZN3aaa9GG13122133fooEv();
extern void _ZN3aaa9GG13122133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13122133fooEv,_ZThn8_N3aaa9GG13122133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13122133barEv,_ZThn8_N3aaa9GG13122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13122133barEv,_ZThn20_N3aaa9GG13122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13122133fooEv,_ZThn20_N3aaa9GG13122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13122133barEv,_ZThn28_N3aaa9GG13122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13122133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13122133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122133fooEv,_ZThn8_N3aaa9GG13122133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122133barEv,_ZThn8_N3aaa9GG13122133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122133barEv,_ZThn20_N3aaa9GG13122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122133fooEv,_ZThn20_N3aaa9GG13122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13122133barEv,_ZThn28_N3aaa9GG13122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312213E[];
Class_Descriptor cd__ZN3aaa9GG1312213E = {  "_ZN3aaa9GG1312213E", // class name
  bases__ZN3aaa9GG1312213E, 6,
  &(vtc__ZN3aaa9GG1312213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312221  : ::aaa::EE131 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13122213fooEv
  ~GG1312221(); // tgen
  GG1312221(); // tgen
};
//SIG(1 _ZN3aaa9GG1312221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13122213fooEv");}
aaa::GG1312221 ::~GG1312221(){ note_dtor("_ZN3aaa9GG1312221E", this);} // tgen
aaa::GG1312221 ::GG1312221(){ note_ctor("_ZN3aaa9GG1312221E", this);} // tgen
}
static void Test__ZN3aaa9GG1312221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312221E, buf);
    ::aaa::GG1312221 *dp, &lv = *(dp=new (buf) ::aaa::GG1312221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312221E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1312221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1312221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1312221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312221E);
    dp->::aaa::GG1312221::~GG1312221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312221E(Test__ZN3aaa9GG1312221E, "_ZN3aaa9GG1312221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312221C1Ev();
extern void _ZN3aaa9GG1312221D1Ev();
Name_Map name_map__ZN3aaa9GG1312221E[] = {
  NSPAIR(_ZN3aaa9GG1312221C1Ev),
  NSPAIR(_ZN3aaa9GG1312221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1312221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312221E[];
extern void _ZN3aaa9GG13122213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13122213fooEv,_ZThn8_N3aaa9GG13122213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13122213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122213fooEv,_ZThn8_N3aaa9GG13122213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312221E[];
Class_Descriptor cd__ZN3aaa9GG1312221E = {  "_ZN3aaa9GG1312221E", // class name
  bases__ZN3aaa9GG1312221E, 6,
  &(vtc__ZN3aaa9GG1312221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312222  : ::aaa::EE131 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13122223barEv
  ~GG1312222(); // tgen
  GG1312222(); // tgen
};
//SIG(1 _ZN3aaa9GG1312222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13122223barEv");}
aaa::GG1312222 ::~GG1312222(){ note_dtor("_ZN3aaa9GG1312222E", this);} // tgen
aaa::GG1312222 ::GG1312222(){ note_ctor("_ZN3aaa9GG1312222E", this);} // tgen
}
static void Test__ZN3aaa9GG1312222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312222E, buf);
    ::aaa::GG1312222 *dp, &lv = *(dp=new (buf) ::aaa::GG1312222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312222E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1312222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1312222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1312222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312222E);
    dp->::aaa::GG1312222::~GG1312222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312222E(Test__ZN3aaa9GG1312222E, "_ZN3aaa9GG1312222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312222C1Ev();
extern void _ZN3aaa9GG1312222D1Ev();
Name_Map name_map__ZN3aaa9GG1312222E[] = {
  NSPAIR(_ZN3aaa9GG1312222C1Ev),
  NSPAIR(_ZN3aaa9GG1312222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1312222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312222E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13122223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13122223barEv,_ZThn8_N3aaa9GG13122223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13122223barEv,_ZThn20_N3aaa9GG13122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13122223barEv,_ZThn28_N3aaa9GG13122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13122223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122223barEv,_ZThn8_N3aaa9GG13122223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122223barEv,_ZThn20_N3aaa9GG13122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13122223barEv,_ZThn28_N3aaa9GG13122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312222E[];
Class_Descriptor cd__ZN3aaa9GG1312222E = {  "_ZN3aaa9GG1312222E", // class name
  bases__ZN3aaa9GG1312222E, 6,
  &(vtc__ZN3aaa9GG1312222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312223  : ::aaa::EE131 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13122233fooEv
  virtual void  bar(); // _ZN3aaa9GG13122233barEv
  ~GG1312223(); // tgen
  GG1312223(); // tgen
};
//SIG(1 _ZN3aaa9GG1312223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13122233fooEv");}
void  aaa::GG1312223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13122233barEv");}
aaa::GG1312223 ::~GG1312223(){ note_dtor("_ZN3aaa9GG1312223E", this);} // tgen
aaa::GG1312223 ::GG1312223(){ note_ctor("_ZN3aaa9GG1312223E", this);} // tgen
}
static void Test__ZN3aaa9GG1312223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312223E, buf);
    ::aaa::GG1312223 *dp, &lv = *(dp=new (buf) ::aaa::GG1312223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312223E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1312223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1312223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1312223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312223E);
    dp->::aaa::GG1312223::~GG1312223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312223E(Test__ZN3aaa9GG1312223E, "_ZN3aaa9GG1312223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312223C1Ev();
extern void _ZN3aaa9GG1312223D1Ev();
Name_Map name_map__ZN3aaa9GG1312223E[] = {
  NSPAIR(_ZN3aaa9GG1312223C1Ev),
  NSPAIR(_ZN3aaa9GG1312223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1312223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312223E[];
extern void _ZN3aaa9GG13122233fooEv();
extern void _ZN3aaa9GG13122233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13122233fooEv,_ZThn8_N3aaa9GG13122233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13122233barEv,_ZThn8_N3aaa9GG13122233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13122233barEv,_ZThn20_N3aaa9GG13122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13122233barEv,_ZThn28_N3aaa9GG13122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13122233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13122233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122233fooEv,_ZThn8_N3aaa9GG13122233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122233barEv,_ZThn8_N3aaa9GG13122233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122233barEv,_ZThn20_N3aaa9GG13122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13122233barEv,_ZThn28_N3aaa9GG13122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312223E[];
Class_Descriptor cd__ZN3aaa9GG1312223E = {  "_ZN3aaa9GG1312223E", // class name
  bases__ZN3aaa9GG1312223E, 6,
  &(vtc__ZN3aaa9GG1312223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312231  : ::aaa::EE131 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13122313fooEv
  ~GG1312231(); // tgen
  GG1312231(); // tgen
};
//SIG(1 _ZN3aaa9GG1312231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13122313fooEv");}
aaa::GG1312231 ::~GG1312231(){ note_dtor("_ZN3aaa9GG1312231E", this);} // tgen
aaa::GG1312231 ::GG1312231(){ note_ctor("_ZN3aaa9GG1312231E", this);} // tgen
}
static void Test__ZN3aaa9GG1312231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312231E, buf);
    ::aaa::GG1312231 *dp, &lv = *(dp=new (buf) ::aaa::GG1312231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312231E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1312231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1312231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1312231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312231E);
    dp->::aaa::GG1312231::~GG1312231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312231E(Test__ZN3aaa9GG1312231E, "_ZN3aaa9GG1312231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312231C1Ev();
extern void _ZN3aaa9GG1312231D1Ev();
Name_Map name_map__ZN3aaa9GG1312231E[] = {
  NSPAIR(_ZN3aaa9GG1312231C1Ev),
  NSPAIR(_ZN3aaa9GG1312231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1312231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312231E[];
extern void _ZN3aaa9GG13122313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13122313fooEv,_ZThn8_N3aaa9GG13122313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13122313fooEv,_ZThn20_N3aaa9GG13122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13122313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122313fooEv,_ZThn8_N3aaa9GG13122313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122313fooEv,_ZThn20_N3aaa9GG13122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312231E[];
Class_Descriptor cd__ZN3aaa9GG1312231E = {  "_ZN3aaa9GG1312231E", // class name
  bases__ZN3aaa9GG1312231E, 6,
  &(vtc__ZN3aaa9GG1312231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312232  : ::aaa::EE131 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13122323barEv
  ~GG1312232(); // tgen
  GG1312232(); // tgen
};
//SIG(1 _ZN3aaa9GG1312232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13122323barEv");}
aaa::GG1312232 ::~GG1312232(){ note_dtor("_ZN3aaa9GG1312232E", this);} // tgen
aaa::GG1312232 ::GG1312232(){ note_ctor("_ZN3aaa9GG1312232E", this);} // tgen
}
static void Test__ZN3aaa9GG1312232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312232E, buf);
    ::aaa::GG1312232 *dp, &lv = *(dp=new (buf) ::aaa::GG1312232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312232E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1312232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1312232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1312232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312232E);
    dp->::aaa::GG1312232::~GG1312232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312232E(Test__ZN3aaa9GG1312232E, "_ZN3aaa9GG1312232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312232C1Ev();
extern void _ZN3aaa9GG1312232D1Ev();
Name_Map name_map__ZN3aaa9GG1312232E[] = {
  NSPAIR(_ZN3aaa9GG1312232C1Ev),
  NSPAIR(_ZN3aaa9GG1312232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1312232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312232E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13122323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13122323barEv,_ZThn8_N3aaa9GG13122323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13122323barEv,_ZThn20_N3aaa9GG13122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13122323barEv,_ZThn28_N3aaa9GG13122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13122323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122323barEv,_ZThn8_N3aaa9GG13122323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122323barEv,_ZThn20_N3aaa9GG13122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13122323barEv,_ZThn28_N3aaa9GG13122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312232E[];
Class_Descriptor cd__ZN3aaa9GG1312232E = {  "_ZN3aaa9GG1312232E", // class name
  bases__ZN3aaa9GG1312232E, 6,
  &(vtc__ZN3aaa9GG1312232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312233  : ::aaa::EE131 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13122333fooEv
  virtual void  bar(); // _ZN3aaa9GG13122333barEv
  ~GG1312233(); // tgen
  GG1312233(); // tgen
};
//SIG(1 _ZN3aaa9GG1312233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13122333fooEv");}
void  aaa::GG1312233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13122333barEv");}
aaa::GG1312233 ::~GG1312233(){ note_dtor("_ZN3aaa9GG1312233E", this);} // tgen
aaa::GG1312233 ::GG1312233(){ note_ctor("_ZN3aaa9GG1312233E", this);} // tgen
}
static void Test__ZN3aaa9GG1312233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312233E, buf);
    ::aaa::GG1312233 *dp, &lv = *(dp=new (buf) ::aaa::GG1312233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312233E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1312233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1312233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1312233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312233E);
    dp->::aaa::GG1312233::~GG1312233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312233E(Test__ZN3aaa9GG1312233E, "_ZN3aaa9GG1312233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312233C1Ev();
extern void _ZN3aaa9GG1312233D1Ev();
Name_Map name_map__ZN3aaa9GG1312233E[] = {
  NSPAIR(_ZN3aaa9GG1312233C1Ev),
  NSPAIR(_ZN3aaa9GG1312233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1312233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312233E[];
extern void _ZN3aaa9GG13122333fooEv();
extern void _ZN3aaa9GG13122333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13122333fooEv,_ZThn8_N3aaa9GG13122333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13122333barEv,_ZThn8_N3aaa9GG13122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13122333barEv,_ZThn20_N3aaa9GG13122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13122333fooEv,_ZThn20_N3aaa9GG13122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13122333barEv,_ZThn28_N3aaa9GG13122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13122333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13122333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122333fooEv,_ZThn8_N3aaa9GG13122333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13122333barEv,_ZThn8_N3aaa9GG13122333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122333barEv,_ZThn20_N3aaa9GG13122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13122333fooEv,_ZThn20_N3aaa9GG13122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13122333barEv,_ZThn28_N3aaa9GG13122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312233E[];
Class_Descriptor cd__ZN3aaa9GG1312233E = {  "_ZN3aaa9GG1312233E", // class name
  bases__ZN3aaa9GG1312233E, 6,
  &(vtc__ZN3aaa9GG1312233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312311  : ::aaa::EE131 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13123113fooEv
  ~GG1312311(); // tgen
  GG1312311(); // tgen
};
//SIG(1 _ZN3aaa9GG1312311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13123113fooEv");}
aaa::GG1312311 ::~GG1312311(){ note_dtor("_ZN3aaa9GG1312311E", this);} // tgen
aaa::GG1312311 ::GG1312311(){ note_ctor("_ZN3aaa9GG1312311E", this);} // tgen
}
static void Test__ZN3aaa9GG1312311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312311E, buf);
    ::aaa::GG1312311 *dp, &lv = *(dp=new (buf) ::aaa::GG1312311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312311E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1312311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1312311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1312311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312311E);
    dp->::aaa::GG1312311::~GG1312311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312311E(Test__ZN3aaa9GG1312311E, "_ZN3aaa9GG1312311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312311C1Ev();
extern void _ZN3aaa9GG1312311D1Ev();
Name_Map name_map__ZN3aaa9GG1312311E[] = {
  NSPAIR(_ZN3aaa9GG1312311C1Ev),
  NSPAIR(_ZN3aaa9GG1312311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1312311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312311E[];
extern void _ZN3aaa9GG13123113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13123113fooEv,_ZThn8_N3aaa9GG13123113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13123113fooEv,_ZThn20_N3aaa9GG13123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123113fooEv,_ZThn28_N3aaa9GG13123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13123113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123113fooEv,_ZThn8_N3aaa9GG13123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123113fooEv,_ZThn20_N3aaa9GG13123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123113fooEv,_ZThn28_N3aaa9GG13123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312311E[];
Class_Descriptor cd__ZN3aaa9GG1312311E = {  "_ZN3aaa9GG1312311E", // class name
  bases__ZN3aaa9GG1312311E, 6,
  &(vtc__ZN3aaa9GG1312311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312312  : ::aaa::EE131 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13123123barEv
  ~GG1312312(); // tgen
  GG1312312(); // tgen
};
//SIG(1 _ZN3aaa9GG1312312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13123123barEv");}
aaa::GG1312312 ::~GG1312312(){ note_dtor("_ZN3aaa9GG1312312E", this);} // tgen
aaa::GG1312312 ::GG1312312(){ note_ctor("_ZN3aaa9GG1312312E", this);} // tgen
}
static void Test__ZN3aaa9GG1312312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312312E, buf);
    ::aaa::GG1312312 *dp, &lv = *(dp=new (buf) ::aaa::GG1312312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312312E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1312312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1312312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1312312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312312E);
    dp->::aaa::GG1312312::~GG1312312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312312E(Test__ZN3aaa9GG1312312E, "_ZN3aaa9GG1312312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312312C1Ev();
extern void _ZN3aaa9GG1312312D1Ev();
Name_Map name_map__ZN3aaa9GG1312312E[] = {
  NSPAIR(_ZN3aaa9GG1312312C1Ev),
  NSPAIR(_ZN3aaa9GG1312312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1312312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312312E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13123123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13123123barEv,_ZThn8_N3aaa9GG13123123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13123123barEv,_ZThn20_N3aaa9GG13123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123123barEv,_ZThn28_N3aaa9GG13123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13123123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123123barEv,_ZThn8_N3aaa9GG13123123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123123barEv,_ZThn20_N3aaa9GG13123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123123barEv,_ZThn28_N3aaa9GG13123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312312E[];
Class_Descriptor cd__ZN3aaa9GG1312312E = {  "_ZN3aaa9GG1312312E", // class name
  bases__ZN3aaa9GG1312312E, 6,
  &(vtc__ZN3aaa9GG1312312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312313  : ::aaa::EE131 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13123133fooEv
  virtual void  bar(); // _ZN3aaa9GG13123133barEv
  ~GG1312313(); // tgen
  GG1312313(); // tgen
};
//SIG(1 _ZN3aaa9GG1312313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13123133fooEv");}
void  aaa::GG1312313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13123133barEv");}
aaa::GG1312313 ::~GG1312313(){ note_dtor("_ZN3aaa9GG1312313E", this);} // tgen
aaa::GG1312313 ::GG1312313(){ note_ctor("_ZN3aaa9GG1312313E", this);} // tgen
}
static void Test__ZN3aaa9GG1312313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312313E, buf);
    ::aaa::GG1312313 *dp, &lv = *(dp=new (buf) ::aaa::GG1312313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312313E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1312313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1312313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1312313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312313E);
    dp->::aaa::GG1312313::~GG1312313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312313E(Test__ZN3aaa9GG1312313E, "_ZN3aaa9GG1312313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312313C1Ev();
extern void _ZN3aaa9GG1312313D1Ev();
Name_Map name_map__ZN3aaa9GG1312313E[] = {
  NSPAIR(_ZN3aaa9GG1312313C1Ev),
  NSPAIR(_ZN3aaa9GG1312313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1312313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312313E[];
extern void _ZN3aaa9GG13123133fooEv();
extern void _ZN3aaa9GG13123133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13123133fooEv,_ZThn8_N3aaa9GG13123133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13123133barEv,_ZThn8_N3aaa9GG13123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13123133barEv,_ZThn20_N3aaa9GG13123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13123133fooEv,_ZThn20_N3aaa9GG13123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123133fooEv,_ZThn28_N3aaa9GG13123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123133barEv,_ZThn28_N3aaa9GG13123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13123133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13123133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123133fooEv,_ZThn8_N3aaa9GG13123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123133barEv,_ZThn8_N3aaa9GG13123133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123133barEv,_ZThn20_N3aaa9GG13123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123133fooEv,_ZThn20_N3aaa9GG13123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123133fooEv,_ZThn28_N3aaa9GG13123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123133barEv,_ZThn28_N3aaa9GG13123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312313E[];
Class_Descriptor cd__ZN3aaa9GG1312313E = {  "_ZN3aaa9GG1312313E", // class name
  bases__ZN3aaa9GG1312313E, 6,
  &(vtc__ZN3aaa9GG1312313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312321  : ::aaa::EE131 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13123213fooEv
  ~GG1312321(); // tgen
  GG1312321(); // tgen
};
//SIG(1 _ZN3aaa9GG1312321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13123213fooEv");}
aaa::GG1312321 ::~GG1312321(){ note_dtor("_ZN3aaa9GG1312321E", this);} // tgen
aaa::GG1312321 ::GG1312321(){ note_ctor("_ZN3aaa9GG1312321E", this);} // tgen
}
static void Test__ZN3aaa9GG1312321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312321E, buf);
    ::aaa::GG1312321 *dp, &lv = *(dp=new (buf) ::aaa::GG1312321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312321E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1312321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1312321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1312321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312321E);
    dp->::aaa::GG1312321::~GG1312321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312321E(Test__ZN3aaa9GG1312321E, "_ZN3aaa9GG1312321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312321C1Ev();
extern void _ZN3aaa9GG1312321D1Ev();
Name_Map name_map__ZN3aaa9GG1312321E[] = {
  NSPAIR(_ZN3aaa9GG1312321C1Ev),
  NSPAIR(_ZN3aaa9GG1312321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1312321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312321E[];
extern void _ZN3aaa9GG13123213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13123213fooEv,_ZThn8_N3aaa9GG13123213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13123213fooEv,_ZThn28_N3aaa9GG13123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13123213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123213fooEv,_ZThn8_N3aaa9GG13123213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123213fooEv,_ZThn28_N3aaa9GG13123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312321E[];
Class_Descriptor cd__ZN3aaa9GG1312321E = {  "_ZN3aaa9GG1312321E", // class name
  bases__ZN3aaa9GG1312321E, 6,
  &(vtc__ZN3aaa9GG1312321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312322  : ::aaa::EE131 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13123223barEv
  ~GG1312322(); // tgen
  GG1312322(); // tgen
};
//SIG(1 _ZN3aaa9GG1312322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13123223barEv");}
aaa::GG1312322 ::~GG1312322(){ note_dtor("_ZN3aaa9GG1312322E", this);} // tgen
aaa::GG1312322 ::GG1312322(){ note_ctor("_ZN3aaa9GG1312322E", this);} // tgen
}
static void Test__ZN3aaa9GG1312322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312322E, buf);
    ::aaa::GG1312322 *dp, &lv = *(dp=new (buf) ::aaa::GG1312322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312322E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1312322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1312322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1312322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312322E);
    dp->::aaa::GG1312322::~GG1312322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312322E(Test__ZN3aaa9GG1312322E, "_ZN3aaa9GG1312322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312322C1Ev();
extern void _ZN3aaa9GG1312322D1Ev();
Name_Map name_map__ZN3aaa9GG1312322E[] = {
  NSPAIR(_ZN3aaa9GG1312322C1Ev),
  NSPAIR(_ZN3aaa9GG1312322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1312322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312322E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13123223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13123223barEv,_ZThn8_N3aaa9GG13123223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13123223barEv,_ZThn20_N3aaa9GG13123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13123223barEv,_ZThn28_N3aaa9GG13123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13123223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123223barEv,_ZThn8_N3aaa9GG13123223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123223barEv,_ZThn20_N3aaa9GG13123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123223barEv,_ZThn28_N3aaa9GG13123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312322E[];
Class_Descriptor cd__ZN3aaa9GG1312322E = {  "_ZN3aaa9GG1312322E", // class name
  bases__ZN3aaa9GG1312322E, 6,
  &(vtc__ZN3aaa9GG1312322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312323  : ::aaa::EE131 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13123233fooEv
  virtual void  bar(); // _ZN3aaa9GG13123233barEv
  ~GG1312323(); // tgen
  GG1312323(); // tgen
};
//SIG(1 _ZN3aaa9GG1312323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13123233fooEv");}
void  aaa::GG1312323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13123233barEv");}
aaa::GG1312323 ::~GG1312323(){ note_dtor("_ZN3aaa9GG1312323E", this);} // tgen
aaa::GG1312323 ::GG1312323(){ note_ctor("_ZN3aaa9GG1312323E", this);} // tgen
}
static void Test__ZN3aaa9GG1312323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312323E, buf);
    ::aaa::GG1312323 *dp, &lv = *(dp=new (buf) ::aaa::GG1312323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312323E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1312323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1312323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1312323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312323E);
    dp->::aaa::GG1312323::~GG1312323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312323E(Test__ZN3aaa9GG1312323E, "_ZN3aaa9GG1312323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312323C1Ev();
extern void _ZN3aaa9GG1312323D1Ev();
Name_Map name_map__ZN3aaa9GG1312323E[] = {
  NSPAIR(_ZN3aaa9GG1312323C1Ev),
  NSPAIR(_ZN3aaa9GG1312323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1312323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312323E[];
extern void _ZN3aaa9GG13123233fooEv();
extern void _ZN3aaa9GG13123233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13123233fooEv,_ZThn8_N3aaa9GG13123233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13123233barEv,_ZThn8_N3aaa9GG13123233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13123233barEv,_ZThn20_N3aaa9GG13123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123233fooEv,_ZThn28_N3aaa9GG13123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123233barEv,_ZThn28_N3aaa9GG13123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13123233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13123233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123233fooEv,_ZThn8_N3aaa9GG13123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123233barEv,_ZThn8_N3aaa9GG13123233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123233barEv,_ZThn20_N3aaa9GG13123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123233fooEv,_ZThn28_N3aaa9GG13123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123233barEv,_ZThn28_N3aaa9GG13123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312323E[];
Class_Descriptor cd__ZN3aaa9GG1312323E = {  "_ZN3aaa9GG1312323E", // class name
  bases__ZN3aaa9GG1312323E, 6,
  &(vtc__ZN3aaa9GG1312323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312331  : ::aaa::EE131 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13123313fooEv
  ~GG1312331(); // tgen
  GG1312331(); // tgen
};
//SIG(1 _ZN3aaa9GG1312331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13123313fooEv");}
aaa::GG1312331 ::~GG1312331(){ note_dtor("_ZN3aaa9GG1312331E", this);} // tgen
aaa::GG1312331 ::GG1312331(){ note_ctor("_ZN3aaa9GG1312331E", this);} // tgen
}
static void Test__ZN3aaa9GG1312331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312331E, buf);
    ::aaa::GG1312331 *dp, &lv = *(dp=new (buf) ::aaa::GG1312331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312331E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1312331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1312331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1312331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312331E);
    dp->::aaa::GG1312331::~GG1312331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312331E(Test__ZN3aaa9GG1312331E, "_ZN3aaa9GG1312331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312331C1Ev();
extern void _ZN3aaa9GG1312331D1Ev();
Name_Map name_map__ZN3aaa9GG1312331E[] = {
  NSPAIR(_ZN3aaa9GG1312331C1Ev),
  NSPAIR(_ZN3aaa9GG1312331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1312331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312331E[];
extern void _ZN3aaa9GG13123313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13123313fooEv,_ZThn8_N3aaa9GG13123313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13123313fooEv,_ZThn20_N3aaa9GG13123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123313fooEv,_ZThn28_N3aaa9GG13123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13123313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123313fooEv,_ZThn8_N3aaa9GG13123313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123313fooEv,_ZThn20_N3aaa9GG13123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123313fooEv,_ZThn28_N3aaa9GG13123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312331E[];
Class_Descriptor cd__ZN3aaa9GG1312331E = {  "_ZN3aaa9GG1312331E", // class name
  bases__ZN3aaa9GG1312331E, 6,
  &(vtc__ZN3aaa9GG1312331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312332  : ::aaa::EE131 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13123323barEv
  ~GG1312332(); // tgen
  GG1312332(); // tgen
};
//SIG(1 _ZN3aaa9GG1312332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1312332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13123323barEv");}
aaa::GG1312332 ::~GG1312332(){ note_dtor("_ZN3aaa9GG1312332E", this);} // tgen
aaa::GG1312332 ::GG1312332(){ note_ctor("_ZN3aaa9GG1312332E", this);} // tgen
}
static void Test__ZN3aaa9GG1312332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312332E, buf);
    ::aaa::GG1312332 *dp, &lv = *(dp=new (buf) ::aaa::GG1312332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312332E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1312332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1312332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1312332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312332E);
    dp->::aaa::GG1312332::~GG1312332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312332E(Test__ZN3aaa9GG1312332E, "_ZN3aaa9GG1312332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312332C1Ev();
extern void _ZN3aaa9GG1312332D1Ev();
Name_Map name_map__ZN3aaa9GG1312332E[] = {
  NSPAIR(_ZN3aaa9GG1312332C1Ev),
  NSPAIR(_ZN3aaa9GG1312332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1312332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312332E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13123323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13123323barEv,_ZThn8_N3aaa9GG13123323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13123323barEv,_ZThn20_N3aaa9GG13123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123323barEv,_ZThn28_N3aaa9GG13123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13123323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123323barEv,_ZThn8_N3aaa9GG13123323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123323barEv,_ZThn20_N3aaa9GG13123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123323barEv,_ZThn28_N3aaa9GG13123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312332E[];
Class_Descriptor cd__ZN3aaa9GG1312332E = {  "_ZN3aaa9GG1312332E", // class name
  bases__ZN3aaa9GG1312332E, 6,
  &(vtc__ZN3aaa9GG1312332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1312333  : ::aaa::EE131 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13123333fooEv
  virtual void  bar(); // _ZN3aaa9GG13123333barEv
  ~GG1312333(); // tgen
  GG1312333(); // tgen
};
//SIG(1 _ZN3aaa9GG1312333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1312333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13123333fooEv");}
void  aaa::GG1312333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13123333barEv");}
aaa::GG1312333 ::~GG1312333(){ note_dtor("_ZN3aaa9GG1312333E", this);} // tgen
aaa::GG1312333 ::GG1312333(){ note_ctor("_ZN3aaa9GG1312333E", this);} // tgen
}
static void Test__ZN3aaa9GG1312333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1312333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1312333E, buf);
    ::aaa::GG1312333 *dp, &lv = *(dp=new (buf) ::aaa::GG1312333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1312333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1312333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1312333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1312333E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1312333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1312333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1312333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1312333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1312333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1312333E);
    dp->::aaa::GG1312333::~GG1312333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1312333E(Test__ZN3aaa9GG1312333E, "_ZN3aaa9GG1312333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1312333C1Ev();
extern void _ZN3aaa9GG1312333D1Ev();
Name_Map name_map__ZN3aaa9GG1312333E[] = {
  NSPAIR(_ZN3aaa9GG1312333C1Ev),
  NSPAIR(_ZN3aaa9GG1312333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1312333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1312333E[];
extern void _ZN3aaa9GG13123333fooEv();
extern void _ZN3aaa9GG13123333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13123333fooEv,_ZThn8_N3aaa9GG13123333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13123333barEv,_ZThn8_N3aaa9GG13123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13123333barEv,_ZThn20_N3aaa9GG13123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13123333fooEv,_ZThn20_N3aaa9GG13123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123333fooEv,_ZThn28_N3aaa9GG13123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13123333barEv,_ZThn28_N3aaa9GG13123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1312333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13123333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13123333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123333fooEv,_ZThn8_N3aaa9GG13123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13123333barEv,_ZThn8_N3aaa9GG13123333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123333barEv,_ZThn20_N3aaa9GG13123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13123333fooEv,_ZThn20_N3aaa9GG13123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123333fooEv,_ZThn28_N3aaa9GG13123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13123333barEv,_ZThn28_N3aaa9GG13123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1312333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1312333E[];
Class_Descriptor cd__ZN3aaa9GG1312333E = {  "_ZN3aaa9GG1312333E", // class name
  bases__ZN3aaa9GG1312333E, 6,
  &(vtc__ZN3aaa9GG1312333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1312333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1312333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313111  : ::aaa::EE131 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13131113fooEv
  ~GG1313111(); // tgen
  GG1313111(); // tgen
};
//SIG(1 _ZN3aaa9GG1313111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13131113fooEv");}
aaa::GG1313111 ::~GG1313111(){ note_dtor("_ZN3aaa9GG1313111E", this);} // tgen
aaa::GG1313111 ::GG1313111(){ note_ctor("_ZN3aaa9GG1313111E", this);} // tgen
}
static void Test__ZN3aaa9GG1313111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313111E, buf);
    ::aaa::GG1313111 *dp, &lv = *(dp=new (buf) ::aaa::GG1313111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313111E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1313111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1313111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1313111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313111E);
    dp->::aaa::GG1313111::~GG1313111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313111E(Test__ZN3aaa9GG1313111E, "_ZN3aaa9GG1313111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313111C1Ev();
extern void _ZN3aaa9GG1313111D1Ev();
Name_Map name_map__ZN3aaa9GG1313111E[] = {
  NSPAIR(_ZN3aaa9GG1313111C1Ev),
  NSPAIR(_ZN3aaa9GG1313111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1313111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313111E[];
extern void _ZN3aaa9GG13131113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13131113fooEv,_ZThn8_N3aaa9GG13131113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13131113fooEv,_ZThn20_N3aaa9GG13131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13131113fooEv,_ZThn28_N3aaa9GG13131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13131113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131113fooEv,_ZThn8_N3aaa9GG13131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131113fooEv,_ZThn20_N3aaa9GG13131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13131113fooEv,_ZThn28_N3aaa9GG13131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313111E[];
Class_Descriptor cd__ZN3aaa9GG1313111E = {  "_ZN3aaa9GG1313111E", // class name
  bases__ZN3aaa9GG1313111E, 6,
  &(vtc__ZN3aaa9GG1313111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313112  : ::aaa::EE131 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13131123barEv
  ~GG1313112(); // tgen
  GG1313112(); // tgen
};
//SIG(1 _ZN3aaa9GG1313112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13131123barEv");}
aaa::GG1313112 ::~GG1313112(){ note_dtor("_ZN3aaa9GG1313112E", this);} // tgen
aaa::GG1313112 ::GG1313112(){ note_ctor("_ZN3aaa9GG1313112E", this);} // tgen
}
static void Test__ZN3aaa9GG1313112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313112E, buf);
    ::aaa::GG1313112 *dp, &lv = *(dp=new (buf) ::aaa::GG1313112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313112E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1313112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1313112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1313112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313112E);
    dp->::aaa::GG1313112::~GG1313112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313112E(Test__ZN3aaa9GG1313112E, "_ZN3aaa9GG1313112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313112C1Ev();
extern void _ZN3aaa9GG1313112D1Ev();
Name_Map name_map__ZN3aaa9GG1313112E[] = {
  NSPAIR(_ZN3aaa9GG1313112C1Ev),
  NSPAIR(_ZN3aaa9GG1313112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1313112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313112E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13131123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13131123barEv,_ZThn8_N3aaa9GG13131123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13131123barEv,_ZThn20_N3aaa9GG13131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13131123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131123barEv,_ZThn8_N3aaa9GG13131123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131123barEv,_ZThn20_N3aaa9GG13131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313112E[];
Class_Descriptor cd__ZN3aaa9GG1313112E = {  "_ZN3aaa9GG1313112E", // class name
  bases__ZN3aaa9GG1313112E, 6,
  &(vtc__ZN3aaa9GG1313112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313113  : ::aaa::EE131 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13131133fooEv
  virtual void  bar(); // _ZN3aaa9GG13131133barEv
  ~GG1313113(); // tgen
  GG1313113(); // tgen
};
//SIG(1 _ZN3aaa9GG1313113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13131133fooEv");}
void  aaa::GG1313113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13131133barEv");}
aaa::GG1313113 ::~GG1313113(){ note_dtor("_ZN3aaa9GG1313113E", this);} // tgen
aaa::GG1313113 ::GG1313113(){ note_ctor("_ZN3aaa9GG1313113E", this);} // tgen
}
static void Test__ZN3aaa9GG1313113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313113E, buf);
    ::aaa::GG1313113 *dp, &lv = *(dp=new (buf) ::aaa::GG1313113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313113E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1313113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1313113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1313113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313113E);
    dp->::aaa::GG1313113::~GG1313113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313113E(Test__ZN3aaa9GG1313113E, "_ZN3aaa9GG1313113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313113C1Ev();
extern void _ZN3aaa9GG1313113D1Ev();
Name_Map name_map__ZN3aaa9GG1313113E[] = {
  NSPAIR(_ZN3aaa9GG1313113C1Ev),
  NSPAIR(_ZN3aaa9GG1313113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1313113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313113E[];
extern void _ZN3aaa9GG13131133fooEv();
extern void _ZN3aaa9GG13131133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13131133fooEv,_ZThn8_N3aaa9GG13131133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13131133barEv,_ZThn8_N3aaa9GG13131133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13131133fooEv,_ZThn20_N3aaa9GG13131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13131133barEv,_ZThn20_N3aaa9GG13131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13131133fooEv,_ZThn28_N3aaa9GG13131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13131133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13131133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131133fooEv,_ZThn8_N3aaa9GG13131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131133barEv,_ZThn8_N3aaa9GG13131133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131133fooEv,_ZThn20_N3aaa9GG13131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131133barEv,_ZThn20_N3aaa9GG13131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13131133fooEv,_ZThn28_N3aaa9GG13131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313113E[];
Class_Descriptor cd__ZN3aaa9GG1313113E = {  "_ZN3aaa9GG1313113E", // class name
  bases__ZN3aaa9GG1313113E, 6,
  &(vtc__ZN3aaa9GG1313113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313121  : ::aaa::EE131 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13131213fooEv
  ~GG1313121(); // tgen
  GG1313121(); // tgen
};
//SIG(1 _ZN3aaa9GG1313121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13131213fooEv");}
aaa::GG1313121 ::~GG1313121(){ note_dtor("_ZN3aaa9GG1313121E", this);} // tgen
aaa::GG1313121 ::GG1313121(){ note_ctor("_ZN3aaa9GG1313121E", this);} // tgen
}
static void Test__ZN3aaa9GG1313121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313121E, buf);
    ::aaa::GG1313121 *dp, &lv = *(dp=new (buf) ::aaa::GG1313121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313121E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1313121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1313121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1313121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313121E);
    dp->::aaa::GG1313121::~GG1313121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313121E(Test__ZN3aaa9GG1313121E, "_ZN3aaa9GG1313121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313121C1Ev();
extern void _ZN3aaa9GG1313121D1Ev();
Name_Map name_map__ZN3aaa9GG1313121E[] = {
  NSPAIR(_ZN3aaa9GG1313121C1Ev),
  NSPAIR(_ZN3aaa9GG1313121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1313121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313121E[];
extern void _ZN3aaa9GG13131213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13131213fooEv,_ZThn8_N3aaa9GG13131213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13131213fooEv,_ZThn20_N3aaa9GG13131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13131213fooEv,_ZThn28_N3aaa9GG13131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13131213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131213fooEv,_ZThn8_N3aaa9GG13131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131213fooEv,_ZThn20_N3aaa9GG13131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13131213fooEv,_ZThn28_N3aaa9GG13131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313121E[];
Class_Descriptor cd__ZN3aaa9GG1313121E = {  "_ZN3aaa9GG1313121E", // class name
  bases__ZN3aaa9GG1313121E, 6,
  &(vtc__ZN3aaa9GG1313121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313122  : ::aaa::EE131 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13131223barEv
  ~GG1313122(); // tgen
  GG1313122(); // tgen
};
//SIG(1 _ZN3aaa9GG1313122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13131223barEv");}
aaa::GG1313122 ::~GG1313122(){ note_dtor("_ZN3aaa9GG1313122E", this);} // tgen
aaa::GG1313122 ::GG1313122(){ note_ctor("_ZN3aaa9GG1313122E", this);} // tgen
}
static void Test__ZN3aaa9GG1313122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313122E, buf);
    ::aaa::GG1313122 *dp, &lv = *(dp=new (buf) ::aaa::GG1313122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313122E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1313122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1313122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1313122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313122E);
    dp->::aaa::GG1313122::~GG1313122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313122E(Test__ZN3aaa9GG1313122E, "_ZN3aaa9GG1313122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313122C1Ev();
extern void _ZN3aaa9GG1313122D1Ev();
Name_Map name_map__ZN3aaa9GG1313122E[] = {
  NSPAIR(_ZN3aaa9GG1313122C1Ev),
  NSPAIR(_ZN3aaa9GG1313122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1313122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313122E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13131223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13131223barEv,_ZThn8_N3aaa9GG13131223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13131223barEv,_ZThn20_N3aaa9GG13131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13131223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131223barEv,_ZThn8_N3aaa9GG13131223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131223barEv,_ZThn20_N3aaa9GG13131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313122E[];
Class_Descriptor cd__ZN3aaa9GG1313122E = {  "_ZN3aaa9GG1313122E", // class name
  bases__ZN3aaa9GG1313122E, 6,
  &(vtc__ZN3aaa9GG1313122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313123  : ::aaa::EE131 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13131233fooEv
  virtual void  bar(); // _ZN3aaa9GG13131233barEv
  ~GG1313123(); // tgen
  GG1313123(); // tgen
};
//SIG(1 _ZN3aaa9GG1313123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13131233fooEv");}
void  aaa::GG1313123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13131233barEv");}
aaa::GG1313123 ::~GG1313123(){ note_dtor("_ZN3aaa9GG1313123E", this);} // tgen
aaa::GG1313123 ::GG1313123(){ note_ctor("_ZN3aaa9GG1313123E", this);} // tgen
}
static void Test__ZN3aaa9GG1313123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313123E, buf);
    ::aaa::GG1313123 *dp, &lv = *(dp=new (buf) ::aaa::GG1313123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313123E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1313123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1313123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1313123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313123E);
    dp->::aaa::GG1313123::~GG1313123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313123E(Test__ZN3aaa9GG1313123E, "_ZN3aaa9GG1313123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313123C1Ev();
extern void _ZN3aaa9GG1313123D1Ev();
Name_Map name_map__ZN3aaa9GG1313123E[] = {
  NSPAIR(_ZN3aaa9GG1313123C1Ev),
  NSPAIR(_ZN3aaa9GG1313123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1313123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313123E[];
extern void _ZN3aaa9GG13131233fooEv();
extern void _ZN3aaa9GG13131233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13131233fooEv,_ZThn8_N3aaa9GG13131233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13131233barEv,_ZThn8_N3aaa9GG13131233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13131233fooEv,_ZThn20_N3aaa9GG13131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13131233barEv,_ZThn20_N3aaa9GG13131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13131233fooEv,_ZThn28_N3aaa9GG13131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13131233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13131233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131233fooEv,_ZThn8_N3aaa9GG13131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131233barEv,_ZThn8_N3aaa9GG13131233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131233fooEv,_ZThn20_N3aaa9GG13131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131233barEv,_ZThn20_N3aaa9GG13131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13131233fooEv,_ZThn28_N3aaa9GG13131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313123E[];
Class_Descriptor cd__ZN3aaa9GG1313123E = {  "_ZN3aaa9GG1313123E", // class name
  bases__ZN3aaa9GG1313123E, 6,
  &(vtc__ZN3aaa9GG1313123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313131  : ::aaa::EE131 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13131313fooEv
  ~GG1313131(); // tgen
  GG1313131(); // tgen
};
//SIG(1 _ZN3aaa9GG1313131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13131313fooEv");}
aaa::GG1313131 ::~GG1313131(){ note_dtor("_ZN3aaa9GG1313131E", this);} // tgen
aaa::GG1313131 ::GG1313131(){ note_ctor("_ZN3aaa9GG1313131E", this);} // tgen
}
static void Test__ZN3aaa9GG1313131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313131E, buf);
    ::aaa::GG1313131 *dp, &lv = *(dp=new (buf) ::aaa::GG1313131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313131E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1313131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1313131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1313131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313131E);
    dp->::aaa::GG1313131::~GG1313131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313131E(Test__ZN3aaa9GG1313131E, "_ZN3aaa9GG1313131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313131C1Ev();
extern void _ZN3aaa9GG1313131D1Ev();
Name_Map name_map__ZN3aaa9GG1313131E[] = {
  NSPAIR(_ZN3aaa9GG1313131C1Ev),
  NSPAIR(_ZN3aaa9GG1313131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1313131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313131E[];
extern void _ZN3aaa9GG13131313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13131313fooEv,_ZThn8_N3aaa9GG13131313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13131313fooEv,_ZThn20_N3aaa9GG13131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13131313fooEv,_ZThn28_N3aaa9GG13131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13131313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131313fooEv,_ZThn8_N3aaa9GG13131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131313fooEv,_ZThn20_N3aaa9GG13131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13131313fooEv,_ZThn28_N3aaa9GG13131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313131E[];
Class_Descriptor cd__ZN3aaa9GG1313131E = {  "_ZN3aaa9GG1313131E", // class name
  bases__ZN3aaa9GG1313131E, 6,
  &(vtc__ZN3aaa9GG1313131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313132  : ::aaa::EE131 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13131323barEv
  ~GG1313132(); // tgen
  GG1313132(); // tgen
};
//SIG(1 _ZN3aaa9GG1313132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13131323barEv");}
aaa::GG1313132 ::~GG1313132(){ note_dtor("_ZN3aaa9GG1313132E", this);} // tgen
aaa::GG1313132 ::GG1313132(){ note_ctor("_ZN3aaa9GG1313132E", this);} // tgen
}
static void Test__ZN3aaa9GG1313132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313132E, buf);
    ::aaa::GG1313132 *dp, &lv = *(dp=new (buf) ::aaa::GG1313132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313132E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1313132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1313132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1313132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313132E);
    dp->::aaa::GG1313132::~GG1313132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313132E(Test__ZN3aaa9GG1313132E, "_ZN3aaa9GG1313132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313132C1Ev();
extern void _ZN3aaa9GG1313132D1Ev();
Name_Map name_map__ZN3aaa9GG1313132E[] = {
  NSPAIR(_ZN3aaa9GG1313132C1Ev),
  NSPAIR(_ZN3aaa9GG1313132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1313132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313132E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13131323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13131323barEv,_ZThn8_N3aaa9GG13131323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13131323barEv,_ZThn20_N3aaa9GG13131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13131323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131323barEv,_ZThn8_N3aaa9GG13131323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131323barEv,_ZThn20_N3aaa9GG13131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313132E[];
Class_Descriptor cd__ZN3aaa9GG1313132E = {  "_ZN3aaa9GG1313132E", // class name
  bases__ZN3aaa9GG1313132E, 6,
  &(vtc__ZN3aaa9GG1313132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313133  : ::aaa::EE131 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13131333fooEv
  virtual void  bar(); // _ZN3aaa9GG13131333barEv
  ~GG1313133(); // tgen
  GG1313133(); // tgen
};
//SIG(1 _ZN3aaa9GG1313133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13131333fooEv");}
void  aaa::GG1313133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13131333barEv");}
aaa::GG1313133 ::~GG1313133(){ note_dtor("_ZN3aaa9GG1313133E", this);} // tgen
aaa::GG1313133 ::GG1313133(){ note_ctor("_ZN3aaa9GG1313133E", this);} // tgen
}
static void Test__ZN3aaa9GG1313133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313133E, buf);
    ::aaa::GG1313133 *dp, &lv = *(dp=new (buf) ::aaa::GG1313133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313133E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1313133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1313133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1313133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313133E);
    dp->::aaa::GG1313133::~GG1313133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313133E(Test__ZN3aaa9GG1313133E, "_ZN3aaa9GG1313133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313133C1Ev();
extern void _ZN3aaa9GG1313133D1Ev();
Name_Map name_map__ZN3aaa9GG1313133E[] = {
  NSPAIR(_ZN3aaa9GG1313133C1Ev),
  NSPAIR(_ZN3aaa9GG1313133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1313133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313133E[];
extern void _ZN3aaa9GG13131333fooEv();
extern void _ZN3aaa9GG13131333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13131333fooEv,_ZThn8_N3aaa9GG13131333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13131333barEv,_ZThn8_N3aaa9GG13131333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13131333fooEv,_ZThn20_N3aaa9GG13131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13131333barEv,_ZThn20_N3aaa9GG13131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13131333fooEv,_ZThn28_N3aaa9GG13131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13131333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13131333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131333fooEv,_ZThn8_N3aaa9GG13131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13131333barEv,_ZThn8_N3aaa9GG13131333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131333fooEv,_ZThn20_N3aaa9GG13131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13131333barEv,_ZThn20_N3aaa9GG13131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13131333fooEv,_ZThn28_N3aaa9GG13131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313133E[];
Class_Descriptor cd__ZN3aaa9GG1313133E = {  "_ZN3aaa9GG1313133E", // class name
  bases__ZN3aaa9GG1313133E, 6,
  &(vtc__ZN3aaa9GG1313133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313211  : ::aaa::EE131 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13132113fooEv
  ~GG1313211(); // tgen
  GG1313211(); // tgen
};
//SIG(1 _ZN3aaa9GG1313211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13132113fooEv");}
aaa::GG1313211 ::~GG1313211(){ note_dtor("_ZN3aaa9GG1313211E", this);} // tgen
aaa::GG1313211 ::GG1313211(){ note_ctor("_ZN3aaa9GG1313211E", this);} // tgen
}
static void Test__ZN3aaa9GG1313211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313211E, buf);
    ::aaa::GG1313211 *dp, &lv = *(dp=new (buf) ::aaa::GG1313211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313211E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1313211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1313211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1313211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313211E);
    dp->::aaa::GG1313211::~GG1313211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313211E(Test__ZN3aaa9GG1313211E, "_ZN3aaa9GG1313211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313211C1Ev();
extern void _ZN3aaa9GG1313211D1Ev();
Name_Map name_map__ZN3aaa9GG1313211E[] = {
  NSPAIR(_ZN3aaa9GG1313211C1Ev),
  NSPAIR(_ZN3aaa9GG1313211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1313211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313211E[];
extern void _ZN3aaa9GG13132113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13132113fooEv,_ZThn8_N3aaa9GG13132113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13132113fooEv,_ZThn20_N3aaa9GG13132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13132113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132113fooEv,_ZThn8_N3aaa9GG13132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132113fooEv,_ZThn20_N3aaa9GG13132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313211E[];
Class_Descriptor cd__ZN3aaa9GG1313211E = {  "_ZN3aaa9GG1313211E", // class name
  bases__ZN3aaa9GG1313211E, 6,
  &(vtc__ZN3aaa9GG1313211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313212  : ::aaa::EE131 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13132123barEv
  ~GG1313212(); // tgen
  GG1313212(); // tgen
};
//SIG(1 _ZN3aaa9GG1313212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13132123barEv");}
aaa::GG1313212 ::~GG1313212(){ note_dtor("_ZN3aaa9GG1313212E", this);} // tgen
aaa::GG1313212 ::GG1313212(){ note_ctor("_ZN3aaa9GG1313212E", this);} // tgen
}
static void Test__ZN3aaa9GG1313212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313212E, buf);
    ::aaa::GG1313212 *dp, &lv = *(dp=new (buf) ::aaa::GG1313212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313212E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1313212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1313212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1313212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313212E);
    dp->::aaa::GG1313212::~GG1313212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313212E(Test__ZN3aaa9GG1313212E, "_ZN3aaa9GG1313212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313212C1Ev();
extern void _ZN3aaa9GG1313212D1Ev();
Name_Map name_map__ZN3aaa9GG1313212E[] = {
  NSPAIR(_ZN3aaa9GG1313212C1Ev),
  NSPAIR(_ZN3aaa9GG1313212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1313212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313212E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13132123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13132123barEv,_ZThn8_N3aaa9GG13132123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13132123barEv,_ZThn20_N3aaa9GG13132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13132123barEv,_ZThn28_N3aaa9GG13132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13132123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132123barEv,_ZThn8_N3aaa9GG13132123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132123barEv,_ZThn20_N3aaa9GG13132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13132123barEv,_ZThn28_N3aaa9GG13132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313212E[];
Class_Descriptor cd__ZN3aaa9GG1313212E = {  "_ZN3aaa9GG1313212E", // class name
  bases__ZN3aaa9GG1313212E, 6,
  &(vtc__ZN3aaa9GG1313212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313213  : ::aaa::EE131 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13132133fooEv
  virtual void  bar(); // _ZN3aaa9GG13132133barEv
  ~GG1313213(); // tgen
  GG1313213(); // tgen
};
//SIG(1 _ZN3aaa9GG1313213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13132133fooEv");}
void  aaa::GG1313213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13132133barEv");}
aaa::GG1313213 ::~GG1313213(){ note_dtor("_ZN3aaa9GG1313213E", this);} // tgen
aaa::GG1313213 ::GG1313213(){ note_ctor("_ZN3aaa9GG1313213E", this);} // tgen
}
static void Test__ZN3aaa9GG1313213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313213E, buf);
    ::aaa::GG1313213 *dp, &lv = *(dp=new (buf) ::aaa::GG1313213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313213E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1313213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1313213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1313213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313213E);
    dp->::aaa::GG1313213::~GG1313213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313213E(Test__ZN3aaa9GG1313213E, "_ZN3aaa9GG1313213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313213C1Ev();
extern void _ZN3aaa9GG1313213D1Ev();
Name_Map name_map__ZN3aaa9GG1313213E[] = {
  NSPAIR(_ZN3aaa9GG1313213C1Ev),
  NSPAIR(_ZN3aaa9GG1313213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1313213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313213E[];
extern void _ZN3aaa9GG13132133fooEv();
extern void _ZN3aaa9GG13132133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13132133fooEv,_ZThn8_N3aaa9GG13132133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13132133barEv,_ZThn8_N3aaa9GG13132133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13132133fooEv,_ZThn20_N3aaa9GG13132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13132133barEv,_ZThn20_N3aaa9GG13132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13132133barEv,_ZThn28_N3aaa9GG13132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13132133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13132133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132133fooEv,_ZThn8_N3aaa9GG13132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132133barEv,_ZThn8_N3aaa9GG13132133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132133fooEv,_ZThn20_N3aaa9GG13132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132133barEv,_ZThn20_N3aaa9GG13132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13132133barEv,_ZThn28_N3aaa9GG13132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313213E[];
Class_Descriptor cd__ZN3aaa9GG1313213E = {  "_ZN3aaa9GG1313213E", // class name
  bases__ZN3aaa9GG1313213E, 6,
  &(vtc__ZN3aaa9GG1313213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313221  : ::aaa::EE131 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13132213fooEv
  ~GG1313221(); // tgen
  GG1313221(); // tgen
};
//SIG(1 _ZN3aaa9GG1313221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13132213fooEv");}
aaa::GG1313221 ::~GG1313221(){ note_dtor("_ZN3aaa9GG1313221E", this);} // tgen
aaa::GG1313221 ::GG1313221(){ note_ctor("_ZN3aaa9GG1313221E", this);} // tgen
}
static void Test__ZN3aaa9GG1313221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313221E, buf);
    ::aaa::GG1313221 *dp, &lv = *(dp=new (buf) ::aaa::GG1313221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313221E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1313221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1313221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1313221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313221E);
    dp->::aaa::GG1313221::~GG1313221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313221E(Test__ZN3aaa9GG1313221E, "_ZN3aaa9GG1313221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313221C1Ev();
extern void _ZN3aaa9GG1313221D1Ev();
Name_Map name_map__ZN3aaa9GG1313221E[] = {
  NSPAIR(_ZN3aaa9GG1313221C1Ev),
  NSPAIR(_ZN3aaa9GG1313221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1313221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313221E[];
extern void _ZN3aaa9GG13132213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13132213fooEv,_ZThn8_N3aaa9GG13132213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13132213fooEv,_ZThn20_N3aaa9GG13132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13132213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132213fooEv,_ZThn8_N3aaa9GG13132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132213fooEv,_ZThn20_N3aaa9GG13132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313221E[];
Class_Descriptor cd__ZN3aaa9GG1313221E = {  "_ZN3aaa9GG1313221E", // class name
  bases__ZN3aaa9GG1313221E, 6,
  &(vtc__ZN3aaa9GG1313221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313222  : ::aaa::EE131 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13132223barEv
  ~GG1313222(); // tgen
  GG1313222(); // tgen
};
//SIG(1 _ZN3aaa9GG1313222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13132223barEv");}
aaa::GG1313222 ::~GG1313222(){ note_dtor("_ZN3aaa9GG1313222E", this);} // tgen
aaa::GG1313222 ::GG1313222(){ note_ctor("_ZN3aaa9GG1313222E", this);} // tgen
}
static void Test__ZN3aaa9GG1313222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313222E, buf);
    ::aaa::GG1313222 *dp, &lv = *(dp=new (buf) ::aaa::GG1313222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313222E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1313222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1313222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1313222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313222E);
    dp->::aaa::GG1313222::~GG1313222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313222E(Test__ZN3aaa9GG1313222E, "_ZN3aaa9GG1313222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313222C1Ev();
extern void _ZN3aaa9GG1313222D1Ev();
Name_Map name_map__ZN3aaa9GG1313222E[] = {
  NSPAIR(_ZN3aaa9GG1313222C1Ev),
  NSPAIR(_ZN3aaa9GG1313222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1313222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313222E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13132223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13132223barEv,_ZThn8_N3aaa9GG13132223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13132223barEv,_ZThn20_N3aaa9GG13132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13132223barEv,_ZThn28_N3aaa9GG13132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13132223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132223barEv,_ZThn8_N3aaa9GG13132223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132223barEv,_ZThn20_N3aaa9GG13132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13132223barEv,_ZThn28_N3aaa9GG13132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313222E[];
Class_Descriptor cd__ZN3aaa9GG1313222E = {  "_ZN3aaa9GG1313222E", // class name
  bases__ZN3aaa9GG1313222E, 6,
  &(vtc__ZN3aaa9GG1313222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313223  : ::aaa::EE131 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13132233fooEv
  virtual void  bar(); // _ZN3aaa9GG13132233barEv
  ~GG1313223(); // tgen
  GG1313223(); // tgen
};
//SIG(1 _ZN3aaa9GG1313223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13132233fooEv");}
void  aaa::GG1313223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13132233barEv");}
aaa::GG1313223 ::~GG1313223(){ note_dtor("_ZN3aaa9GG1313223E", this);} // tgen
aaa::GG1313223 ::GG1313223(){ note_ctor("_ZN3aaa9GG1313223E", this);} // tgen
}
static void Test__ZN3aaa9GG1313223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313223E, buf);
    ::aaa::GG1313223 *dp, &lv = *(dp=new (buf) ::aaa::GG1313223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313223E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1313223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1313223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1313223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313223E);
    dp->::aaa::GG1313223::~GG1313223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313223E(Test__ZN3aaa9GG1313223E, "_ZN3aaa9GG1313223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313223C1Ev();
extern void _ZN3aaa9GG1313223D1Ev();
Name_Map name_map__ZN3aaa9GG1313223E[] = {
  NSPAIR(_ZN3aaa9GG1313223C1Ev),
  NSPAIR(_ZN3aaa9GG1313223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1313223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313223E[];
extern void _ZN3aaa9GG13132233fooEv();
extern void _ZN3aaa9GG13132233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13132233fooEv,_ZThn8_N3aaa9GG13132233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13132233barEv,_ZThn8_N3aaa9GG13132233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13132233fooEv,_ZThn20_N3aaa9GG13132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13132233barEv,_ZThn20_N3aaa9GG13132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13132233barEv,_ZThn28_N3aaa9GG13132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13132233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13132233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132233fooEv,_ZThn8_N3aaa9GG13132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132233barEv,_ZThn8_N3aaa9GG13132233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132233fooEv,_ZThn20_N3aaa9GG13132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132233barEv,_ZThn20_N3aaa9GG13132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13132233barEv,_ZThn28_N3aaa9GG13132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313223E[];
Class_Descriptor cd__ZN3aaa9GG1313223E = {  "_ZN3aaa9GG1313223E", // class name
  bases__ZN3aaa9GG1313223E, 6,
  &(vtc__ZN3aaa9GG1313223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313231  : ::aaa::EE131 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13132313fooEv
  ~GG1313231(); // tgen
  GG1313231(); // tgen
};
//SIG(1 _ZN3aaa9GG1313231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13132313fooEv");}
aaa::GG1313231 ::~GG1313231(){ note_dtor("_ZN3aaa9GG1313231E", this);} // tgen
aaa::GG1313231 ::GG1313231(){ note_ctor("_ZN3aaa9GG1313231E", this);} // tgen
}
static void Test__ZN3aaa9GG1313231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313231E, buf);
    ::aaa::GG1313231 *dp, &lv = *(dp=new (buf) ::aaa::GG1313231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313231E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1313231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1313231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1313231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313231E);
    dp->::aaa::GG1313231::~GG1313231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313231E(Test__ZN3aaa9GG1313231E, "_ZN3aaa9GG1313231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313231C1Ev();
extern void _ZN3aaa9GG1313231D1Ev();
Name_Map name_map__ZN3aaa9GG1313231E[] = {
  NSPAIR(_ZN3aaa9GG1313231C1Ev),
  NSPAIR(_ZN3aaa9GG1313231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1313231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313231E[];
extern void _ZN3aaa9GG13132313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13132313fooEv,_ZThn8_N3aaa9GG13132313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13132313fooEv,_ZThn20_N3aaa9GG13132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13132313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132313fooEv,_ZThn8_N3aaa9GG13132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132313fooEv,_ZThn20_N3aaa9GG13132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313231E[];
Class_Descriptor cd__ZN3aaa9GG1313231E = {  "_ZN3aaa9GG1313231E", // class name
  bases__ZN3aaa9GG1313231E, 6,
  &(vtc__ZN3aaa9GG1313231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313232  : ::aaa::EE131 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13132323barEv
  ~GG1313232(); // tgen
  GG1313232(); // tgen
};
//SIG(1 _ZN3aaa9GG1313232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13132323barEv");}
aaa::GG1313232 ::~GG1313232(){ note_dtor("_ZN3aaa9GG1313232E", this);} // tgen
aaa::GG1313232 ::GG1313232(){ note_ctor("_ZN3aaa9GG1313232E", this);} // tgen
}
static void Test__ZN3aaa9GG1313232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313232E, buf);
    ::aaa::GG1313232 *dp, &lv = *(dp=new (buf) ::aaa::GG1313232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313232E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1313232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1313232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1313232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313232E);
    dp->::aaa::GG1313232::~GG1313232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313232E(Test__ZN3aaa9GG1313232E, "_ZN3aaa9GG1313232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313232C1Ev();
extern void _ZN3aaa9GG1313232D1Ev();
Name_Map name_map__ZN3aaa9GG1313232E[] = {
  NSPAIR(_ZN3aaa9GG1313232C1Ev),
  NSPAIR(_ZN3aaa9GG1313232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1313232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313232E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13132323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13132323barEv,_ZThn8_N3aaa9GG13132323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13132323barEv,_ZThn20_N3aaa9GG13132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13132323barEv,_ZThn28_N3aaa9GG13132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13132323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132323barEv,_ZThn8_N3aaa9GG13132323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132323barEv,_ZThn20_N3aaa9GG13132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13132323barEv,_ZThn28_N3aaa9GG13132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313232E[];
Class_Descriptor cd__ZN3aaa9GG1313232E = {  "_ZN3aaa9GG1313232E", // class name
  bases__ZN3aaa9GG1313232E, 6,
  &(vtc__ZN3aaa9GG1313232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313233  : ::aaa::EE131 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13132333fooEv
  virtual void  bar(); // _ZN3aaa9GG13132333barEv
  ~GG1313233(); // tgen
  GG1313233(); // tgen
};
//SIG(1 _ZN3aaa9GG1313233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13132333fooEv");}
void  aaa::GG1313233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13132333barEv");}
aaa::GG1313233 ::~GG1313233(){ note_dtor("_ZN3aaa9GG1313233E", this);} // tgen
aaa::GG1313233 ::GG1313233(){ note_ctor("_ZN3aaa9GG1313233E", this);} // tgen
}
static void Test__ZN3aaa9GG1313233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313233E, buf);
    ::aaa::GG1313233 *dp, &lv = *(dp=new (buf) ::aaa::GG1313233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313233E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1313233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1313233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1313233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313233E);
    dp->::aaa::GG1313233::~GG1313233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313233E(Test__ZN3aaa9GG1313233E, "_ZN3aaa9GG1313233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313233C1Ev();
extern void _ZN3aaa9GG1313233D1Ev();
Name_Map name_map__ZN3aaa9GG1313233E[] = {
  NSPAIR(_ZN3aaa9GG1313233C1Ev),
  NSPAIR(_ZN3aaa9GG1313233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1313233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313233E[];
extern void _ZN3aaa9GG13132333fooEv();
extern void _ZN3aaa9GG13132333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13132333fooEv,_ZThn8_N3aaa9GG13132333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13132333barEv,_ZThn8_N3aaa9GG13132333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13132333fooEv,_ZThn20_N3aaa9GG13132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13132333barEv,_ZThn20_N3aaa9GG13132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13132333barEv,_ZThn28_N3aaa9GG13132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13132333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13132333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132333fooEv,_ZThn8_N3aaa9GG13132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13132333barEv,_ZThn8_N3aaa9GG13132333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132333fooEv,_ZThn20_N3aaa9GG13132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13132333barEv,_ZThn20_N3aaa9GG13132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13132333barEv,_ZThn28_N3aaa9GG13132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313233E[];
Class_Descriptor cd__ZN3aaa9GG1313233E = {  "_ZN3aaa9GG1313233E", // class name
  bases__ZN3aaa9GG1313233E, 6,
  &(vtc__ZN3aaa9GG1313233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313311  : ::aaa::EE131 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13133113fooEv
  ~GG1313311(); // tgen
  GG1313311(); // tgen
};
//SIG(1 _ZN3aaa9GG1313311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13133113fooEv");}
aaa::GG1313311 ::~GG1313311(){ note_dtor("_ZN3aaa9GG1313311E", this);} // tgen
aaa::GG1313311 ::GG1313311(){ note_ctor("_ZN3aaa9GG1313311E", this);} // tgen
}
static void Test__ZN3aaa9GG1313311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313311E, buf);
    ::aaa::GG1313311 *dp, &lv = *(dp=new (buf) ::aaa::GG1313311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313311E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1313311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1313311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1313311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313311E);
    dp->::aaa::GG1313311::~GG1313311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313311E(Test__ZN3aaa9GG1313311E, "_ZN3aaa9GG1313311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313311C1Ev();
extern void _ZN3aaa9GG1313311D1Ev();
Name_Map name_map__ZN3aaa9GG1313311E[] = {
  NSPAIR(_ZN3aaa9GG1313311C1Ev),
  NSPAIR(_ZN3aaa9GG1313311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1313311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313311E[];
extern void _ZN3aaa9GG13133113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13133113fooEv,_ZThn8_N3aaa9GG13133113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13133113fooEv,_ZThn20_N3aaa9GG13133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13133113fooEv,_ZThn28_N3aaa9GG13133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13133113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133113fooEv,_ZThn8_N3aaa9GG13133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133113fooEv,_ZThn20_N3aaa9GG13133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133113fooEv,_ZThn28_N3aaa9GG13133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313311E[];
Class_Descriptor cd__ZN3aaa9GG1313311E = {  "_ZN3aaa9GG1313311E", // class name
  bases__ZN3aaa9GG1313311E, 6,
  &(vtc__ZN3aaa9GG1313311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313312  : ::aaa::EE131 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13133123barEv
  ~GG1313312(); // tgen
  GG1313312(); // tgen
};
//SIG(1 _ZN3aaa9GG1313312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13133123barEv");}
aaa::GG1313312 ::~GG1313312(){ note_dtor("_ZN3aaa9GG1313312E", this);} // tgen
aaa::GG1313312 ::GG1313312(){ note_ctor("_ZN3aaa9GG1313312E", this);} // tgen
}
static void Test__ZN3aaa9GG1313312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313312E, buf);
    ::aaa::GG1313312 *dp, &lv = *(dp=new (buf) ::aaa::GG1313312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313312E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1313312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1313312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1313312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313312E);
    dp->::aaa::GG1313312::~GG1313312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313312E(Test__ZN3aaa9GG1313312E, "_ZN3aaa9GG1313312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313312C1Ev();
extern void _ZN3aaa9GG1313312D1Ev();
Name_Map name_map__ZN3aaa9GG1313312E[] = {
  NSPAIR(_ZN3aaa9GG1313312C1Ev),
  NSPAIR(_ZN3aaa9GG1313312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1313312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313312E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13133123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13133123barEv,_ZThn8_N3aaa9GG13133123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13133123barEv,_ZThn20_N3aaa9GG13133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13133123barEv,_ZThn28_N3aaa9GG13133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13133123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133123barEv,_ZThn8_N3aaa9GG13133123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133123barEv,_ZThn20_N3aaa9GG13133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133123barEv,_ZThn28_N3aaa9GG13133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313312E[];
Class_Descriptor cd__ZN3aaa9GG1313312E = {  "_ZN3aaa9GG1313312E", // class name
  bases__ZN3aaa9GG1313312E, 6,
  &(vtc__ZN3aaa9GG1313312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313313  : ::aaa::EE131 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13133133fooEv
  virtual void  bar(); // _ZN3aaa9GG13133133barEv
  ~GG1313313(); // tgen
  GG1313313(); // tgen
};
//SIG(1 _ZN3aaa9GG1313313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13133133fooEv");}
void  aaa::GG1313313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13133133barEv");}
aaa::GG1313313 ::~GG1313313(){ note_dtor("_ZN3aaa9GG1313313E", this);} // tgen
aaa::GG1313313 ::GG1313313(){ note_ctor("_ZN3aaa9GG1313313E", this);} // tgen
}
static void Test__ZN3aaa9GG1313313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313313E, buf);
    ::aaa::GG1313313 *dp, &lv = *(dp=new (buf) ::aaa::GG1313313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313313E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1313313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1313313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1313313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313313E);
    dp->::aaa::GG1313313::~GG1313313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313313E(Test__ZN3aaa9GG1313313E, "_ZN3aaa9GG1313313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313313C1Ev();
extern void _ZN3aaa9GG1313313D1Ev();
Name_Map name_map__ZN3aaa9GG1313313E[] = {
  NSPAIR(_ZN3aaa9GG1313313C1Ev),
  NSPAIR(_ZN3aaa9GG1313313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1313313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313313E[];
extern void _ZN3aaa9GG13133133fooEv();
extern void _ZN3aaa9GG13133133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13133133fooEv,_ZThn8_N3aaa9GG13133133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13133133barEv,_ZThn8_N3aaa9GG13133133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13133133fooEv,_ZThn20_N3aaa9GG13133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13133133barEv,_ZThn20_N3aaa9GG13133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13133133fooEv,_ZThn28_N3aaa9GG13133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13133133barEv,_ZThn28_N3aaa9GG13133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13133133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13133133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133133fooEv,_ZThn8_N3aaa9GG13133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133133barEv,_ZThn8_N3aaa9GG13133133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133133fooEv,_ZThn20_N3aaa9GG13133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133133barEv,_ZThn20_N3aaa9GG13133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133133fooEv,_ZThn28_N3aaa9GG13133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133133barEv,_ZThn28_N3aaa9GG13133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313313E[];
Class_Descriptor cd__ZN3aaa9GG1313313E = {  "_ZN3aaa9GG1313313E", // class name
  bases__ZN3aaa9GG1313313E, 6,
  &(vtc__ZN3aaa9GG1313313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313321  : ::aaa::EE131 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13133213fooEv
  ~GG1313321(); // tgen
  GG1313321(); // tgen
};
//SIG(1 _ZN3aaa9GG1313321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13133213fooEv");}
aaa::GG1313321 ::~GG1313321(){ note_dtor("_ZN3aaa9GG1313321E", this);} // tgen
aaa::GG1313321 ::GG1313321(){ note_ctor("_ZN3aaa9GG1313321E", this);} // tgen
}
static void Test__ZN3aaa9GG1313321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313321E, buf);
    ::aaa::GG1313321 *dp, &lv = *(dp=new (buf) ::aaa::GG1313321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313321E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1313321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1313321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1313321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313321E);
    dp->::aaa::GG1313321::~GG1313321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313321E(Test__ZN3aaa9GG1313321E, "_ZN3aaa9GG1313321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313321C1Ev();
extern void _ZN3aaa9GG1313321D1Ev();
Name_Map name_map__ZN3aaa9GG1313321E[] = {
  NSPAIR(_ZN3aaa9GG1313321C1Ev),
  NSPAIR(_ZN3aaa9GG1313321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1313321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313321E[];
extern void _ZN3aaa9GG13133213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13133213fooEv,_ZThn8_N3aaa9GG13133213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13133213fooEv,_ZThn20_N3aaa9GG13133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13133213fooEv,_ZThn28_N3aaa9GG13133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13133213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133213fooEv,_ZThn8_N3aaa9GG13133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133213fooEv,_ZThn20_N3aaa9GG13133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133213fooEv,_ZThn28_N3aaa9GG13133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313321E[];
Class_Descriptor cd__ZN3aaa9GG1313321E = {  "_ZN3aaa9GG1313321E", // class name
  bases__ZN3aaa9GG1313321E, 6,
  &(vtc__ZN3aaa9GG1313321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313322  : ::aaa::EE131 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13133223barEv
  ~GG1313322(); // tgen
  GG1313322(); // tgen
};
//SIG(1 _ZN3aaa9GG1313322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13133223barEv");}
aaa::GG1313322 ::~GG1313322(){ note_dtor("_ZN3aaa9GG1313322E", this);} // tgen
aaa::GG1313322 ::GG1313322(){ note_ctor("_ZN3aaa9GG1313322E", this);} // tgen
}
static void Test__ZN3aaa9GG1313322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313322E, buf);
    ::aaa::GG1313322 *dp, &lv = *(dp=new (buf) ::aaa::GG1313322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313322E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1313322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1313322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1313322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313322E);
    dp->::aaa::GG1313322::~GG1313322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313322E(Test__ZN3aaa9GG1313322E, "_ZN3aaa9GG1313322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313322C1Ev();
extern void _ZN3aaa9GG1313322D1Ev();
Name_Map name_map__ZN3aaa9GG1313322E[] = {
  NSPAIR(_ZN3aaa9GG1313322C1Ev),
  NSPAIR(_ZN3aaa9GG1313322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1313322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313322E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13133223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13133223barEv,_ZThn8_N3aaa9GG13133223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13133223barEv,_ZThn20_N3aaa9GG13133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13133223barEv,_ZThn28_N3aaa9GG13133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13133223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133223barEv,_ZThn8_N3aaa9GG13133223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133223barEv,_ZThn20_N3aaa9GG13133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133223barEv,_ZThn28_N3aaa9GG13133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313322E[];
Class_Descriptor cd__ZN3aaa9GG1313322E = {  "_ZN3aaa9GG1313322E", // class name
  bases__ZN3aaa9GG1313322E, 6,
  &(vtc__ZN3aaa9GG1313322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313323  : ::aaa::EE131 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13133233fooEv
  virtual void  bar(); // _ZN3aaa9GG13133233barEv
  ~GG1313323(); // tgen
  GG1313323(); // tgen
};
//SIG(1 _ZN3aaa9GG1313323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13133233fooEv");}
void  aaa::GG1313323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13133233barEv");}
aaa::GG1313323 ::~GG1313323(){ note_dtor("_ZN3aaa9GG1313323E", this);} // tgen
aaa::GG1313323 ::GG1313323(){ note_ctor("_ZN3aaa9GG1313323E", this);} // tgen
}
static void Test__ZN3aaa9GG1313323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313323E, buf);
    ::aaa::GG1313323 *dp, &lv = *(dp=new (buf) ::aaa::GG1313323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313323E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1313323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1313323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1313323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313323E);
    dp->::aaa::GG1313323::~GG1313323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313323E(Test__ZN3aaa9GG1313323E, "_ZN3aaa9GG1313323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313323C1Ev();
extern void _ZN3aaa9GG1313323D1Ev();
Name_Map name_map__ZN3aaa9GG1313323E[] = {
  NSPAIR(_ZN3aaa9GG1313323C1Ev),
  NSPAIR(_ZN3aaa9GG1313323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1313323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313323E[];
extern void _ZN3aaa9GG13133233fooEv();
extern void _ZN3aaa9GG13133233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13133233fooEv,_ZThn8_N3aaa9GG13133233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13133233barEv,_ZThn8_N3aaa9GG13133233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13133233fooEv,_ZThn20_N3aaa9GG13133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13133233barEv,_ZThn20_N3aaa9GG13133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13133233fooEv,_ZThn28_N3aaa9GG13133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13133233barEv,_ZThn28_N3aaa9GG13133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13133233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13133233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133233fooEv,_ZThn8_N3aaa9GG13133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133233barEv,_ZThn8_N3aaa9GG13133233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133233fooEv,_ZThn20_N3aaa9GG13133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133233barEv,_ZThn20_N3aaa9GG13133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133233fooEv,_ZThn28_N3aaa9GG13133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133233barEv,_ZThn28_N3aaa9GG13133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313323E[];
Class_Descriptor cd__ZN3aaa9GG1313323E = {  "_ZN3aaa9GG1313323E", // class name
  bases__ZN3aaa9GG1313323E, 6,
  &(vtc__ZN3aaa9GG1313323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313331  : ::aaa::EE131 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13133313fooEv
  ~GG1313331(); // tgen
  GG1313331(); // tgen
};
//SIG(1 _ZN3aaa9GG1313331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13133313fooEv");}
aaa::GG1313331 ::~GG1313331(){ note_dtor("_ZN3aaa9GG1313331E", this);} // tgen
aaa::GG1313331 ::GG1313331(){ note_ctor("_ZN3aaa9GG1313331E", this);} // tgen
}
static void Test__ZN3aaa9GG1313331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313331E, buf);
    ::aaa::GG1313331 *dp, &lv = *(dp=new (buf) ::aaa::GG1313331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313331E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1313331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1313331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1313331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313331E);
    dp->::aaa::GG1313331::~GG1313331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313331E(Test__ZN3aaa9GG1313331E, "_ZN3aaa9GG1313331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313331C1Ev();
extern void _ZN3aaa9GG1313331D1Ev();
Name_Map name_map__ZN3aaa9GG1313331E[] = {
  NSPAIR(_ZN3aaa9GG1313331C1Ev),
  NSPAIR(_ZN3aaa9GG1313331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1313331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313331E[];
extern void _ZN3aaa9GG13133313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13133313fooEv,_ZThn8_N3aaa9GG13133313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13133313fooEv,_ZThn20_N3aaa9GG13133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13133313fooEv,_ZThn28_N3aaa9GG13133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13133313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133313fooEv,_ZThn8_N3aaa9GG13133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133313fooEv,_ZThn20_N3aaa9GG13133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133313fooEv,_ZThn28_N3aaa9GG13133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313331E[];
Class_Descriptor cd__ZN3aaa9GG1313331E = {  "_ZN3aaa9GG1313331E", // class name
  bases__ZN3aaa9GG1313331E, 6,
  &(vtc__ZN3aaa9GG1313331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313332  : ::aaa::EE131 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13133323barEv
  ~GG1313332(); // tgen
  GG1313332(); // tgen
};
//SIG(1 _ZN3aaa9GG1313332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1313332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13133323barEv");}
aaa::GG1313332 ::~GG1313332(){ note_dtor("_ZN3aaa9GG1313332E", this);} // tgen
aaa::GG1313332 ::GG1313332(){ note_ctor("_ZN3aaa9GG1313332E", this);} // tgen
}
static void Test__ZN3aaa9GG1313332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313332E, buf);
    ::aaa::GG1313332 *dp, &lv = *(dp=new (buf) ::aaa::GG1313332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313332E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1313332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1313332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1313332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313332E);
    dp->::aaa::GG1313332::~GG1313332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313332E(Test__ZN3aaa9GG1313332E, "_ZN3aaa9GG1313332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313332C1Ev();
extern void _ZN3aaa9GG1313332D1Ev();
Name_Map name_map__ZN3aaa9GG1313332E[] = {
  NSPAIR(_ZN3aaa9GG1313332C1Ev),
  NSPAIR(_ZN3aaa9GG1313332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1313332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313332E[];
extern void _ZN3aaa5EE1313fooEv();
extern void _ZN3aaa9GG13133323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13133323barEv,_ZThn8_N3aaa9GG13133323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13133323barEv,_ZThn20_N3aaa9GG13133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13133323barEv,_ZThn28_N3aaa9GG13133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13133323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1313fooEv,_ZThn8_N3aaa5EE1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133323barEv,_ZThn8_N3aaa9GG13133323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133323barEv,_ZThn20_N3aaa9GG13133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133323barEv,_ZThn28_N3aaa9GG13133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313332E[];
Class_Descriptor cd__ZN3aaa9GG1313332E = {  "_ZN3aaa9GG1313332E", // class name
  bases__ZN3aaa9GG1313332E, 6,
  &(vtc__ZN3aaa9GG1313332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1313333  : ::aaa::EE131 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13133333fooEv
  virtual void  bar(); // _ZN3aaa9GG13133333barEv
  ~GG1313333(); // tgen
  GG1313333(); // tgen
};
//SIG(1 _ZN3aaa9GG1313333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1313333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13133333fooEv");}
void  aaa::GG1313333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13133333barEv");}
aaa::GG1313333 ::~GG1313333(){ note_dtor("_ZN3aaa9GG1313333E", this);} // tgen
aaa::GG1313333 ::GG1313333(){ note_ctor("_ZN3aaa9GG1313333E", this);} // tgen
}
static void Test__ZN3aaa9GG1313333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1313333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1313333E, buf);
    ::aaa::GG1313333 *dp, &lv = *(dp=new (buf) ::aaa::GG1313333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1313333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1313333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE131*), 0, "_ZN3aaa9GG1313333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE131*), ABISELECT(16,8), "_ZN3aaa9GG1313333E");
    check_base_class_offset(lv, (::aaa::EE131*), 0, "_ZN3aaa9GG1313333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1313333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1313333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1313333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1313333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1313333E);
    dp->::aaa::GG1313333::~GG1313333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1313333E(Test__ZN3aaa9GG1313333E, "_ZN3aaa9GG1313333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1313333C1Ev();
extern void _ZN3aaa9GG1313333D1Ev();
Name_Map name_map__ZN3aaa9GG1313333E[] = {
  NSPAIR(_ZN3aaa9GG1313333C1Ev),
  NSPAIR(_ZN3aaa9GG1313333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE131E;
extern VTBL_ENTRY _ZTIN3aaa5EE131E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE131E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1313333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE131E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1313333E[];
extern void _ZN3aaa9GG13133333fooEv();
extern void _ZN3aaa9GG13133333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13133333fooEv,_ZThn8_N3aaa9GG13133333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13133333barEv,_ZThn8_N3aaa9GG13133333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13133333fooEv,_ZThn20_N3aaa9GG13133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13133333barEv,_ZThn20_N3aaa9GG13133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13133333fooEv,_ZThn28_N3aaa9GG13133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13133333barEv,_ZThn28_N3aaa9GG13133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1313333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13133333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13133333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133333fooEv,_ZThn8_N3aaa9GG13133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13133333barEv,_ZThn8_N3aaa9GG13133333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133333fooEv,_ZThn20_N3aaa9GG13133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13133333barEv,_ZThn20_N3aaa9GG13133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133333fooEv,_ZThn28_N3aaa9GG13133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13133333barEv,_ZThn28_N3aaa9GG13133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1313333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1313333E[];
Class_Descriptor cd__ZN3aaa9GG1313333E = {  "_ZN3aaa9GG1313333E", // class name
  bases__ZN3aaa9GG1313333E, 6,
  &(vtc__ZN3aaa9GG1313333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1313333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1313333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321111  : ::aaa::EE132 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13211113fooEv
  ~GG1321111(); // tgen
  GG1321111(); // tgen
};
//SIG(1 _ZN3aaa9GG1321111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13211113fooEv");}
aaa::GG1321111 ::~GG1321111(){ note_dtor("_ZN3aaa9GG1321111E", this);} // tgen
aaa::GG1321111 ::GG1321111(){ note_ctor("_ZN3aaa9GG1321111E", this);} // tgen
}
static void Test__ZN3aaa9GG1321111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321111E, buf);
    ::aaa::GG1321111 *dp, &lv = *(dp=new (buf) ::aaa::GG1321111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321111E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1321111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1321111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1321111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321111E);
    dp->::aaa::GG1321111::~GG1321111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321111E(Test__ZN3aaa9GG1321111E, "_ZN3aaa9GG1321111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321111C1Ev();
extern void _ZN3aaa9GG1321111D1Ev();
Name_Map name_map__ZN3aaa9GG1321111E[] = {
  NSPAIR(_ZN3aaa9GG1321111C1Ev),
  NSPAIR(_ZN3aaa9GG1321111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1321111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321111E[];
extern void _ZN3aaa9GG13211113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211113fooEv,_ZThn8_N3aaa9GG13211113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13211113fooEv,_ZThn20_N3aaa9GG13211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13211113fooEv,_ZThn28_N3aaa9GG13211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13211113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211113fooEv,_ZThn8_N3aaa9GG13211113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211113fooEv,_ZThn20_N3aaa9GG13211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13211113fooEv,_ZThn28_N3aaa9GG13211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321111E[];
Class_Descriptor cd__ZN3aaa9GG1321111E = {  "_ZN3aaa9GG1321111E", // class name
  bases__ZN3aaa9GG1321111E, 6,
  &(vtc__ZN3aaa9GG1321111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321112  : ::aaa::EE132 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13211123barEv
  ~GG1321112(); // tgen
  GG1321112(); // tgen
};
//SIG(1 _ZN3aaa9GG1321112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13211123barEv");}
aaa::GG1321112 ::~GG1321112(){ note_dtor("_ZN3aaa9GG1321112E", this);} // tgen
aaa::GG1321112 ::GG1321112(){ note_ctor("_ZN3aaa9GG1321112E", this);} // tgen
}
static void Test__ZN3aaa9GG1321112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321112E, buf);
    ::aaa::GG1321112 *dp, &lv = *(dp=new (buf) ::aaa::GG1321112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321112E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1321112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1321112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1321112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321112E);
    dp->::aaa::GG1321112::~GG1321112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321112E(Test__ZN3aaa9GG1321112E, "_ZN3aaa9GG1321112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321112C1Ev();
extern void _ZN3aaa9GG1321112D1Ev();
Name_Map name_map__ZN3aaa9GG1321112E[] = {
  NSPAIR(_ZN3aaa9GG1321112C1Ev),
  NSPAIR(_ZN3aaa9GG1321112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1321112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13211123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211123barEv,_ZThn8_N3aaa9GG13211123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211123barEv,_ZThn8_N3aaa9GG13211123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321112E[];
Class_Descriptor cd__ZN3aaa9GG1321112E = {  "_ZN3aaa9GG1321112E", // class name
  bases__ZN3aaa9GG1321112E, 6,
  &(vtc__ZN3aaa9GG1321112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321113  : ::aaa::EE132 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13211133fooEv
  virtual void  bar(); // _ZN3aaa9GG13211133barEv
  ~GG1321113(); // tgen
  GG1321113(); // tgen
};
//SIG(1 _ZN3aaa9GG1321113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13211133fooEv");}
void  aaa::GG1321113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13211133barEv");}
aaa::GG1321113 ::~GG1321113(){ note_dtor("_ZN3aaa9GG1321113E", this);} // tgen
aaa::GG1321113 ::GG1321113(){ note_ctor("_ZN3aaa9GG1321113E", this);} // tgen
}
static void Test__ZN3aaa9GG1321113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321113E, buf);
    ::aaa::GG1321113 *dp, &lv = *(dp=new (buf) ::aaa::GG1321113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321113E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1321113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1321113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1321113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321113E);
    dp->::aaa::GG1321113::~GG1321113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321113E(Test__ZN3aaa9GG1321113E, "_ZN3aaa9GG1321113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321113C1Ev();
extern void _ZN3aaa9GG1321113D1Ev();
Name_Map name_map__ZN3aaa9GG1321113E[] = {
  NSPAIR(_ZN3aaa9GG1321113C1Ev),
  NSPAIR(_ZN3aaa9GG1321113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1321113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321113E[];
extern void _ZN3aaa9GG13211133fooEv();
extern void _ZN3aaa9GG13211133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211133fooEv,_ZThn8_N3aaa9GG13211133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13211133barEv,_ZThn8_N3aaa9GG13211133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13211133fooEv,_ZThn20_N3aaa9GG13211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13211133fooEv,_ZThn28_N3aaa9GG13211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13211133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13211133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211133fooEv,_ZThn8_N3aaa9GG13211133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211133barEv,_ZThn8_N3aaa9GG13211133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211133fooEv,_ZThn20_N3aaa9GG13211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13211133fooEv,_ZThn28_N3aaa9GG13211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321113E[];
Class_Descriptor cd__ZN3aaa9GG1321113E = {  "_ZN3aaa9GG1321113E", // class name
  bases__ZN3aaa9GG1321113E, 6,
  &(vtc__ZN3aaa9GG1321113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321121  : ::aaa::EE132 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13211213fooEv
  ~GG1321121(); // tgen
  GG1321121(); // tgen
};
//SIG(1 _ZN3aaa9GG1321121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13211213fooEv");}
aaa::GG1321121 ::~GG1321121(){ note_dtor("_ZN3aaa9GG1321121E", this);} // tgen
aaa::GG1321121 ::GG1321121(){ note_ctor("_ZN3aaa9GG1321121E", this);} // tgen
}
static void Test__ZN3aaa9GG1321121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321121E, buf);
    ::aaa::GG1321121 *dp, &lv = *(dp=new (buf) ::aaa::GG1321121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321121E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1321121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1321121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1321121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321121E);
    dp->::aaa::GG1321121::~GG1321121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321121E(Test__ZN3aaa9GG1321121E, "_ZN3aaa9GG1321121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321121C1Ev();
extern void _ZN3aaa9GG1321121D1Ev();
Name_Map name_map__ZN3aaa9GG1321121E[] = {
  NSPAIR(_ZN3aaa9GG1321121C1Ev),
  NSPAIR(_ZN3aaa9GG1321121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1321121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321121E[];
extern void _ZN3aaa9GG13211213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211213fooEv,_ZThn8_N3aaa9GG13211213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13211213fooEv,_ZThn20_N3aaa9GG13211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13211213fooEv,_ZThn28_N3aaa9GG13211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13211213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211213fooEv,_ZThn8_N3aaa9GG13211213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211213fooEv,_ZThn20_N3aaa9GG13211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13211213fooEv,_ZThn28_N3aaa9GG13211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321121E[];
Class_Descriptor cd__ZN3aaa9GG1321121E = {  "_ZN3aaa9GG1321121E", // class name
  bases__ZN3aaa9GG1321121E, 6,
  &(vtc__ZN3aaa9GG1321121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321122  : ::aaa::EE132 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13211223barEv
  ~GG1321122(); // tgen
  GG1321122(); // tgen
};
//SIG(1 _ZN3aaa9GG1321122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13211223barEv");}
aaa::GG1321122 ::~GG1321122(){ note_dtor("_ZN3aaa9GG1321122E", this);} // tgen
aaa::GG1321122 ::GG1321122(){ note_ctor("_ZN3aaa9GG1321122E", this);} // tgen
}
static void Test__ZN3aaa9GG1321122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321122E, buf);
    ::aaa::GG1321122 *dp, &lv = *(dp=new (buf) ::aaa::GG1321122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321122E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1321122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1321122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1321122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321122E);
    dp->::aaa::GG1321122::~GG1321122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321122E(Test__ZN3aaa9GG1321122E, "_ZN3aaa9GG1321122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321122C1Ev();
extern void _ZN3aaa9GG1321122D1Ev();
Name_Map name_map__ZN3aaa9GG1321122E[] = {
  NSPAIR(_ZN3aaa9GG1321122C1Ev),
  NSPAIR(_ZN3aaa9GG1321122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1321122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13211223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211223barEv,_ZThn8_N3aaa9GG13211223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13211223barEv,_ZThn20_N3aaa9GG13211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211223barEv,_ZThn8_N3aaa9GG13211223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211223barEv,_ZThn20_N3aaa9GG13211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321122E[];
Class_Descriptor cd__ZN3aaa9GG1321122E = {  "_ZN3aaa9GG1321122E", // class name
  bases__ZN3aaa9GG1321122E, 6,
  &(vtc__ZN3aaa9GG1321122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321123  : ::aaa::EE132 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13211233fooEv
  virtual void  bar(); // _ZN3aaa9GG13211233barEv
  ~GG1321123(); // tgen
  GG1321123(); // tgen
};
//SIG(1 _ZN3aaa9GG1321123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13211233fooEv");}
void  aaa::GG1321123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13211233barEv");}
aaa::GG1321123 ::~GG1321123(){ note_dtor("_ZN3aaa9GG1321123E", this);} // tgen
aaa::GG1321123 ::GG1321123(){ note_ctor("_ZN3aaa9GG1321123E", this);} // tgen
}
static void Test__ZN3aaa9GG1321123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321123E, buf);
    ::aaa::GG1321123 *dp, &lv = *(dp=new (buf) ::aaa::GG1321123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321123E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1321123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1321123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1321123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321123E);
    dp->::aaa::GG1321123::~GG1321123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321123E(Test__ZN3aaa9GG1321123E, "_ZN3aaa9GG1321123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321123C1Ev();
extern void _ZN3aaa9GG1321123D1Ev();
Name_Map name_map__ZN3aaa9GG1321123E[] = {
  NSPAIR(_ZN3aaa9GG1321123C1Ev),
  NSPAIR(_ZN3aaa9GG1321123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1321123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321123E[];
extern void _ZN3aaa9GG13211233fooEv();
extern void _ZN3aaa9GG13211233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211233fooEv,_ZThn8_N3aaa9GG13211233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13211233barEv,_ZThn8_N3aaa9GG13211233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13211233fooEv,_ZThn20_N3aaa9GG13211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13211233barEv,_ZThn20_N3aaa9GG13211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13211233fooEv,_ZThn28_N3aaa9GG13211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13211233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13211233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211233fooEv,_ZThn8_N3aaa9GG13211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211233barEv,_ZThn8_N3aaa9GG13211233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211233fooEv,_ZThn20_N3aaa9GG13211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211233barEv,_ZThn20_N3aaa9GG13211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13211233fooEv,_ZThn28_N3aaa9GG13211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321123E[];
Class_Descriptor cd__ZN3aaa9GG1321123E = {  "_ZN3aaa9GG1321123E", // class name
  bases__ZN3aaa9GG1321123E, 6,
  &(vtc__ZN3aaa9GG1321123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321131  : ::aaa::EE132 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13211313fooEv
  ~GG1321131(); // tgen
  GG1321131(); // tgen
};
//SIG(1 _ZN3aaa9GG1321131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13211313fooEv");}
aaa::GG1321131 ::~GG1321131(){ note_dtor("_ZN3aaa9GG1321131E", this);} // tgen
aaa::GG1321131 ::GG1321131(){ note_ctor("_ZN3aaa9GG1321131E", this);} // tgen
}
static void Test__ZN3aaa9GG1321131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321131E, buf);
    ::aaa::GG1321131 *dp, &lv = *(dp=new (buf) ::aaa::GG1321131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321131E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1321131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1321131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1321131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321131E);
    dp->::aaa::GG1321131::~GG1321131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321131E(Test__ZN3aaa9GG1321131E, "_ZN3aaa9GG1321131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321131C1Ev();
extern void _ZN3aaa9GG1321131D1Ev();
Name_Map name_map__ZN3aaa9GG1321131E[] = {
  NSPAIR(_ZN3aaa9GG1321131C1Ev),
  NSPAIR(_ZN3aaa9GG1321131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1321131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321131E[];
extern void _ZN3aaa9GG13211313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211313fooEv,_ZThn8_N3aaa9GG13211313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13211313fooEv,_ZThn20_N3aaa9GG13211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13211313fooEv,_ZThn28_N3aaa9GG13211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13211313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211313fooEv,_ZThn8_N3aaa9GG13211313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211313fooEv,_ZThn20_N3aaa9GG13211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13211313fooEv,_ZThn28_N3aaa9GG13211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321131E[];
Class_Descriptor cd__ZN3aaa9GG1321131E = {  "_ZN3aaa9GG1321131E", // class name
  bases__ZN3aaa9GG1321131E, 6,
  &(vtc__ZN3aaa9GG1321131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321132  : ::aaa::EE132 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13211323barEv
  ~GG1321132(); // tgen
  GG1321132(); // tgen
};
//SIG(1 _ZN3aaa9GG1321132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13211323barEv");}
aaa::GG1321132 ::~GG1321132(){ note_dtor("_ZN3aaa9GG1321132E", this);} // tgen
aaa::GG1321132 ::GG1321132(){ note_ctor("_ZN3aaa9GG1321132E", this);} // tgen
}
static void Test__ZN3aaa9GG1321132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321132E, buf);
    ::aaa::GG1321132 *dp, &lv = *(dp=new (buf) ::aaa::GG1321132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321132E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1321132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1321132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1321132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321132E);
    dp->::aaa::GG1321132::~GG1321132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321132E(Test__ZN3aaa9GG1321132E, "_ZN3aaa9GG1321132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321132C1Ev();
extern void _ZN3aaa9GG1321132D1Ev();
Name_Map name_map__ZN3aaa9GG1321132E[] = {
  NSPAIR(_ZN3aaa9GG1321132C1Ev),
  NSPAIR(_ZN3aaa9GG1321132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1321132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13211323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211323barEv,_ZThn8_N3aaa9GG13211323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13211323barEv,_ZThn20_N3aaa9GG13211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211323barEv,_ZThn8_N3aaa9GG13211323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211323barEv,_ZThn20_N3aaa9GG13211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321132E[];
Class_Descriptor cd__ZN3aaa9GG1321132E = {  "_ZN3aaa9GG1321132E", // class name
  bases__ZN3aaa9GG1321132E, 6,
  &(vtc__ZN3aaa9GG1321132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321133  : ::aaa::EE132 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13211333fooEv
  virtual void  bar(); // _ZN3aaa9GG13211333barEv
  ~GG1321133(); // tgen
  GG1321133(); // tgen
};
//SIG(1 _ZN3aaa9GG1321133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13211333fooEv");}
void  aaa::GG1321133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13211333barEv");}
aaa::GG1321133 ::~GG1321133(){ note_dtor("_ZN3aaa9GG1321133E", this);} // tgen
aaa::GG1321133 ::GG1321133(){ note_ctor("_ZN3aaa9GG1321133E", this);} // tgen
}
static void Test__ZN3aaa9GG1321133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321133E, buf);
    ::aaa::GG1321133 *dp, &lv = *(dp=new (buf) ::aaa::GG1321133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321133E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1321133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1321133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1321133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321133E);
    dp->::aaa::GG1321133::~GG1321133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321133E(Test__ZN3aaa9GG1321133E, "_ZN3aaa9GG1321133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321133C1Ev();
extern void _ZN3aaa9GG1321133D1Ev();
Name_Map name_map__ZN3aaa9GG1321133E[] = {
  NSPAIR(_ZN3aaa9GG1321133C1Ev),
  NSPAIR(_ZN3aaa9GG1321133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1321133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321133E[];
extern void _ZN3aaa9GG13211333fooEv();
extern void _ZN3aaa9GG13211333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13211333fooEv,_ZThn8_N3aaa9GG13211333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13211333barEv,_ZThn8_N3aaa9GG13211333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13211333fooEv,_ZThn20_N3aaa9GG13211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13211333barEv,_ZThn20_N3aaa9GG13211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13211333fooEv,_ZThn28_N3aaa9GG13211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13211333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13211333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211333fooEv,_ZThn8_N3aaa9GG13211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13211333barEv,_ZThn8_N3aaa9GG13211333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211333fooEv,_ZThn20_N3aaa9GG13211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13211333barEv,_ZThn20_N3aaa9GG13211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13211333fooEv,_ZThn28_N3aaa9GG13211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321133E[];
Class_Descriptor cd__ZN3aaa9GG1321133E = {  "_ZN3aaa9GG1321133E", // class name
  bases__ZN3aaa9GG1321133E, 6,
  &(vtc__ZN3aaa9GG1321133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321211  : ::aaa::EE132 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13212113fooEv
  ~GG1321211(); // tgen
  GG1321211(); // tgen
};
//SIG(1 _ZN3aaa9GG1321211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13212113fooEv");}
aaa::GG1321211 ::~GG1321211(){ note_dtor("_ZN3aaa9GG1321211E", this);} // tgen
aaa::GG1321211 ::GG1321211(){ note_ctor("_ZN3aaa9GG1321211E", this);} // tgen
}
static void Test__ZN3aaa9GG1321211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321211E, buf);
    ::aaa::GG1321211 *dp, &lv = *(dp=new (buf) ::aaa::GG1321211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321211E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1321211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1321211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1321211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321211E);
    dp->::aaa::GG1321211::~GG1321211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321211E(Test__ZN3aaa9GG1321211E, "_ZN3aaa9GG1321211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321211C1Ev();
extern void _ZN3aaa9GG1321211D1Ev();
Name_Map name_map__ZN3aaa9GG1321211E[] = {
  NSPAIR(_ZN3aaa9GG1321211C1Ev),
  NSPAIR(_ZN3aaa9GG1321211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1321211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321211E[];
extern void _ZN3aaa9GG13212113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212113fooEv,_ZThn8_N3aaa9GG13212113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13212113fooEv,_ZThn20_N3aaa9GG13212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13212113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212113fooEv,_ZThn8_N3aaa9GG13212113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212113fooEv,_ZThn20_N3aaa9GG13212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321211E[];
Class_Descriptor cd__ZN3aaa9GG1321211E = {  "_ZN3aaa9GG1321211E", // class name
  bases__ZN3aaa9GG1321211E, 6,
  &(vtc__ZN3aaa9GG1321211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321212  : ::aaa::EE132 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13212123barEv
  ~GG1321212(); // tgen
  GG1321212(); // tgen
};
//SIG(1 _ZN3aaa9GG1321212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13212123barEv");}
aaa::GG1321212 ::~GG1321212(){ note_dtor("_ZN3aaa9GG1321212E", this);} // tgen
aaa::GG1321212 ::GG1321212(){ note_ctor("_ZN3aaa9GG1321212E", this);} // tgen
}
static void Test__ZN3aaa9GG1321212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321212E, buf);
    ::aaa::GG1321212 *dp, &lv = *(dp=new (buf) ::aaa::GG1321212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321212E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1321212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1321212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1321212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321212E);
    dp->::aaa::GG1321212::~GG1321212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321212E(Test__ZN3aaa9GG1321212E, "_ZN3aaa9GG1321212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321212C1Ev();
extern void _ZN3aaa9GG1321212D1Ev();
Name_Map name_map__ZN3aaa9GG1321212E[] = {
  NSPAIR(_ZN3aaa9GG1321212C1Ev),
  NSPAIR(_ZN3aaa9GG1321212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1321212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13212123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212123barEv,_ZThn8_N3aaa9GG13212123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13212123barEv,_ZThn28_N3aaa9GG13212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212123barEv,_ZThn8_N3aaa9GG13212123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13212123barEv,_ZThn28_N3aaa9GG13212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321212E[];
Class_Descriptor cd__ZN3aaa9GG1321212E = {  "_ZN3aaa9GG1321212E", // class name
  bases__ZN3aaa9GG1321212E, 6,
  &(vtc__ZN3aaa9GG1321212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321213  : ::aaa::EE132 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13212133fooEv
  virtual void  bar(); // _ZN3aaa9GG13212133barEv
  ~GG1321213(); // tgen
  GG1321213(); // tgen
};
//SIG(1 _ZN3aaa9GG1321213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13212133fooEv");}
void  aaa::GG1321213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13212133barEv");}
aaa::GG1321213 ::~GG1321213(){ note_dtor("_ZN3aaa9GG1321213E", this);} // tgen
aaa::GG1321213 ::GG1321213(){ note_ctor("_ZN3aaa9GG1321213E", this);} // tgen
}
static void Test__ZN3aaa9GG1321213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321213E, buf);
    ::aaa::GG1321213 *dp, &lv = *(dp=new (buf) ::aaa::GG1321213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321213E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1321213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1321213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1321213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321213E);
    dp->::aaa::GG1321213::~GG1321213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321213E(Test__ZN3aaa9GG1321213E, "_ZN3aaa9GG1321213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321213C1Ev();
extern void _ZN3aaa9GG1321213D1Ev();
Name_Map name_map__ZN3aaa9GG1321213E[] = {
  NSPAIR(_ZN3aaa9GG1321213C1Ev),
  NSPAIR(_ZN3aaa9GG1321213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1321213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321213E[];
extern void _ZN3aaa9GG13212133fooEv();
extern void _ZN3aaa9GG13212133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212133fooEv,_ZThn8_N3aaa9GG13212133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13212133barEv,_ZThn8_N3aaa9GG13212133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13212133fooEv,_ZThn20_N3aaa9GG13212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13212133barEv,_ZThn28_N3aaa9GG13212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13212133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13212133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212133fooEv,_ZThn8_N3aaa9GG13212133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212133barEv,_ZThn8_N3aaa9GG13212133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212133fooEv,_ZThn20_N3aaa9GG13212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13212133barEv,_ZThn28_N3aaa9GG13212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321213E[];
Class_Descriptor cd__ZN3aaa9GG1321213E = {  "_ZN3aaa9GG1321213E", // class name
  bases__ZN3aaa9GG1321213E, 6,
  &(vtc__ZN3aaa9GG1321213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321221  : ::aaa::EE132 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13212213fooEv
  ~GG1321221(); // tgen
  GG1321221(); // tgen
};
//SIG(1 _ZN3aaa9GG1321221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13212213fooEv");}
aaa::GG1321221 ::~GG1321221(){ note_dtor("_ZN3aaa9GG1321221E", this);} // tgen
aaa::GG1321221 ::GG1321221(){ note_ctor("_ZN3aaa9GG1321221E", this);} // tgen
}
static void Test__ZN3aaa9GG1321221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321221E, buf);
    ::aaa::GG1321221 *dp, &lv = *(dp=new (buf) ::aaa::GG1321221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321221E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1321221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1321221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1321221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321221E);
    dp->::aaa::GG1321221::~GG1321221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321221E(Test__ZN3aaa9GG1321221E, "_ZN3aaa9GG1321221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321221C1Ev();
extern void _ZN3aaa9GG1321221D1Ev();
Name_Map name_map__ZN3aaa9GG1321221E[] = {
  NSPAIR(_ZN3aaa9GG1321221C1Ev),
  NSPAIR(_ZN3aaa9GG1321221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1321221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321221E[];
extern void _ZN3aaa9GG13212213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212213fooEv,_ZThn8_N3aaa9GG13212213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13212213fooEv,_ZThn20_N3aaa9GG13212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13212213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212213fooEv,_ZThn8_N3aaa9GG13212213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212213fooEv,_ZThn20_N3aaa9GG13212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321221E[];
Class_Descriptor cd__ZN3aaa9GG1321221E = {  "_ZN3aaa9GG1321221E", // class name
  bases__ZN3aaa9GG1321221E, 6,
  &(vtc__ZN3aaa9GG1321221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321222  : ::aaa::EE132 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13212223barEv
  ~GG1321222(); // tgen
  GG1321222(); // tgen
};
//SIG(1 _ZN3aaa9GG1321222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13212223barEv");}
aaa::GG1321222 ::~GG1321222(){ note_dtor("_ZN3aaa9GG1321222E", this);} // tgen
aaa::GG1321222 ::GG1321222(){ note_ctor("_ZN3aaa9GG1321222E", this);} // tgen
}
static void Test__ZN3aaa9GG1321222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321222E, buf);
    ::aaa::GG1321222 *dp, &lv = *(dp=new (buf) ::aaa::GG1321222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321222E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1321222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1321222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1321222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321222E);
    dp->::aaa::GG1321222::~GG1321222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321222E(Test__ZN3aaa9GG1321222E, "_ZN3aaa9GG1321222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321222C1Ev();
extern void _ZN3aaa9GG1321222D1Ev();
Name_Map name_map__ZN3aaa9GG1321222E[] = {
  NSPAIR(_ZN3aaa9GG1321222C1Ev),
  NSPAIR(_ZN3aaa9GG1321222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1321222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13212223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212223barEv,_ZThn8_N3aaa9GG13212223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13212223barEv,_ZThn20_N3aaa9GG13212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13212223barEv,_ZThn28_N3aaa9GG13212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212223barEv,_ZThn8_N3aaa9GG13212223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212223barEv,_ZThn20_N3aaa9GG13212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13212223barEv,_ZThn28_N3aaa9GG13212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321222E[];
Class_Descriptor cd__ZN3aaa9GG1321222E = {  "_ZN3aaa9GG1321222E", // class name
  bases__ZN3aaa9GG1321222E, 6,
  &(vtc__ZN3aaa9GG1321222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321223  : ::aaa::EE132 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13212233fooEv
  virtual void  bar(); // _ZN3aaa9GG13212233barEv
  ~GG1321223(); // tgen
  GG1321223(); // tgen
};
//SIG(1 _ZN3aaa9GG1321223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13212233fooEv");}
void  aaa::GG1321223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13212233barEv");}
aaa::GG1321223 ::~GG1321223(){ note_dtor("_ZN3aaa9GG1321223E", this);} // tgen
aaa::GG1321223 ::GG1321223(){ note_ctor("_ZN3aaa9GG1321223E", this);} // tgen
}
static void Test__ZN3aaa9GG1321223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321223E, buf);
    ::aaa::GG1321223 *dp, &lv = *(dp=new (buf) ::aaa::GG1321223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321223E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1321223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1321223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1321223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321223E);
    dp->::aaa::GG1321223::~GG1321223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321223E(Test__ZN3aaa9GG1321223E, "_ZN3aaa9GG1321223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321223C1Ev();
extern void _ZN3aaa9GG1321223D1Ev();
Name_Map name_map__ZN3aaa9GG1321223E[] = {
  NSPAIR(_ZN3aaa9GG1321223C1Ev),
  NSPAIR(_ZN3aaa9GG1321223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1321223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321223E[];
extern void _ZN3aaa9GG13212233fooEv();
extern void _ZN3aaa9GG13212233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212233fooEv,_ZThn8_N3aaa9GG13212233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13212233barEv,_ZThn8_N3aaa9GG13212233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13212233fooEv,_ZThn20_N3aaa9GG13212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13212233barEv,_ZThn20_N3aaa9GG13212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13212233barEv,_ZThn28_N3aaa9GG13212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13212233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13212233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212233fooEv,_ZThn8_N3aaa9GG13212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212233barEv,_ZThn8_N3aaa9GG13212233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212233fooEv,_ZThn20_N3aaa9GG13212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212233barEv,_ZThn20_N3aaa9GG13212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13212233barEv,_ZThn28_N3aaa9GG13212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321223E[];
Class_Descriptor cd__ZN3aaa9GG1321223E = {  "_ZN3aaa9GG1321223E", // class name
  bases__ZN3aaa9GG1321223E, 6,
  &(vtc__ZN3aaa9GG1321223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321231  : ::aaa::EE132 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13212313fooEv
  ~GG1321231(); // tgen
  GG1321231(); // tgen
};
//SIG(1 _ZN3aaa9GG1321231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13212313fooEv");}
aaa::GG1321231 ::~GG1321231(){ note_dtor("_ZN3aaa9GG1321231E", this);} // tgen
aaa::GG1321231 ::GG1321231(){ note_ctor("_ZN3aaa9GG1321231E", this);} // tgen
}
static void Test__ZN3aaa9GG1321231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321231E, buf);
    ::aaa::GG1321231 *dp, &lv = *(dp=new (buf) ::aaa::GG1321231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321231E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1321231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1321231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1321231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321231E);
    dp->::aaa::GG1321231::~GG1321231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321231E(Test__ZN3aaa9GG1321231E, "_ZN3aaa9GG1321231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321231C1Ev();
extern void _ZN3aaa9GG1321231D1Ev();
Name_Map name_map__ZN3aaa9GG1321231E[] = {
  NSPAIR(_ZN3aaa9GG1321231C1Ev),
  NSPAIR(_ZN3aaa9GG1321231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1321231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321231E[];
extern void _ZN3aaa9GG13212313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212313fooEv,_ZThn8_N3aaa9GG13212313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13212313fooEv,_ZThn20_N3aaa9GG13212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13212313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212313fooEv,_ZThn8_N3aaa9GG13212313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212313fooEv,_ZThn20_N3aaa9GG13212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321231E[];
Class_Descriptor cd__ZN3aaa9GG1321231E = {  "_ZN3aaa9GG1321231E", // class name
  bases__ZN3aaa9GG1321231E, 6,
  &(vtc__ZN3aaa9GG1321231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321232  : ::aaa::EE132 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13212323barEv
  ~GG1321232(); // tgen
  GG1321232(); // tgen
};
//SIG(1 _ZN3aaa9GG1321232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13212323barEv");}
aaa::GG1321232 ::~GG1321232(){ note_dtor("_ZN3aaa9GG1321232E", this);} // tgen
aaa::GG1321232 ::GG1321232(){ note_ctor("_ZN3aaa9GG1321232E", this);} // tgen
}
static void Test__ZN3aaa9GG1321232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321232E, buf);
    ::aaa::GG1321232 *dp, &lv = *(dp=new (buf) ::aaa::GG1321232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321232E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1321232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1321232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1321232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321232E);
    dp->::aaa::GG1321232::~GG1321232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321232E(Test__ZN3aaa9GG1321232E, "_ZN3aaa9GG1321232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321232C1Ev();
extern void _ZN3aaa9GG1321232D1Ev();
Name_Map name_map__ZN3aaa9GG1321232E[] = {
  NSPAIR(_ZN3aaa9GG1321232C1Ev),
  NSPAIR(_ZN3aaa9GG1321232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1321232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13212323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212323barEv,_ZThn8_N3aaa9GG13212323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13212323barEv,_ZThn20_N3aaa9GG13212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13212323barEv,_ZThn28_N3aaa9GG13212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212323barEv,_ZThn8_N3aaa9GG13212323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212323barEv,_ZThn20_N3aaa9GG13212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13212323barEv,_ZThn28_N3aaa9GG13212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321232E[];
Class_Descriptor cd__ZN3aaa9GG1321232E = {  "_ZN3aaa9GG1321232E", // class name
  bases__ZN3aaa9GG1321232E, 6,
  &(vtc__ZN3aaa9GG1321232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321233  : ::aaa::EE132 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13212333fooEv
  virtual void  bar(); // _ZN3aaa9GG13212333barEv
  ~GG1321233(); // tgen
  GG1321233(); // tgen
};
//SIG(1 _ZN3aaa9GG1321233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13212333fooEv");}
void  aaa::GG1321233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13212333barEv");}
aaa::GG1321233 ::~GG1321233(){ note_dtor("_ZN3aaa9GG1321233E", this);} // tgen
aaa::GG1321233 ::GG1321233(){ note_ctor("_ZN3aaa9GG1321233E", this);} // tgen
}
static void Test__ZN3aaa9GG1321233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321233E, buf);
    ::aaa::GG1321233 *dp, &lv = *(dp=new (buf) ::aaa::GG1321233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321233E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1321233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1321233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1321233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321233E);
    dp->::aaa::GG1321233::~GG1321233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321233E(Test__ZN3aaa9GG1321233E, "_ZN3aaa9GG1321233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321233C1Ev();
extern void _ZN3aaa9GG1321233D1Ev();
Name_Map name_map__ZN3aaa9GG1321233E[] = {
  NSPAIR(_ZN3aaa9GG1321233C1Ev),
  NSPAIR(_ZN3aaa9GG1321233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1321233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321233E[];
extern void _ZN3aaa9GG13212333fooEv();
extern void _ZN3aaa9GG13212333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13212333fooEv,_ZThn8_N3aaa9GG13212333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13212333barEv,_ZThn8_N3aaa9GG13212333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13212333fooEv,_ZThn20_N3aaa9GG13212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13212333barEv,_ZThn20_N3aaa9GG13212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13212333barEv,_ZThn28_N3aaa9GG13212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13212333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13212333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212333fooEv,_ZThn8_N3aaa9GG13212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13212333barEv,_ZThn8_N3aaa9GG13212333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212333fooEv,_ZThn20_N3aaa9GG13212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13212333barEv,_ZThn20_N3aaa9GG13212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13212333barEv,_ZThn28_N3aaa9GG13212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321233E[];
Class_Descriptor cd__ZN3aaa9GG1321233E = {  "_ZN3aaa9GG1321233E", // class name
  bases__ZN3aaa9GG1321233E, 6,
  &(vtc__ZN3aaa9GG1321233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321311  : ::aaa::EE132 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13213113fooEv
  ~GG1321311(); // tgen
  GG1321311(); // tgen
};
//SIG(1 _ZN3aaa9GG1321311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13213113fooEv");}
aaa::GG1321311 ::~GG1321311(){ note_dtor("_ZN3aaa9GG1321311E", this);} // tgen
aaa::GG1321311 ::GG1321311(){ note_ctor("_ZN3aaa9GG1321311E", this);} // tgen
}
static void Test__ZN3aaa9GG1321311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321311E, buf);
    ::aaa::GG1321311 *dp, &lv = *(dp=new (buf) ::aaa::GG1321311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321311E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1321311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1321311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1321311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321311E);
    dp->::aaa::GG1321311::~GG1321311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321311E(Test__ZN3aaa9GG1321311E, "_ZN3aaa9GG1321311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321311C1Ev();
extern void _ZN3aaa9GG1321311D1Ev();
Name_Map name_map__ZN3aaa9GG1321311E[] = {
  NSPAIR(_ZN3aaa9GG1321311C1Ev),
  NSPAIR(_ZN3aaa9GG1321311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1321311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321311E[];
extern void _ZN3aaa9GG13213113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213113fooEv,_ZThn8_N3aaa9GG13213113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13213113fooEv,_ZThn20_N3aaa9GG13213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213113fooEv,_ZThn28_N3aaa9GG13213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13213113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213113fooEv,_ZThn8_N3aaa9GG13213113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213113fooEv,_ZThn20_N3aaa9GG13213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213113fooEv,_ZThn28_N3aaa9GG13213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321311E[];
Class_Descriptor cd__ZN3aaa9GG1321311E = {  "_ZN3aaa9GG1321311E", // class name
  bases__ZN3aaa9GG1321311E, 6,
  &(vtc__ZN3aaa9GG1321311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321312  : ::aaa::EE132 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13213123barEv
  ~GG1321312(); // tgen
  GG1321312(); // tgen
};
//SIG(1 _ZN3aaa9GG1321312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13213123barEv");}
aaa::GG1321312 ::~GG1321312(){ note_dtor("_ZN3aaa9GG1321312E", this);} // tgen
aaa::GG1321312 ::GG1321312(){ note_ctor("_ZN3aaa9GG1321312E", this);} // tgen
}
static void Test__ZN3aaa9GG1321312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321312E, buf);
    ::aaa::GG1321312 *dp, &lv = *(dp=new (buf) ::aaa::GG1321312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321312E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1321312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1321312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1321312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321312E);
    dp->::aaa::GG1321312::~GG1321312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321312E(Test__ZN3aaa9GG1321312E, "_ZN3aaa9GG1321312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321312C1Ev();
extern void _ZN3aaa9GG1321312D1Ev();
Name_Map name_map__ZN3aaa9GG1321312E[] = {
  NSPAIR(_ZN3aaa9GG1321312C1Ev),
  NSPAIR(_ZN3aaa9GG1321312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1321312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13213123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213123barEv,_ZThn8_N3aaa9GG13213123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213123barEv,_ZThn28_N3aaa9GG13213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213123barEv,_ZThn8_N3aaa9GG13213123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213123barEv,_ZThn28_N3aaa9GG13213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321312E[];
Class_Descriptor cd__ZN3aaa9GG1321312E = {  "_ZN3aaa9GG1321312E", // class name
  bases__ZN3aaa9GG1321312E, 6,
  &(vtc__ZN3aaa9GG1321312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321313  : ::aaa::EE132 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13213133fooEv
  virtual void  bar(); // _ZN3aaa9GG13213133barEv
  ~GG1321313(); // tgen
  GG1321313(); // tgen
};
//SIG(1 _ZN3aaa9GG1321313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13213133fooEv");}
void  aaa::GG1321313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13213133barEv");}
aaa::GG1321313 ::~GG1321313(){ note_dtor("_ZN3aaa9GG1321313E", this);} // tgen
aaa::GG1321313 ::GG1321313(){ note_ctor("_ZN3aaa9GG1321313E", this);} // tgen
}
static void Test__ZN3aaa9GG1321313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321313E, buf);
    ::aaa::GG1321313 *dp, &lv = *(dp=new (buf) ::aaa::GG1321313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321313E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1321313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1321313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1321313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321313E);
    dp->::aaa::GG1321313::~GG1321313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321313E(Test__ZN3aaa9GG1321313E, "_ZN3aaa9GG1321313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321313C1Ev();
extern void _ZN3aaa9GG1321313D1Ev();
Name_Map name_map__ZN3aaa9GG1321313E[] = {
  NSPAIR(_ZN3aaa9GG1321313C1Ev),
  NSPAIR(_ZN3aaa9GG1321313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1321313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321313E[];
extern void _ZN3aaa9GG13213133fooEv();
extern void _ZN3aaa9GG13213133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213133fooEv,_ZThn8_N3aaa9GG13213133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13213133barEv,_ZThn8_N3aaa9GG13213133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13213133fooEv,_ZThn20_N3aaa9GG13213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213133fooEv,_ZThn28_N3aaa9GG13213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213133barEv,_ZThn28_N3aaa9GG13213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13213133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13213133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213133fooEv,_ZThn8_N3aaa9GG13213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213133barEv,_ZThn8_N3aaa9GG13213133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213133fooEv,_ZThn20_N3aaa9GG13213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213133fooEv,_ZThn28_N3aaa9GG13213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213133barEv,_ZThn28_N3aaa9GG13213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321313E[];
Class_Descriptor cd__ZN3aaa9GG1321313E = {  "_ZN3aaa9GG1321313E", // class name
  bases__ZN3aaa9GG1321313E, 6,
  &(vtc__ZN3aaa9GG1321313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321321  : ::aaa::EE132 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13213213fooEv
  ~GG1321321(); // tgen
  GG1321321(); // tgen
};
//SIG(1 _ZN3aaa9GG1321321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13213213fooEv");}
aaa::GG1321321 ::~GG1321321(){ note_dtor("_ZN3aaa9GG1321321E", this);} // tgen
aaa::GG1321321 ::GG1321321(){ note_ctor("_ZN3aaa9GG1321321E", this);} // tgen
}
static void Test__ZN3aaa9GG1321321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321321E, buf);
    ::aaa::GG1321321 *dp, &lv = *(dp=new (buf) ::aaa::GG1321321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321321E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1321321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1321321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1321321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321321E);
    dp->::aaa::GG1321321::~GG1321321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321321E(Test__ZN3aaa9GG1321321E, "_ZN3aaa9GG1321321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321321C1Ev();
extern void _ZN3aaa9GG1321321D1Ev();
Name_Map name_map__ZN3aaa9GG1321321E[] = {
  NSPAIR(_ZN3aaa9GG1321321C1Ev),
  NSPAIR(_ZN3aaa9GG1321321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1321321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321321E[];
extern void _ZN3aaa9GG13213213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213213fooEv,_ZThn8_N3aaa9GG13213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13213213fooEv,_ZThn20_N3aaa9GG13213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13213213fooEv,_ZThn28_N3aaa9GG13213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13213213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213213fooEv,_ZThn8_N3aaa9GG13213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213213fooEv,_ZThn20_N3aaa9GG13213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213213fooEv,_ZThn28_N3aaa9GG13213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321321E[];
Class_Descriptor cd__ZN3aaa9GG1321321E = {  "_ZN3aaa9GG1321321E", // class name
  bases__ZN3aaa9GG1321321E, 6,
  &(vtc__ZN3aaa9GG1321321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321322  : ::aaa::EE132 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13213223barEv
  ~GG1321322(); // tgen
  GG1321322(); // tgen
};
//SIG(1 _ZN3aaa9GG1321322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13213223barEv");}
aaa::GG1321322 ::~GG1321322(){ note_dtor("_ZN3aaa9GG1321322E", this);} // tgen
aaa::GG1321322 ::GG1321322(){ note_ctor("_ZN3aaa9GG1321322E", this);} // tgen
}
static void Test__ZN3aaa9GG1321322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321322E, buf);
    ::aaa::GG1321322 *dp, &lv = *(dp=new (buf) ::aaa::GG1321322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321322E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1321322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1321322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1321322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321322E);
    dp->::aaa::GG1321322::~GG1321322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321322E(Test__ZN3aaa9GG1321322E, "_ZN3aaa9GG1321322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321322C1Ev();
extern void _ZN3aaa9GG1321322D1Ev();
Name_Map name_map__ZN3aaa9GG1321322E[] = {
  NSPAIR(_ZN3aaa9GG1321322C1Ev),
  NSPAIR(_ZN3aaa9GG1321322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1321322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13213223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213223barEv,_ZThn8_N3aaa9GG13213223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13213223barEv,_ZThn20_N3aaa9GG13213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13213223barEv,_ZThn28_N3aaa9GG13213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213223barEv,_ZThn8_N3aaa9GG13213223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213223barEv,_ZThn20_N3aaa9GG13213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213223barEv,_ZThn28_N3aaa9GG13213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321322E[];
Class_Descriptor cd__ZN3aaa9GG1321322E = {  "_ZN3aaa9GG1321322E", // class name
  bases__ZN3aaa9GG1321322E, 6,
  &(vtc__ZN3aaa9GG1321322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321323  : ::aaa::EE132 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13213233fooEv
  virtual void  bar(); // _ZN3aaa9GG13213233barEv
  ~GG1321323(); // tgen
  GG1321323(); // tgen
};
//SIG(1 _ZN3aaa9GG1321323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13213233fooEv");}
void  aaa::GG1321323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13213233barEv");}
aaa::GG1321323 ::~GG1321323(){ note_dtor("_ZN3aaa9GG1321323E", this);} // tgen
aaa::GG1321323 ::GG1321323(){ note_ctor("_ZN3aaa9GG1321323E", this);} // tgen
}
static void Test__ZN3aaa9GG1321323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321323E, buf);
    ::aaa::GG1321323 *dp, &lv = *(dp=new (buf) ::aaa::GG1321323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321323E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1321323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1321323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1321323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321323E);
    dp->::aaa::GG1321323::~GG1321323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321323E(Test__ZN3aaa9GG1321323E, "_ZN3aaa9GG1321323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321323C1Ev();
extern void _ZN3aaa9GG1321323D1Ev();
Name_Map name_map__ZN3aaa9GG1321323E[] = {
  NSPAIR(_ZN3aaa9GG1321323C1Ev),
  NSPAIR(_ZN3aaa9GG1321323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1321323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321323E[];
extern void _ZN3aaa9GG13213233fooEv();
extern void _ZN3aaa9GG13213233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213233fooEv,_ZThn8_N3aaa9GG13213233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13213233barEv,_ZThn8_N3aaa9GG13213233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13213233fooEv,_ZThn20_N3aaa9GG13213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13213233barEv,_ZThn20_N3aaa9GG13213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213233fooEv,_ZThn28_N3aaa9GG13213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213233barEv,_ZThn28_N3aaa9GG13213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13213233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13213233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213233fooEv,_ZThn8_N3aaa9GG13213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213233barEv,_ZThn8_N3aaa9GG13213233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213233fooEv,_ZThn20_N3aaa9GG13213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213233barEv,_ZThn20_N3aaa9GG13213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213233fooEv,_ZThn28_N3aaa9GG13213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213233barEv,_ZThn28_N3aaa9GG13213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321323E[];
Class_Descriptor cd__ZN3aaa9GG1321323E = {  "_ZN3aaa9GG1321323E", // class name
  bases__ZN3aaa9GG1321323E, 6,
  &(vtc__ZN3aaa9GG1321323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321331  : ::aaa::EE132 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13213313fooEv
  ~GG1321331(); // tgen
  GG1321331(); // tgen
};
//SIG(1 _ZN3aaa9GG1321331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13213313fooEv");}
aaa::GG1321331 ::~GG1321331(){ note_dtor("_ZN3aaa9GG1321331E", this);} // tgen
aaa::GG1321331 ::GG1321331(){ note_ctor("_ZN3aaa9GG1321331E", this);} // tgen
}
static void Test__ZN3aaa9GG1321331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321331E, buf);
    ::aaa::GG1321331 *dp, &lv = *(dp=new (buf) ::aaa::GG1321331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321331E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1321331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1321331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1321331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321331E);
    dp->::aaa::GG1321331::~GG1321331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321331E(Test__ZN3aaa9GG1321331E, "_ZN3aaa9GG1321331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321331C1Ev();
extern void _ZN3aaa9GG1321331D1Ev();
Name_Map name_map__ZN3aaa9GG1321331E[] = {
  NSPAIR(_ZN3aaa9GG1321331C1Ev),
  NSPAIR(_ZN3aaa9GG1321331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1321331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321331E[];
extern void _ZN3aaa9GG13213313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213313fooEv,_ZThn8_N3aaa9GG13213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13213313fooEv,_ZThn20_N3aaa9GG13213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13213313fooEv,_ZThn28_N3aaa9GG13213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13213313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213313fooEv,_ZThn8_N3aaa9GG13213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213313fooEv,_ZThn20_N3aaa9GG13213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213313fooEv,_ZThn28_N3aaa9GG13213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321331E[];
Class_Descriptor cd__ZN3aaa9GG1321331E = {  "_ZN3aaa9GG1321331E", // class name
  bases__ZN3aaa9GG1321331E, 6,
  &(vtc__ZN3aaa9GG1321331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321332  : ::aaa::EE132 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13213323barEv
  ~GG1321332(); // tgen
  GG1321332(); // tgen
};
//SIG(1 _ZN3aaa9GG1321332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1321332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13213323barEv");}
aaa::GG1321332 ::~GG1321332(){ note_dtor("_ZN3aaa9GG1321332E", this);} // tgen
aaa::GG1321332 ::GG1321332(){ note_ctor("_ZN3aaa9GG1321332E", this);} // tgen
}
static void Test__ZN3aaa9GG1321332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321332E, buf);
    ::aaa::GG1321332 *dp, &lv = *(dp=new (buf) ::aaa::GG1321332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321332E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1321332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1321332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1321332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321332E);
    dp->::aaa::GG1321332::~GG1321332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321332E(Test__ZN3aaa9GG1321332E, "_ZN3aaa9GG1321332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321332C1Ev();
extern void _ZN3aaa9GG1321332D1Ev();
Name_Map name_map__ZN3aaa9GG1321332E[] = {
  NSPAIR(_ZN3aaa9GG1321332C1Ev),
  NSPAIR(_ZN3aaa9GG1321332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1321332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13213323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213323barEv,_ZThn8_N3aaa9GG13213323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13213323barEv,_ZThn20_N3aaa9GG13213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213323barEv,_ZThn28_N3aaa9GG13213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213323barEv,_ZThn8_N3aaa9GG13213323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213323barEv,_ZThn20_N3aaa9GG13213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213323barEv,_ZThn28_N3aaa9GG13213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321332E[];
Class_Descriptor cd__ZN3aaa9GG1321332E = {  "_ZN3aaa9GG1321332E", // class name
  bases__ZN3aaa9GG1321332E, 6,
  &(vtc__ZN3aaa9GG1321332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1321333  : ::aaa::EE132 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13213333fooEv
  virtual void  bar(); // _ZN3aaa9GG13213333barEv
  ~GG1321333(); // tgen
  GG1321333(); // tgen
};
//SIG(1 _ZN3aaa9GG1321333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1321333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13213333fooEv");}
void  aaa::GG1321333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13213333barEv");}
aaa::GG1321333 ::~GG1321333(){ note_dtor("_ZN3aaa9GG1321333E", this);} // tgen
aaa::GG1321333 ::GG1321333(){ note_ctor("_ZN3aaa9GG1321333E", this);} // tgen
}
static void Test__ZN3aaa9GG1321333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1321333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1321333E, buf);
    ::aaa::GG1321333 *dp, &lv = *(dp=new (buf) ::aaa::GG1321333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1321333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1321333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1321333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1321333E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1321333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1321333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1321333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1321333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1321333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1321333E);
    dp->::aaa::GG1321333::~GG1321333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1321333E(Test__ZN3aaa9GG1321333E, "_ZN3aaa9GG1321333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1321333C1Ev();
extern void _ZN3aaa9GG1321333D1Ev();
Name_Map name_map__ZN3aaa9GG1321333E[] = {
  NSPAIR(_ZN3aaa9GG1321333C1Ev),
  NSPAIR(_ZN3aaa9GG1321333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1321333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1321333E[];
extern void _ZN3aaa9GG13213333fooEv();
extern void _ZN3aaa9GG13213333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13213333fooEv,_ZThn8_N3aaa9GG13213333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13213333barEv,_ZThn8_N3aaa9GG13213333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13213333fooEv,_ZThn20_N3aaa9GG13213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13213333barEv,_ZThn20_N3aaa9GG13213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213333fooEv,_ZThn28_N3aaa9GG13213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13213333barEv,_ZThn28_N3aaa9GG13213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1321333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13213333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13213333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213333fooEv,_ZThn8_N3aaa9GG13213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13213333barEv,_ZThn8_N3aaa9GG13213333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213333fooEv,_ZThn20_N3aaa9GG13213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13213333barEv,_ZThn20_N3aaa9GG13213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213333fooEv,_ZThn28_N3aaa9GG13213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13213333barEv,_ZThn28_N3aaa9GG13213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1321333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1321333E[];
Class_Descriptor cd__ZN3aaa9GG1321333E = {  "_ZN3aaa9GG1321333E", // class name
  bases__ZN3aaa9GG1321333E, 6,
  &(vtc__ZN3aaa9GG1321333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1321333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1321333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322111  : ::aaa::EE132 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13221113fooEv
  ~GG1322111(); // tgen
  GG1322111(); // tgen
};
//SIG(1 _ZN3aaa9GG1322111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13221113fooEv");}
aaa::GG1322111 ::~GG1322111(){ note_dtor("_ZN3aaa9GG1322111E", this);} // tgen
aaa::GG1322111 ::GG1322111(){ note_ctor("_ZN3aaa9GG1322111E", this);} // tgen
}
static void Test__ZN3aaa9GG1322111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322111E, buf);
    ::aaa::GG1322111 *dp, &lv = *(dp=new (buf) ::aaa::GG1322111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322111E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1322111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1322111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1322111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322111E);
    dp->::aaa::GG1322111::~GG1322111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322111E(Test__ZN3aaa9GG1322111E, "_ZN3aaa9GG1322111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322111C1Ev();
extern void _ZN3aaa9GG1322111D1Ev();
Name_Map name_map__ZN3aaa9GG1322111E[] = {
  NSPAIR(_ZN3aaa9GG1322111C1Ev),
  NSPAIR(_ZN3aaa9GG1322111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1322111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322111E[];
extern void _ZN3aaa9GG13221113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221113fooEv,_ZThn8_N3aaa9GG13221113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13221113fooEv,_ZThn20_N3aaa9GG13221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13221113fooEv,_ZThn28_N3aaa9GG13221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13221113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221113fooEv,_ZThn8_N3aaa9GG13221113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221113fooEv,_ZThn20_N3aaa9GG13221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13221113fooEv,_ZThn28_N3aaa9GG13221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322111E[];
Class_Descriptor cd__ZN3aaa9GG1322111E = {  "_ZN3aaa9GG1322111E", // class name
  bases__ZN3aaa9GG1322111E, 6,
  &(vtc__ZN3aaa9GG1322111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322112  : ::aaa::EE132 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13221123barEv
  ~GG1322112(); // tgen
  GG1322112(); // tgen
};
//SIG(1 _ZN3aaa9GG1322112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13221123barEv");}
aaa::GG1322112 ::~GG1322112(){ note_dtor("_ZN3aaa9GG1322112E", this);} // tgen
aaa::GG1322112 ::GG1322112(){ note_ctor("_ZN3aaa9GG1322112E", this);} // tgen
}
static void Test__ZN3aaa9GG1322112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322112E, buf);
    ::aaa::GG1322112 *dp, &lv = *(dp=new (buf) ::aaa::GG1322112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322112E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1322112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1322112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1322112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322112E);
    dp->::aaa::GG1322112::~GG1322112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322112E(Test__ZN3aaa9GG1322112E, "_ZN3aaa9GG1322112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322112C1Ev();
extern void _ZN3aaa9GG1322112D1Ev();
Name_Map name_map__ZN3aaa9GG1322112E[] = {
  NSPAIR(_ZN3aaa9GG1322112C1Ev),
  NSPAIR(_ZN3aaa9GG1322112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1322112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13221123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221123barEv,_ZThn8_N3aaa9GG13221123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13221123barEv,_ZThn20_N3aaa9GG13221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221123barEv,_ZThn8_N3aaa9GG13221123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221123barEv,_ZThn20_N3aaa9GG13221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322112E[];
Class_Descriptor cd__ZN3aaa9GG1322112E = {  "_ZN3aaa9GG1322112E", // class name
  bases__ZN3aaa9GG1322112E, 6,
  &(vtc__ZN3aaa9GG1322112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322113  : ::aaa::EE132 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13221133fooEv
  virtual void  bar(); // _ZN3aaa9GG13221133barEv
  ~GG1322113(); // tgen
  GG1322113(); // tgen
};
//SIG(1 _ZN3aaa9GG1322113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13221133fooEv");}
void  aaa::GG1322113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13221133barEv");}
aaa::GG1322113 ::~GG1322113(){ note_dtor("_ZN3aaa9GG1322113E", this);} // tgen
aaa::GG1322113 ::GG1322113(){ note_ctor("_ZN3aaa9GG1322113E", this);} // tgen
}
static void Test__ZN3aaa9GG1322113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322113E, buf);
    ::aaa::GG1322113 *dp, &lv = *(dp=new (buf) ::aaa::GG1322113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322113E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1322113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1322113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1322113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322113E);
    dp->::aaa::GG1322113::~GG1322113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322113E(Test__ZN3aaa9GG1322113E, "_ZN3aaa9GG1322113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322113C1Ev();
extern void _ZN3aaa9GG1322113D1Ev();
Name_Map name_map__ZN3aaa9GG1322113E[] = {
  NSPAIR(_ZN3aaa9GG1322113C1Ev),
  NSPAIR(_ZN3aaa9GG1322113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1322113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322113E[];
extern void _ZN3aaa9GG13221133fooEv();
extern void _ZN3aaa9GG13221133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221133fooEv,_ZThn8_N3aaa9GG13221133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13221133barEv,_ZThn8_N3aaa9GG13221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13221133barEv,_ZThn20_N3aaa9GG13221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13221133fooEv,_ZThn20_N3aaa9GG13221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13221133fooEv,_ZThn28_N3aaa9GG13221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13221133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13221133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221133fooEv,_ZThn8_N3aaa9GG13221133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221133barEv,_ZThn8_N3aaa9GG13221133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221133barEv,_ZThn20_N3aaa9GG13221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221133fooEv,_ZThn20_N3aaa9GG13221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13221133fooEv,_ZThn28_N3aaa9GG13221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322113E[];
Class_Descriptor cd__ZN3aaa9GG1322113E = {  "_ZN3aaa9GG1322113E", // class name
  bases__ZN3aaa9GG1322113E, 6,
  &(vtc__ZN3aaa9GG1322113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322121  : ::aaa::EE132 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13221213fooEv
  ~GG1322121(); // tgen
  GG1322121(); // tgen
};
//SIG(1 _ZN3aaa9GG1322121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13221213fooEv");}
aaa::GG1322121 ::~GG1322121(){ note_dtor("_ZN3aaa9GG1322121E", this);} // tgen
aaa::GG1322121 ::GG1322121(){ note_ctor("_ZN3aaa9GG1322121E", this);} // tgen
}
static void Test__ZN3aaa9GG1322121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322121E, buf);
    ::aaa::GG1322121 *dp, &lv = *(dp=new (buf) ::aaa::GG1322121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322121E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1322121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1322121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1322121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322121E);
    dp->::aaa::GG1322121::~GG1322121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322121E(Test__ZN3aaa9GG1322121E, "_ZN3aaa9GG1322121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322121C1Ev();
extern void _ZN3aaa9GG1322121D1Ev();
Name_Map name_map__ZN3aaa9GG1322121E[] = {
  NSPAIR(_ZN3aaa9GG1322121C1Ev),
  NSPAIR(_ZN3aaa9GG1322121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1322121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322121E[];
extern void _ZN3aaa9GG13221213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221213fooEv,_ZThn8_N3aaa9GG13221213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13221213fooEv,_ZThn28_N3aaa9GG13221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13221213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221213fooEv,_ZThn8_N3aaa9GG13221213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13221213fooEv,_ZThn28_N3aaa9GG13221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322121E[];
Class_Descriptor cd__ZN3aaa9GG1322121E = {  "_ZN3aaa9GG1322121E", // class name
  bases__ZN3aaa9GG1322121E, 6,
  &(vtc__ZN3aaa9GG1322121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322122  : ::aaa::EE132 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13221223barEv
  ~GG1322122(); // tgen
  GG1322122(); // tgen
};
//SIG(1 _ZN3aaa9GG1322122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13221223barEv");}
aaa::GG1322122 ::~GG1322122(){ note_dtor("_ZN3aaa9GG1322122E", this);} // tgen
aaa::GG1322122 ::GG1322122(){ note_ctor("_ZN3aaa9GG1322122E", this);} // tgen
}
static void Test__ZN3aaa9GG1322122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322122E, buf);
    ::aaa::GG1322122 *dp, &lv = *(dp=new (buf) ::aaa::GG1322122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322122E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1322122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1322122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1322122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322122E);
    dp->::aaa::GG1322122::~GG1322122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322122E(Test__ZN3aaa9GG1322122E, "_ZN3aaa9GG1322122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322122C1Ev();
extern void _ZN3aaa9GG1322122D1Ev();
Name_Map name_map__ZN3aaa9GG1322122E[] = {
  NSPAIR(_ZN3aaa9GG1322122C1Ev),
  NSPAIR(_ZN3aaa9GG1322122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1322122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13221223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221223barEv,_ZThn8_N3aaa9GG13221223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13221223barEv,_ZThn20_N3aaa9GG13221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221223barEv,_ZThn8_N3aaa9GG13221223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221223barEv,_ZThn20_N3aaa9GG13221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322122E[];
Class_Descriptor cd__ZN3aaa9GG1322122E = {  "_ZN3aaa9GG1322122E", // class name
  bases__ZN3aaa9GG1322122E, 6,
  &(vtc__ZN3aaa9GG1322122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322123  : ::aaa::EE132 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13221233fooEv
  virtual void  bar(); // _ZN3aaa9GG13221233barEv
  ~GG1322123(); // tgen
  GG1322123(); // tgen
};
//SIG(1 _ZN3aaa9GG1322123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13221233fooEv");}
void  aaa::GG1322123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13221233barEv");}
aaa::GG1322123 ::~GG1322123(){ note_dtor("_ZN3aaa9GG1322123E", this);} // tgen
aaa::GG1322123 ::GG1322123(){ note_ctor("_ZN3aaa9GG1322123E", this);} // tgen
}
static void Test__ZN3aaa9GG1322123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322123E, buf);
    ::aaa::GG1322123 *dp, &lv = *(dp=new (buf) ::aaa::GG1322123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322123E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1322123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1322123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1322123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322123E);
    dp->::aaa::GG1322123::~GG1322123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322123E(Test__ZN3aaa9GG1322123E, "_ZN3aaa9GG1322123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322123C1Ev();
extern void _ZN3aaa9GG1322123D1Ev();
Name_Map name_map__ZN3aaa9GG1322123E[] = {
  NSPAIR(_ZN3aaa9GG1322123C1Ev),
  NSPAIR(_ZN3aaa9GG1322123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1322123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322123E[];
extern void _ZN3aaa9GG13221233fooEv();
extern void _ZN3aaa9GG13221233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221233fooEv,_ZThn8_N3aaa9GG13221233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13221233barEv,_ZThn8_N3aaa9GG13221233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13221233barEv,_ZThn20_N3aaa9GG13221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13221233fooEv,_ZThn28_N3aaa9GG13221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13221233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13221233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221233fooEv,_ZThn8_N3aaa9GG13221233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221233barEv,_ZThn8_N3aaa9GG13221233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221233barEv,_ZThn20_N3aaa9GG13221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13221233fooEv,_ZThn28_N3aaa9GG13221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322123E[];
Class_Descriptor cd__ZN3aaa9GG1322123E = {  "_ZN3aaa9GG1322123E", // class name
  bases__ZN3aaa9GG1322123E, 6,
  &(vtc__ZN3aaa9GG1322123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322131  : ::aaa::EE132 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13221313fooEv
  ~GG1322131(); // tgen
  GG1322131(); // tgen
};
//SIG(1 _ZN3aaa9GG1322131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13221313fooEv");}
aaa::GG1322131 ::~GG1322131(){ note_dtor("_ZN3aaa9GG1322131E", this);} // tgen
aaa::GG1322131 ::GG1322131(){ note_ctor("_ZN3aaa9GG1322131E", this);} // tgen
}
static void Test__ZN3aaa9GG1322131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322131E, buf);
    ::aaa::GG1322131 *dp, &lv = *(dp=new (buf) ::aaa::GG1322131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322131E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1322131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1322131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1322131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322131E);
    dp->::aaa::GG1322131::~GG1322131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322131E(Test__ZN3aaa9GG1322131E, "_ZN3aaa9GG1322131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322131C1Ev();
extern void _ZN3aaa9GG1322131D1Ev();
Name_Map name_map__ZN3aaa9GG1322131E[] = {
  NSPAIR(_ZN3aaa9GG1322131C1Ev),
  NSPAIR(_ZN3aaa9GG1322131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1322131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322131E[];
extern void _ZN3aaa9GG13221313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221313fooEv,_ZThn8_N3aaa9GG13221313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13221313fooEv,_ZThn20_N3aaa9GG13221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13221313fooEv,_ZThn28_N3aaa9GG13221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13221313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221313fooEv,_ZThn8_N3aaa9GG13221313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221313fooEv,_ZThn20_N3aaa9GG13221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13221313fooEv,_ZThn28_N3aaa9GG13221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322131E[];
Class_Descriptor cd__ZN3aaa9GG1322131E = {  "_ZN3aaa9GG1322131E", // class name
  bases__ZN3aaa9GG1322131E, 6,
  &(vtc__ZN3aaa9GG1322131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322132  : ::aaa::EE132 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13221323barEv
  ~GG1322132(); // tgen
  GG1322132(); // tgen
};
//SIG(1 _ZN3aaa9GG1322132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13221323barEv");}
aaa::GG1322132 ::~GG1322132(){ note_dtor("_ZN3aaa9GG1322132E", this);} // tgen
aaa::GG1322132 ::GG1322132(){ note_ctor("_ZN3aaa9GG1322132E", this);} // tgen
}
static void Test__ZN3aaa9GG1322132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322132E, buf);
    ::aaa::GG1322132 *dp, &lv = *(dp=new (buf) ::aaa::GG1322132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322132E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1322132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1322132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1322132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322132E);
    dp->::aaa::GG1322132::~GG1322132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322132E(Test__ZN3aaa9GG1322132E, "_ZN3aaa9GG1322132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322132C1Ev();
extern void _ZN3aaa9GG1322132D1Ev();
Name_Map name_map__ZN3aaa9GG1322132E[] = {
  NSPAIR(_ZN3aaa9GG1322132C1Ev),
  NSPAIR(_ZN3aaa9GG1322132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1322132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13221323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221323barEv,_ZThn8_N3aaa9GG13221323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13221323barEv,_ZThn20_N3aaa9GG13221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221323barEv,_ZThn8_N3aaa9GG13221323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221323barEv,_ZThn20_N3aaa9GG13221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322132E[];
Class_Descriptor cd__ZN3aaa9GG1322132E = {  "_ZN3aaa9GG1322132E", // class name
  bases__ZN3aaa9GG1322132E, 6,
  &(vtc__ZN3aaa9GG1322132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322133  : ::aaa::EE132 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13221333fooEv
  virtual void  bar(); // _ZN3aaa9GG13221333barEv
  ~GG1322133(); // tgen
  GG1322133(); // tgen
};
//SIG(1 _ZN3aaa9GG1322133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13221333fooEv");}
void  aaa::GG1322133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13221333barEv");}
aaa::GG1322133 ::~GG1322133(){ note_dtor("_ZN3aaa9GG1322133E", this);} // tgen
aaa::GG1322133 ::GG1322133(){ note_ctor("_ZN3aaa9GG1322133E", this);} // tgen
}
static void Test__ZN3aaa9GG1322133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322133E, buf);
    ::aaa::GG1322133 *dp, &lv = *(dp=new (buf) ::aaa::GG1322133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322133E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1322133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1322133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1322133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322133E);
    dp->::aaa::GG1322133::~GG1322133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322133E(Test__ZN3aaa9GG1322133E, "_ZN3aaa9GG1322133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322133C1Ev();
extern void _ZN3aaa9GG1322133D1Ev();
Name_Map name_map__ZN3aaa9GG1322133E[] = {
  NSPAIR(_ZN3aaa9GG1322133C1Ev),
  NSPAIR(_ZN3aaa9GG1322133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1322133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322133E[];
extern void _ZN3aaa9GG13221333fooEv();
extern void _ZN3aaa9GG13221333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13221333fooEv,_ZThn8_N3aaa9GG13221333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13221333barEv,_ZThn8_N3aaa9GG13221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13221333barEv,_ZThn20_N3aaa9GG13221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13221333fooEv,_ZThn20_N3aaa9GG13221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13221333fooEv,_ZThn28_N3aaa9GG13221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13221333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13221333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221333fooEv,_ZThn8_N3aaa9GG13221333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13221333barEv,_ZThn8_N3aaa9GG13221333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221333barEv,_ZThn20_N3aaa9GG13221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13221333fooEv,_ZThn20_N3aaa9GG13221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13221333fooEv,_ZThn28_N3aaa9GG13221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322133E[];
Class_Descriptor cd__ZN3aaa9GG1322133E = {  "_ZN3aaa9GG1322133E", // class name
  bases__ZN3aaa9GG1322133E, 6,
  &(vtc__ZN3aaa9GG1322133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322211  : ::aaa::EE132 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13222113fooEv
  ~GG1322211(); // tgen
  GG1322211(); // tgen
};
//SIG(1 _ZN3aaa9GG1322211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13222113fooEv");}
aaa::GG1322211 ::~GG1322211(){ note_dtor("_ZN3aaa9GG1322211E", this);} // tgen
aaa::GG1322211 ::GG1322211(){ note_ctor("_ZN3aaa9GG1322211E", this);} // tgen
}
static void Test__ZN3aaa9GG1322211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322211E, buf);
    ::aaa::GG1322211 *dp, &lv = *(dp=new (buf) ::aaa::GG1322211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322211E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1322211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1322211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1322211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322211E);
    dp->::aaa::GG1322211::~GG1322211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322211E(Test__ZN3aaa9GG1322211E, "_ZN3aaa9GG1322211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322211C1Ev();
extern void _ZN3aaa9GG1322211D1Ev();
Name_Map name_map__ZN3aaa9GG1322211E[] = {
  NSPAIR(_ZN3aaa9GG1322211C1Ev),
  NSPAIR(_ZN3aaa9GG1322211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1322211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322211E[];
extern void _ZN3aaa9GG13222113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222113fooEv,_ZThn8_N3aaa9GG13222113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13222113fooEv,_ZThn20_N3aaa9GG13222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13222113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222113fooEv,_ZThn8_N3aaa9GG13222113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222113fooEv,_ZThn20_N3aaa9GG13222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322211E[];
Class_Descriptor cd__ZN3aaa9GG1322211E = {  "_ZN3aaa9GG1322211E", // class name
  bases__ZN3aaa9GG1322211E, 6,
  &(vtc__ZN3aaa9GG1322211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322212  : ::aaa::EE132 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13222123barEv
  ~GG1322212(); // tgen
  GG1322212(); // tgen
};
//SIG(1 _ZN3aaa9GG1322212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13222123barEv");}
aaa::GG1322212 ::~GG1322212(){ note_dtor("_ZN3aaa9GG1322212E", this);} // tgen
aaa::GG1322212 ::GG1322212(){ note_ctor("_ZN3aaa9GG1322212E", this);} // tgen
}
static void Test__ZN3aaa9GG1322212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322212E, buf);
    ::aaa::GG1322212 *dp, &lv = *(dp=new (buf) ::aaa::GG1322212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322212E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1322212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1322212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1322212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322212E);
    dp->::aaa::GG1322212::~GG1322212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322212E(Test__ZN3aaa9GG1322212E, "_ZN3aaa9GG1322212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322212C1Ev();
extern void _ZN3aaa9GG1322212D1Ev();
Name_Map name_map__ZN3aaa9GG1322212E[] = {
  NSPAIR(_ZN3aaa9GG1322212C1Ev),
  NSPAIR(_ZN3aaa9GG1322212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1322212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13222123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222123barEv,_ZThn8_N3aaa9GG13222123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13222123barEv,_ZThn20_N3aaa9GG13222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13222123barEv,_ZThn28_N3aaa9GG13222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222123barEv,_ZThn8_N3aaa9GG13222123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222123barEv,_ZThn20_N3aaa9GG13222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13222123barEv,_ZThn28_N3aaa9GG13222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322212E[];
Class_Descriptor cd__ZN3aaa9GG1322212E = {  "_ZN3aaa9GG1322212E", // class name
  bases__ZN3aaa9GG1322212E, 6,
  &(vtc__ZN3aaa9GG1322212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322213  : ::aaa::EE132 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13222133fooEv
  virtual void  bar(); // _ZN3aaa9GG13222133barEv
  ~GG1322213(); // tgen
  GG1322213(); // tgen
};
//SIG(1 _ZN3aaa9GG1322213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13222133fooEv");}
void  aaa::GG1322213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13222133barEv");}
aaa::GG1322213 ::~GG1322213(){ note_dtor("_ZN3aaa9GG1322213E", this);} // tgen
aaa::GG1322213 ::GG1322213(){ note_ctor("_ZN3aaa9GG1322213E", this);} // tgen
}
static void Test__ZN3aaa9GG1322213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322213E, buf);
    ::aaa::GG1322213 *dp, &lv = *(dp=new (buf) ::aaa::GG1322213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322213E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1322213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1322213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1322213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322213E);
    dp->::aaa::GG1322213::~GG1322213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322213E(Test__ZN3aaa9GG1322213E, "_ZN3aaa9GG1322213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322213C1Ev();
extern void _ZN3aaa9GG1322213D1Ev();
Name_Map name_map__ZN3aaa9GG1322213E[] = {
  NSPAIR(_ZN3aaa9GG1322213C1Ev),
  NSPAIR(_ZN3aaa9GG1322213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1322213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322213E[];
extern void _ZN3aaa9GG13222133fooEv();
extern void _ZN3aaa9GG13222133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222133fooEv,_ZThn8_N3aaa9GG13222133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13222133barEv,_ZThn8_N3aaa9GG13222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13222133barEv,_ZThn20_N3aaa9GG13222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13222133fooEv,_ZThn20_N3aaa9GG13222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13222133barEv,_ZThn28_N3aaa9GG13222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13222133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13222133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222133fooEv,_ZThn8_N3aaa9GG13222133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222133barEv,_ZThn8_N3aaa9GG13222133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222133barEv,_ZThn20_N3aaa9GG13222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222133fooEv,_ZThn20_N3aaa9GG13222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13222133barEv,_ZThn28_N3aaa9GG13222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322213E[];
Class_Descriptor cd__ZN3aaa9GG1322213E = {  "_ZN3aaa9GG1322213E", // class name
  bases__ZN3aaa9GG1322213E, 6,
  &(vtc__ZN3aaa9GG1322213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322221  : ::aaa::EE132 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13222213fooEv
  ~GG1322221(); // tgen
  GG1322221(); // tgen
};
//SIG(1 _ZN3aaa9GG1322221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13222213fooEv");}
aaa::GG1322221 ::~GG1322221(){ note_dtor("_ZN3aaa9GG1322221E", this);} // tgen
aaa::GG1322221 ::GG1322221(){ note_ctor("_ZN3aaa9GG1322221E", this);} // tgen
}
static void Test__ZN3aaa9GG1322221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322221E, buf);
    ::aaa::GG1322221 *dp, &lv = *(dp=new (buf) ::aaa::GG1322221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322221E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1322221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1322221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1322221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322221E);
    dp->::aaa::GG1322221::~GG1322221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322221E(Test__ZN3aaa9GG1322221E, "_ZN3aaa9GG1322221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322221C1Ev();
extern void _ZN3aaa9GG1322221D1Ev();
Name_Map name_map__ZN3aaa9GG1322221E[] = {
  NSPAIR(_ZN3aaa9GG1322221C1Ev),
  NSPAIR(_ZN3aaa9GG1322221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1322221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322221E[];
extern void _ZN3aaa9GG13222213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222213fooEv,_ZThn8_N3aaa9GG13222213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13222213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222213fooEv,_ZThn8_N3aaa9GG13222213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322221E[];
Class_Descriptor cd__ZN3aaa9GG1322221E = {  "_ZN3aaa9GG1322221E", // class name
  bases__ZN3aaa9GG1322221E, 6,
  &(vtc__ZN3aaa9GG1322221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322222  : ::aaa::EE132 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13222223barEv
  ~GG1322222(); // tgen
  GG1322222(); // tgen
};
//SIG(1 _ZN3aaa9GG1322222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13222223barEv");}
aaa::GG1322222 ::~GG1322222(){ note_dtor("_ZN3aaa9GG1322222E", this);} // tgen
aaa::GG1322222 ::GG1322222(){ note_ctor("_ZN3aaa9GG1322222E", this);} // tgen
}
static void Test__ZN3aaa9GG1322222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322222E, buf);
    ::aaa::GG1322222 *dp, &lv = *(dp=new (buf) ::aaa::GG1322222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322222E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1322222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1322222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1322222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322222E);
    dp->::aaa::GG1322222::~GG1322222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322222E(Test__ZN3aaa9GG1322222E, "_ZN3aaa9GG1322222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322222C1Ev();
extern void _ZN3aaa9GG1322222D1Ev();
Name_Map name_map__ZN3aaa9GG1322222E[] = {
  NSPAIR(_ZN3aaa9GG1322222C1Ev),
  NSPAIR(_ZN3aaa9GG1322222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1322222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13222223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222223barEv,_ZThn8_N3aaa9GG13222223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13222223barEv,_ZThn20_N3aaa9GG13222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13222223barEv,_ZThn28_N3aaa9GG13222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222223barEv,_ZThn8_N3aaa9GG13222223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222223barEv,_ZThn20_N3aaa9GG13222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13222223barEv,_ZThn28_N3aaa9GG13222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322222E[];
Class_Descriptor cd__ZN3aaa9GG1322222E = {  "_ZN3aaa9GG1322222E", // class name
  bases__ZN3aaa9GG1322222E, 6,
  &(vtc__ZN3aaa9GG1322222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322223  : ::aaa::EE132 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13222233fooEv
  virtual void  bar(); // _ZN3aaa9GG13222233barEv
  ~GG1322223(); // tgen
  GG1322223(); // tgen
};
//SIG(1 _ZN3aaa9GG1322223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13222233fooEv");}
void  aaa::GG1322223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13222233barEv");}
aaa::GG1322223 ::~GG1322223(){ note_dtor("_ZN3aaa9GG1322223E", this);} // tgen
aaa::GG1322223 ::GG1322223(){ note_ctor("_ZN3aaa9GG1322223E", this);} // tgen
}
static void Test__ZN3aaa9GG1322223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322223E, buf);
    ::aaa::GG1322223 *dp, &lv = *(dp=new (buf) ::aaa::GG1322223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322223E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1322223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1322223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1322223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322223E);
    dp->::aaa::GG1322223::~GG1322223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322223E(Test__ZN3aaa9GG1322223E, "_ZN3aaa9GG1322223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322223C1Ev();
extern void _ZN3aaa9GG1322223D1Ev();
Name_Map name_map__ZN3aaa9GG1322223E[] = {
  NSPAIR(_ZN3aaa9GG1322223C1Ev),
  NSPAIR(_ZN3aaa9GG1322223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1322223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322223E[];
extern void _ZN3aaa9GG13222233fooEv();
extern void _ZN3aaa9GG13222233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222233fooEv,_ZThn8_N3aaa9GG13222233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13222233barEv,_ZThn8_N3aaa9GG13222233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13222233barEv,_ZThn20_N3aaa9GG13222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13222233barEv,_ZThn28_N3aaa9GG13222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13222233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13222233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222233fooEv,_ZThn8_N3aaa9GG13222233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222233barEv,_ZThn8_N3aaa9GG13222233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222233barEv,_ZThn20_N3aaa9GG13222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13222233barEv,_ZThn28_N3aaa9GG13222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322223E[];
Class_Descriptor cd__ZN3aaa9GG1322223E = {  "_ZN3aaa9GG1322223E", // class name
  bases__ZN3aaa9GG1322223E, 6,
  &(vtc__ZN3aaa9GG1322223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322231  : ::aaa::EE132 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13222313fooEv
  ~GG1322231(); // tgen
  GG1322231(); // tgen
};
//SIG(1 _ZN3aaa9GG1322231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13222313fooEv");}
aaa::GG1322231 ::~GG1322231(){ note_dtor("_ZN3aaa9GG1322231E", this);} // tgen
aaa::GG1322231 ::GG1322231(){ note_ctor("_ZN3aaa9GG1322231E", this);} // tgen
}
static void Test__ZN3aaa9GG1322231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322231E, buf);
    ::aaa::GG1322231 *dp, &lv = *(dp=new (buf) ::aaa::GG1322231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322231E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1322231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1322231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1322231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322231E);
    dp->::aaa::GG1322231::~GG1322231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322231E(Test__ZN3aaa9GG1322231E, "_ZN3aaa9GG1322231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322231C1Ev();
extern void _ZN3aaa9GG1322231D1Ev();
Name_Map name_map__ZN3aaa9GG1322231E[] = {
  NSPAIR(_ZN3aaa9GG1322231C1Ev),
  NSPAIR(_ZN3aaa9GG1322231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1322231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322231E[];
extern void _ZN3aaa9GG13222313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222313fooEv,_ZThn8_N3aaa9GG13222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13222313fooEv,_ZThn20_N3aaa9GG13222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13222313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222313fooEv,_ZThn8_N3aaa9GG13222313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222313fooEv,_ZThn20_N3aaa9GG13222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322231E[];
Class_Descriptor cd__ZN3aaa9GG1322231E = {  "_ZN3aaa9GG1322231E", // class name
  bases__ZN3aaa9GG1322231E, 6,
  &(vtc__ZN3aaa9GG1322231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322232  : ::aaa::EE132 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13222323barEv
  ~GG1322232(); // tgen
  GG1322232(); // tgen
};
//SIG(1 _ZN3aaa9GG1322232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13222323barEv");}
aaa::GG1322232 ::~GG1322232(){ note_dtor("_ZN3aaa9GG1322232E", this);} // tgen
aaa::GG1322232 ::GG1322232(){ note_ctor("_ZN3aaa9GG1322232E", this);} // tgen
}
static void Test__ZN3aaa9GG1322232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322232E, buf);
    ::aaa::GG1322232 *dp, &lv = *(dp=new (buf) ::aaa::GG1322232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322232E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1322232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1322232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1322232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322232E);
    dp->::aaa::GG1322232::~GG1322232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322232E(Test__ZN3aaa9GG1322232E, "_ZN3aaa9GG1322232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322232C1Ev();
extern void _ZN3aaa9GG1322232D1Ev();
Name_Map name_map__ZN3aaa9GG1322232E[] = {
  NSPAIR(_ZN3aaa9GG1322232C1Ev),
  NSPAIR(_ZN3aaa9GG1322232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1322232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13222323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222323barEv,_ZThn8_N3aaa9GG13222323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13222323barEv,_ZThn20_N3aaa9GG13222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13222323barEv,_ZThn28_N3aaa9GG13222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222323barEv,_ZThn8_N3aaa9GG13222323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222323barEv,_ZThn20_N3aaa9GG13222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13222323barEv,_ZThn28_N3aaa9GG13222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322232E[];
Class_Descriptor cd__ZN3aaa9GG1322232E = {  "_ZN3aaa9GG1322232E", // class name
  bases__ZN3aaa9GG1322232E, 6,
  &(vtc__ZN3aaa9GG1322232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322233  : ::aaa::EE132 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13222333fooEv
  virtual void  bar(); // _ZN3aaa9GG13222333barEv
  ~GG1322233(); // tgen
  GG1322233(); // tgen
};
//SIG(1 _ZN3aaa9GG1322233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13222333fooEv");}
void  aaa::GG1322233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13222333barEv");}
aaa::GG1322233 ::~GG1322233(){ note_dtor("_ZN3aaa9GG1322233E", this);} // tgen
aaa::GG1322233 ::GG1322233(){ note_ctor("_ZN3aaa9GG1322233E", this);} // tgen
}
static void Test__ZN3aaa9GG1322233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322233E, buf);
    ::aaa::GG1322233 *dp, &lv = *(dp=new (buf) ::aaa::GG1322233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322233E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1322233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1322233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1322233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322233E);
    dp->::aaa::GG1322233::~GG1322233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322233E(Test__ZN3aaa9GG1322233E, "_ZN3aaa9GG1322233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322233C1Ev();
extern void _ZN3aaa9GG1322233D1Ev();
Name_Map name_map__ZN3aaa9GG1322233E[] = {
  NSPAIR(_ZN3aaa9GG1322233C1Ev),
  NSPAIR(_ZN3aaa9GG1322233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1322233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322233E[];
extern void _ZN3aaa9GG13222333fooEv();
extern void _ZN3aaa9GG13222333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13222333fooEv,_ZThn8_N3aaa9GG13222333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13222333barEv,_ZThn8_N3aaa9GG13222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13222333barEv,_ZThn20_N3aaa9GG13222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13222333fooEv,_ZThn20_N3aaa9GG13222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13222333barEv,_ZThn28_N3aaa9GG13222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13222333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13222333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222333fooEv,_ZThn8_N3aaa9GG13222333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13222333barEv,_ZThn8_N3aaa9GG13222333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222333barEv,_ZThn20_N3aaa9GG13222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13222333fooEv,_ZThn20_N3aaa9GG13222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13222333barEv,_ZThn28_N3aaa9GG13222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322233E[];
Class_Descriptor cd__ZN3aaa9GG1322233E = {  "_ZN3aaa9GG1322233E", // class name
  bases__ZN3aaa9GG1322233E, 6,
  &(vtc__ZN3aaa9GG1322233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322311  : ::aaa::EE132 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13223113fooEv
  ~GG1322311(); // tgen
  GG1322311(); // tgen
};
//SIG(1 _ZN3aaa9GG1322311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13223113fooEv");}
aaa::GG1322311 ::~GG1322311(){ note_dtor("_ZN3aaa9GG1322311E", this);} // tgen
aaa::GG1322311 ::GG1322311(){ note_ctor("_ZN3aaa9GG1322311E", this);} // tgen
}
static void Test__ZN3aaa9GG1322311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322311E, buf);
    ::aaa::GG1322311 *dp, &lv = *(dp=new (buf) ::aaa::GG1322311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322311E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1322311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1322311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1322311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322311E);
    dp->::aaa::GG1322311::~GG1322311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322311E(Test__ZN3aaa9GG1322311E, "_ZN3aaa9GG1322311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322311C1Ev();
extern void _ZN3aaa9GG1322311D1Ev();
Name_Map name_map__ZN3aaa9GG1322311E[] = {
  NSPAIR(_ZN3aaa9GG1322311C1Ev),
  NSPAIR(_ZN3aaa9GG1322311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1322311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322311E[];
extern void _ZN3aaa9GG13223113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223113fooEv,_ZThn8_N3aaa9GG13223113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13223113fooEv,_ZThn20_N3aaa9GG13223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223113fooEv,_ZThn28_N3aaa9GG13223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13223113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223113fooEv,_ZThn8_N3aaa9GG13223113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223113fooEv,_ZThn20_N3aaa9GG13223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223113fooEv,_ZThn28_N3aaa9GG13223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322311E[];
Class_Descriptor cd__ZN3aaa9GG1322311E = {  "_ZN3aaa9GG1322311E", // class name
  bases__ZN3aaa9GG1322311E, 6,
  &(vtc__ZN3aaa9GG1322311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322312  : ::aaa::EE132 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13223123barEv
  ~GG1322312(); // tgen
  GG1322312(); // tgen
};
//SIG(1 _ZN3aaa9GG1322312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13223123barEv");}
aaa::GG1322312 ::~GG1322312(){ note_dtor("_ZN3aaa9GG1322312E", this);} // tgen
aaa::GG1322312 ::GG1322312(){ note_ctor("_ZN3aaa9GG1322312E", this);} // tgen
}
static void Test__ZN3aaa9GG1322312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322312E, buf);
    ::aaa::GG1322312 *dp, &lv = *(dp=new (buf) ::aaa::GG1322312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322312E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1322312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1322312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1322312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322312E);
    dp->::aaa::GG1322312::~GG1322312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322312E(Test__ZN3aaa9GG1322312E, "_ZN3aaa9GG1322312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322312C1Ev();
extern void _ZN3aaa9GG1322312D1Ev();
Name_Map name_map__ZN3aaa9GG1322312E[] = {
  NSPAIR(_ZN3aaa9GG1322312C1Ev),
  NSPAIR(_ZN3aaa9GG1322312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1322312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13223123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223123barEv,_ZThn8_N3aaa9GG13223123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13223123barEv,_ZThn20_N3aaa9GG13223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223123barEv,_ZThn28_N3aaa9GG13223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223123barEv,_ZThn8_N3aaa9GG13223123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223123barEv,_ZThn20_N3aaa9GG13223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223123barEv,_ZThn28_N3aaa9GG13223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322312E[];
Class_Descriptor cd__ZN3aaa9GG1322312E = {  "_ZN3aaa9GG1322312E", // class name
  bases__ZN3aaa9GG1322312E, 6,
  &(vtc__ZN3aaa9GG1322312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322313  : ::aaa::EE132 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13223133fooEv
  virtual void  bar(); // _ZN3aaa9GG13223133barEv
  ~GG1322313(); // tgen
  GG1322313(); // tgen
};
//SIG(1 _ZN3aaa9GG1322313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13223133fooEv");}
void  aaa::GG1322313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13223133barEv");}
aaa::GG1322313 ::~GG1322313(){ note_dtor("_ZN3aaa9GG1322313E", this);} // tgen
aaa::GG1322313 ::GG1322313(){ note_ctor("_ZN3aaa9GG1322313E", this);} // tgen
}
static void Test__ZN3aaa9GG1322313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322313E, buf);
    ::aaa::GG1322313 *dp, &lv = *(dp=new (buf) ::aaa::GG1322313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322313E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1322313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1322313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1322313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322313E);
    dp->::aaa::GG1322313::~GG1322313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322313E(Test__ZN3aaa9GG1322313E, "_ZN3aaa9GG1322313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322313C1Ev();
extern void _ZN3aaa9GG1322313D1Ev();
Name_Map name_map__ZN3aaa9GG1322313E[] = {
  NSPAIR(_ZN3aaa9GG1322313C1Ev),
  NSPAIR(_ZN3aaa9GG1322313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1322313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322313E[];
extern void _ZN3aaa9GG13223133fooEv();
extern void _ZN3aaa9GG13223133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223133fooEv,_ZThn8_N3aaa9GG13223133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13223133barEv,_ZThn8_N3aaa9GG13223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13223133barEv,_ZThn20_N3aaa9GG13223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13223133fooEv,_ZThn20_N3aaa9GG13223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223133fooEv,_ZThn28_N3aaa9GG13223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223133barEv,_ZThn28_N3aaa9GG13223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13223133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13223133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223133fooEv,_ZThn8_N3aaa9GG13223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223133barEv,_ZThn8_N3aaa9GG13223133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223133barEv,_ZThn20_N3aaa9GG13223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223133fooEv,_ZThn20_N3aaa9GG13223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223133fooEv,_ZThn28_N3aaa9GG13223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223133barEv,_ZThn28_N3aaa9GG13223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322313E[];
Class_Descriptor cd__ZN3aaa9GG1322313E = {  "_ZN3aaa9GG1322313E", // class name
  bases__ZN3aaa9GG1322313E, 6,
  &(vtc__ZN3aaa9GG1322313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322321  : ::aaa::EE132 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13223213fooEv
  ~GG1322321(); // tgen
  GG1322321(); // tgen
};
//SIG(1 _ZN3aaa9GG1322321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13223213fooEv");}
aaa::GG1322321 ::~GG1322321(){ note_dtor("_ZN3aaa9GG1322321E", this);} // tgen
aaa::GG1322321 ::GG1322321(){ note_ctor("_ZN3aaa9GG1322321E", this);} // tgen
}
static void Test__ZN3aaa9GG1322321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322321E, buf);
    ::aaa::GG1322321 *dp, &lv = *(dp=new (buf) ::aaa::GG1322321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322321E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1322321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1322321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1322321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322321E);
    dp->::aaa::GG1322321::~GG1322321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322321E(Test__ZN3aaa9GG1322321E, "_ZN3aaa9GG1322321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322321C1Ev();
extern void _ZN3aaa9GG1322321D1Ev();
Name_Map name_map__ZN3aaa9GG1322321E[] = {
  NSPAIR(_ZN3aaa9GG1322321C1Ev),
  NSPAIR(_ZN3aaa9GG1322321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1322321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322321E[];
extern void _ZN3aaa9GG13223213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223213fooEv,_ZThn8_N3aaa9GG13223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13223213fooEv,_ZThn28_N3aaa9GG13223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13223213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223213fooEv,_ZThn8_N3aaa9GG13223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223213fooEv,_ZThn28_N3aaa9GG13223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322321E[];
Class_Descriptor cd__ZN3aaa9GG1322321E = {  "_ZN3aaa9GG1322321E", // class name
  bases__ZN3aaa9GG1322321E, 6,
  &(vtc__ZN3aaa9GG1322321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322322  : ::aaa::EE132 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13223223barEv
  ~GG1322322(); // tgen
  GG1322322(); // tgen
};
//SIG(1 _ZN3aaa9GG1322322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13223223barEv");}
aaa::GG1322322 ::~GG1322322(){ note_dtor("_ZN3aaa9GG1322322E", this);} // tgen
aaa::GG1322322 ::GG1322322(){ note_ctor("_ZN3aaa9GG1322322E", this);} // tgen
}
static void Test__ZN3aaa9GG1322322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322322E, buf);
    ::aaa::GG1322322 *dp, &lv = *(dp=new (buf) ::aaa::GG1322322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322322E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1322322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1322322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1322322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322322E);
    dp->::aaa::GG1322322::~GG1322322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322322E(Test__ZN3aaa9GG1322322E, "_ZN3aaa9GG1322322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322322C1Ev();
extern void _ZN3aaa9GG1322322D1Ev();
Name_Map name_map__ZN3aaa9GG1322322E[] = {
  NSPAIR(_ZN3aaa9GG1322322C1Ev),
  NSPAIR(_ZN3aaa9GG1322322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1322322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13223223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223223barEv,_ZThn8_N3aaa9GG13223223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13223223barEv,_ZThn20_N3aaa9GG13223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13223223barEv,_ZThn28_N3aaa9GG13223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223223barEv,_ZThn8_N3aaa9GG13223223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223223barEv,_ZThn20_N3aaa9GG13223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223223barEv,_ZThn28_N3aaa9GG13223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322322E[];
Class_Descriptor cd__ZN3aaa9GG1322322E = {  "_ZN3aaa9GG1322322E", // class name
  bases__ZN3aaa9GG1322322E, 6,
  &(vtc__ZN3aaa9GG1322322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322323  : ::aaa::EE132 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13223233fooEv
  virtual void  bar(); // _ZN3aaa9GG13223233barEv
  ~GG1322323(); // tgen
  GG1322323(); // tgen
};
//SIG(1 _ZN3aaa9GG1322323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13223233fooEv");}
void  aaa::GG1322323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13223233barEv");}
aaa::GG1322323 ::~GG1322323(){ note_dtor("_ZN3aaa9GG1322323E", this);} // tgen
aaa::GG1322323 ::GG1322323(){ note_ctor("_ZN3aaa9GG1322323E", this);} // tgen
}
static void Test__ZN3aaa9GG1322323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322323E, buf);
    ::aaa::GG1322323 *dp, &lv = *(dp=new (buf) ::aaa::GG1322323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322323E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1322323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1322323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1322323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322323E);
    dp->::aaa::GG1322323::~GG1322323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322323E(Test__ZN3aaa9GG1322323E, "_ZN3aaa9GG1322323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322323C1Ev();
extern void _ZN3aaa9GG1322323D1Ev();
Name_Map name_map__ZN3aaa9GG1322323E[] = {
  NSPAIR(_ZN3aaa9GG1322323C1Ev),
  NSPAIR(_ZN3aaa9GG1322323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1322323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322323E[];
extern void _ZN3aaa9GG13223233fooEv();
extern void _ZN3aaa9GG13223233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223233fooEv,_ZThn8_N3aaa9GG13223233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13223233barEv,_ZThn8_N3aaa9GG13223233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13223233barEv,_ZThn20_N3aaa9GG13223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223233fooEv,_ZThn28_N3aaa9GG13223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223233barEv,_ZThn28_N3aaa9GG13223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13223233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13223233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223233fooEv,_ZThn8_N3aaa9GG13223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223233barEv,_ZThn8_N3aaa9GG13223233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223233barEv,_ZThn20_N3aaa9GG13223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223233fooEv,_ZThn28_N3aaa9GG13223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223233barEv,_ZThn28_N3aaa9GG13223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322323E[];
Class_Descriptor cd__ZN3aaa9GG1322323E = {  "_ZN3aaa9GG1322323E", // class name
  bases__ZN3aaa9GG1322323E, 6,
  &(vtc__ZN3aaa9GG1322323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322331  : ::aaa::EE132 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13223313fooEv
  ~GG1322331(); // tgen
  GG1322331(); // tgen
};
//SIG(1 _ZN3aaa9GG1322331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13223313fooEv");}
aaa::GG1322331 ::~GG1322331(){ note_dtor("_ZN3aaa9GG1322331E", this);} // tgen
aaa::GG1322331 ::GG1322331(){ note_ctor("_ZN3aaa9GG1322331E", this);} // tgen
}
static void Test__ZN3aaa9GG1322331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322331E, buf);
    ::aaa::GG1322331 *dp, &lv = *(dp=new (buf) ::aaa::GG1322331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322331E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1322331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1322331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1322331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322331E);
    dp->::aaa::GG1322331::~GG1322331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322331E(Test__ZN3aaa9GG1322331E, "_ZN3aaa9GG1322331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322331C1Ev();
extern void _ZN3aaa9GG1322331D1Ev();
Name_Map name_map__ZN3aaa9GG1322331E[] = {
  NSPAIR(_ZN3aaa9GG1322331C1Ev),
  NSPAIR(_ZN3aaa9GG1322331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1322331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322331E[];
extern void _ZN3aaa9GG13223313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223313fooEv,_ZThn8_N3aaa9GG13223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13223313fooEv,_ZThn20_N3aaa9GG13223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223313fooEv,_ZThn28_N3aaa9GG13223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13223313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223313fooEv,_ZThn8_N3aaa9GG13223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223313fooEv,_ZThn20_N3aaa9GG13223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223313fooEv,_ZThn28_N3aaa9GG13223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322331E[];
Class_Descriptor cd__ZN3aaa9GG1322331E = {  "_ZN3aaa9GG1322331E", // class name
  bases__ZN3aaa9GG1322331E, 6,
  &(vtc__ZN3aaa9GG1322331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322332  : ::aaa::EE132 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13223323barEv
  ~GG1322332(); // tgen
  GG1322332(); // tgen
};
//SIG(1 _ZN3aaa9GG1322332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1322332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13223323barEv");}
aaa::GG1322332 ::~GG1322332(){ note_dtor("_ZN3aaa9GG1322332E", this);} // tgen
aaa::GG1322332 ::GG1322332(){ note_ctor("_ZN3aaa9GG1322332E", this);} // tgen
}
static void Test__ZN3aaa9GG1322332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322332E, buf);
    ::aaa::GG1322332 *dp, &lv = *(dp=new (buf) ::aaa::GG1322332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322332E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1322332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1322332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1322332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322332E);
    dp->::aaa::GG1322332::~GG1322332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322332E(Test__ZN3aaa9GG1322332E, "_ZN3aaa9GG1322332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322332C1Ev();
extern void _ZN3aaa9GG1322332D1Ev();
Name_Map name_map__ZN3aaa9GG1322332E[] = {
  NSPAIR(_ZN3aaa9GG1322332C1Ev),
  NSPAIR(_ZN3aaa9GG1322332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1322332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13223323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223323barEv,_ZThn8_N3aaa9GG13223323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13223323barEv,_ZThn20_N3aaa9GG13223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223323barEv,_ZThn28_N3aaa9GG13223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223323barEv,_ZThn8_N3aaa9GG13223323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223323barEv,_ZThn20_N3aaa9GG13223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223323barEv,_ZThn28_N3aaa9GG13223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322332E[];
Class_Descriptor cd__ZN3aaa9GG1322332E = {  "_ZN3aaa9GG1322332E", // class name
  bases__ZN3aaa9GG1322332E, 6,
  &(vtc__ZN3aaa9GG1322332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1322333  : ::aaa::EE132 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13223333fooEv
  virtual void  bar(); // _ZN3aaa9GG13223333barEv
  ~GG1322333(); // tgen
  GG1322333(); // tgen
};
//SIG(1 _ZN3aaa9GG1322333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1322333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13223333fooEv");}
void  aaa::GG1322333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13223333barEv");}
aaa::GG1322333 ::~GG1322333(){ note_dtor("_ZN3aaa9GG1322333E", this);} // tgen
aaa::GG1322333 ::GG1322333(){ note_ctor("_ZN3aaa9GG1322333E", this);} // tgen
}
static void Test__ZN3aaa9GG1322333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1322333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1322333E, buf);
    ::aaa::GG1322333 *dp, &lv = *(dp=new (buf) ::aaa::GG1322333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1322333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1322333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1322333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1322333E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1322333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1322333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1322333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1322333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1322333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1322333E);
    dp->::aaa::GG1322333::~GG1322333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1322333E(Test__ZN3aaa9GG1322333E, "_ZN3aaa9GG1322333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1322333C1Ev();
extern void _ZN3aaa9GG1322333D1Ev();
Name_Map name_map__ZN3aaa9GG1322333E[] = {
  NSPAIR(_ZN3aaa9GG1322333C1Ev),
  NSPAIR(_ZN3aaa9GG1322333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1322333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1322333E[];
extern void _ZN3aaa9GG13223333fooEv();
extern void _ZN3aaa9GG13223333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13223333fooEv,_ZThn8_N3aaa9GG13223333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13223333barEv,_ZThn8_N3aaa9GG13223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13223333barEv,_ZThn20_N3aaa9GG13223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13223333fooEv,_ZThn20_N3aaa9GG13223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223333fooEv,_ZThn28_N3aaa9GG13223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13223333barEv,_ZThn28_N3aaa9GG13223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1322333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13223333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13223333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223333fooEv,_ZThn8_N3aaa9GG13223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13223333barEv,_ZThn8_N3aaa9GG13223333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223333barEv,_ZThn20_N3aaa9GG13223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13223333fooEv,_ZThn20_N3aaa9GG13223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223333fooEv,_ZThn28_N3aaa9GG13223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13223333barEv,_ZThn28_N3aaa9GG13223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1322333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1322333E[];
Class_Descriptor cd__ZN3aaa9GG1322333E = {  "_ZN3aaa9GG1322333E", // class name
  bases__ZN3aaa9GG1322333E, 6,
  &(vtc__ZN3aaa9GG1322333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1322333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1322333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323111  : ::aaa::EE132 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13231113fooEv
  ~GG1323111(); // tgen
  GG1323111(); // tgen
};
//SIG(1 _ZN3aaa9GG1323111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13231113fooEv");}
aaa::GG1323111 ::~GG1323111(){ note_dtor("_ZN3aaa9GG1323111E", this);} // tgen
aaa::GG1323111 ::GG1323111(){ note_ctor("_ZN3aaa9GG1323111E", this);} // tgen
}
static void Test__ZN3aaa9GG1323111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323111E, buf);
    ::aaa::GG1323111 *dp, &lv = *(dp=new (buf) ::aaa::GG1323111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323111E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1323111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1323111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1323111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323111E);
    dp->::aaa::GG1323111::~GG1323111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323111E(Test__ZN3aaa9GG1323111E, "_ZN3aaa9GG1323111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323111C1Ev();
extern void _ZN3aaa9GG1323111D1Ev();
Name_Map name_map__ZN3aaa9GG1323111E[] = {
  NSPAIR(_ZN3aaa9GG1323111C1Ev),
  NSPAIR(_ZN3aaa9GG1323111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1323111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323111E[];
extern void _ZN3aaa9GG13231113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231113fooEv,_ZThn8_N3aaa9GG13231113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231113fooEv,_ZThn20_N3aaa9GG13231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13231113fooEv,_ZThn28_N3aaa9GG13231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13231113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231113fooEv,_ZThn8_N3aaa9GG13231113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231113fooEv,_ZThn20_N3aaa9GG13231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13231113fooEv,_ZThn28_N3aaa9GG13231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323111E[];
Class_Descriptor cd__ZN3aaa9GG1323111E = {  "_ZN3aaa9GG1323111E", // class name
  bases__ZN3aaa9GG1323111E, 6,
  &(vtc__ZN3aaa9GG1323111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323112  : ::aaa::EE132 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13231123barEv
  ~GG1323112(); // tgen
  GG1323112(); // tgen
};
//SIG(1 _ZN3aaa9GG1323112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13231123barEv");}
aaa::GG1323112 ::~GG1323112(){ note_dtor("_ZN3aaa9GG1323112E", this);} // tgen
aaa::GG1323112 ::GG1323112(){ note_ctor("_ZN3aaa9GG1323112E", this);} // tgen
}
static void Test__ZN3aaa9GG1323112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323112E, buf);
    ::aaa::GG1323112 *dp, &lv = *(dp=new (buf) ::aaa::GG1323112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323112E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1323112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1323112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1323112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323112E);
    dp->::aaa::GG1323112::~GG1323112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323112E(Test__ZN3aaa9GG1323112E, "_ZN3aaa9GG1323112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323112C1Ev();
extern void _ZN3aaa9GG1323112D1Ev();
Name_Map name_map__ZN3aaa9GG1323112E[] = {
  NSPAIR(_ZN3aaa9GG1323112C1Ev),
  NSPAIR(_ZN3aaa9GG1323112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1323112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323112E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13231123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231123barEv,_ZThn8_N3aaa9GG13231123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13231123barEv,_ZThn20_N3aaa9GG13231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231123barEv,_ZThn8_N3aaa9GG13231123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231123barEv,_ZThn20_N3aaa9GG13231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323112E[];
Class_Descriptor cd__ZN3aaa9GG1323112E = {  "_ZN3aaa9GG1323112E", // class name
  bases__ZN3aaa9GG1323112E, 6,
  &(vtc__ZN3aaa9GG1323112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323113  : ::aaa::EE132 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13231133fooEv
  virtual void  bar(); // _ZN3aaa9GG13231133barEv
  ~GG1323113(); // tgen
  GG1323113(); // tgen
};
//SIG(1 _ZN3aaa9GG1323113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13231133fooEv");}
void  aaa::GG1323113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13231133barEv");}
aaa::GG1323113 ::~GG1323113(){ note_dtor("_ZN3aaa9GG1323113E", this);} // tgen
aaa::GG1323113 ::GG1323113(){ note_ctor("_ZN3aaa9GG1323113E", this);} // tgen
}
static void Test__ZN3aaa9GG1323113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323113E, buf);
    ::aaa::GG1323113 *dp, &lv = *(dp=new (buf) ::aaa::GG1323113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323113E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1323113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1323113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1323113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323113E);
    dp->::aaa::GG1323113::~GG1323113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323113E(Test__ZN3aaa9GG1323113E, "_ZN3aaa9GG1323113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323113C1Ev();
extern void _ZN3aaa9GG1323113D1Ev();
Name_Map name_map__ZN3aaa9GG1323113E[] = {
  NSPAIR(_ZN3aaa9GG1323113C1Ev),
  NSPAIR(_ZN3aaa9GG1323113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1323113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323113E[];
extern void _ZN3aaa9GG13231133fooEv();
extern void _ZN3aaa9GG13231133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231133fooEv,_ZThn8_N3aaa9GG13231133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13231133barEv,_ZThn8_N3aaa9GG13231133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231133fooEv,_ZThn20_N3aaa9GG13231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231133barEv,_ZThn20_N3aaa9GG13231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13231133fooEv,_ZThn28_N3aaa9GG13231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13231133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13231133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231133fooEv,_ZThn8_N3aaa9GG13231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231133barEv,_ZThn8_N3aaa9GG13231133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231133fooEv,_ZThn20_N3aaa9GG13231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231133barEv,_ZThn20_N3aaa9GG13231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13231133fooEv,_ZThn28_N3aaa9GG13231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323113E[];
Class_Descriptor cd__ZN3aaa9GG1323113E = {  "_ZN3aaa9GG1323113E", // class name
  bases__ZN3aaa9GG1323113E, 6,
  &(vtc__ZN3aaa9GG1323113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323121  : ::aaa::EE132 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13231213fooEv
  ~GG1323121(); // tgen
  GG1323121(); // tgen
};
//SIG(1 _ZN3aaa9GG1323121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13231213fooEv");}
aaa::GG1323121 ::~GG1323121(){ note_dtor("_ZN3aaa9GG1323121E", this);} // tgen
aaa::GG1323121 ::GG1323121(){ note_ctor("_ZN3aaa9GG1323121E", this);} // tgen
}
static void Test__ZN3aaa9GG1323121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323121E, buf);
    ::aaa::GG1323121 *dp, &lv = *(dp=new (buf) ::aaa::GG1323121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323121E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1323121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1323121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1323121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323121E);
    dp->::aaa::GG1323121::~GG1323121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323121E(Test__ZN3aaa9GG1323121E, "_ZN3aaa9GG1323121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323121C1Ev();
extern void _ZN3aaa9GG1323121D1Ev();
Name_Map name_map__ZN3aaa9GG1323121E[] = {
  NSPAIR(_ZN3aaa9GG1323121C1Ev),
  NSPAIR(_ZN3aaa9GG1323121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1323121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323121E[];
extern void _ZN3aaa9GG13231213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231213fooEv,_ZThn8_N3aaa9GG13231213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231213fooEv,_ZThn20_N3aaa9GG13231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13231213fooEv,_ZThn28_N3aaa9GG13231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13231213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231213fooEv,_ZThn8_N3aaa9GG13231213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231213fooEv,_ZThn20_N3aaa9GG13231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13231213fooEv,_ZThn28_N3aaa9GG13231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323121E[];
Class_Descriptor cd__ZN3aaa9GG1323121E = {  "_ZN3aaa9GG1323121E", // class name
  bases__ZN3aaa9GG1323121E, 6,
  &(vtc__ZN3aaa9GG1323121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323122  : ::aaa::EE132 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13231223barEv
  ~GG1323122(); // tgen
  GG1323122(); // tgen
};
//SIG(1 _ZN3aaa9GG1323122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v5 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13231223barEv");}
aaa::GG1323122 ::~GG1323122(){ note_dtor("_ZN3aaa9GG1323122E", this);} // tgen
aaa::GG1323122 ::GG1323122(){ note_ctor("_ZN3aaa9GG1323122E", this);} // tgen
}
static void Test__ZN3aaa9GG1323122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323122E, buf);
    ::aaa::GG1323122 *dp, &lv = *(dp=new (buf) ::aaa::GG1323122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323122E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1323122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1323122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1323122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323122E);
    dp->::aaa::GG1323122::~GG1323122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323122E(Test__ZN3aaa9GG1323122E, "_ZN3aaa9GG1323122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323122C1Ev();
extern void _ZN3aaa9GG1323122D1Ev();
Name_Map name_map__ZN3aaa9GG1323122E[] = {
  NSPAIR(_ZN3aaa9GG1323122C1Ev),
  NSPAIR(_ZN3aaa9GG1323122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1323122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323122E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13231223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231223barEv,_ZThn8_N3aaa9GG13231223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13231223barEv,_ZThn20_N3aaa9GG13231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231223barEv,_ZThn8_N3aaa9GG13231223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231223barEv,_ZThn20_N3aaa9GG13231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323122E[];
Class_Descriptor cd__ZN3aaa9GG1323122E = {  "_ZN3aaa9GG1323122E", // class name
  bases__ZN3aaa9GG1323122E, 6,
  &(vtc__ZN3aaa9GG1323122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323123  : ::aaa::EE132 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13231233fooEv
  virtual void  bar(); // _ZN3aaa9GG13231233barEv
  ~GG1323123(); // tgen
  GG1323123(); // tgen
};
//SIG(1 _ZN3aaa9GG1323123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13231233fooEv");}
void  aaa::GG1323123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13231233barEv");}
aaa::GG1323123 ::~GG1323123(){ note_dtor("_ZN3aaa9GG1323123E", this);} // tgen
aaa::GG1323123 ::GG1323123(){ note_ctor("_ZN3aaa9GG1323123E", this);} // tgen
}
static void Test__ZN3aaa9GG1323123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323123E, buf);
    ::aaa::GG1323123 *dp, &lv = *(dp=new (buf) ::aaa::GG1323123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323123E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1323123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1323123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1323123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323123E);
    dp->::aaa::GG1323123::~GG1323123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323123E(Test__ZN3aaa9GG1323123E, "_ZN3aaa9GG1323123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323123C1Ev();
extern void _ZN3aaa9GG1323123D1Ev();
Name_Map name_map__ZN3aaa9GG1323123E[] = {
  NSPAIR(_ZN3aaa9GG1323123C1Ev),
  NSPAIR(_ZN3aaa9GG1323123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1323123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323123E[];
extern void _ZN3aaa9GG13231233fooEv();
extern void _ZN3aaa9GG13231233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231233fooEv,_ZThn8_N3aaa9GG13231233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13231233barEv,_ZThn8_N3aaa9GG13231233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231233fooEv,_ZThn20_N3aaa9GG13231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231233barEv,_ZThn20_N3aaa9GG13231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13231233fooEv,_ZThn28_N3aaa9GG13231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13231233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13231233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231233fooEv,_ZThn8_N3aaa9GG13231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231233barEv,_ZThn8_N3aaa9GG13231233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231233fooEv,_ZThn20_N3aaa9GG13231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231233barEv,_ZThn20_N3aaa9GG13231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13231233fooEv,_ZThn28_N3aaa9GG13231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323123E[];
Class_Descriptor cd__ZN3aaa9GG1323123E = {  "_ZN3aaa9GG1323123E", // class name
  bases__ZN3aaa9GG1323123E, 6,
  &(vtc__ZN3aaa9GG1323123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323131  : ::aaa::EE132 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13231313fooEv
  ~GG1323131(); // tgen
  GG1323131(); // tgen
};
//SIG(1 _ZN3aaa9GG1323131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13231313fooEv");}
aaa::GG1323131 ::~GG1323131(){ note_dtor("_ZN3aaa9GG1323131E", this);} // tgen
aaa::GG1323131 ::GG1323131(){ note_ctor("_ZN3aaa9GG1323131E", this);} // tgen
}
static void Test__ZN3aaa9GG1323131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323131E, buf);
    ::aaa::GG1323131 *dp, &lv = *(dp=new (buf) ::aaa::GG1323131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323131E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1323131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1323131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1323131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323131E);
    dp->::aaa::GG1323131::~GG1323131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323131E(Test__ZN3aaa9GG1323131E, "_ZN3aaa9GG1323131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323131C1Ev();
extern void _ZN3aaa9GG1323131D1Ev();
Name_Map name_map__ZN3aaa9GG1323131E[] = {
  NSPAIR(_ZN3aaa9GG1323131C1Ev),
  NSPAIR(_ZN3aaa9GG1323131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1323131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323131E[];
extern void _ZN3aaa9GG13231313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231313fooEv,_ZThn8_N3aaa9GG13231313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231313fooEv,_ZThn20_N3aaa9GG13231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13231313fooEv,_ZThn28_N3aaa9GG13231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13231313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231313fooEv,_ZThn8_N3aaa9GG13231313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231313fooEv,_ZThn20_N3aaa9GG13231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13231313fooEv,_ZThn28_N3aaa9GG13231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323131E[];
Class_Descriptor cd__ZN3aaa9GG1323131E = {  "_ZN3aaa9GG1323131E", // class name
  bases__ZN3aaa9GG1323131E, 6,
  &(vtc__ZN3aaa9GG1323131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323132  : ::aaa::EE132 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13231323barEv
  ~GG1323132(); // tgen
  GG1323132(); // tgen
};
//SIG(1 _ZN3aaa9GG1323132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v4 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13231323barEv");}
aaa::GG1323132 ::~GG1323132(){ note_dtor("_ZN3aaa9GG1323132E", this);} // tgen
aaa::GG1323132 ::GG1323132(){ note_ctor("_ZN3aaa9GG1323132E", this);} // tgen
}
static void Test__ZN3aaa9GG1323132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323132E, buf);
    ::aaa::GG1323132 *dp, &lv = *(dp=new (buf) ::aaa::GG1323132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323132E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1323132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1323132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1323132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323132E);
    dp->::aaa::GG1323132::~GG1323132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323132E(Test__ZN3aaa9GG1323132E, "_ZN3aaa9GG1323132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323132C1Ev();
extern void _ZN3aaa9GG1323132D1Ev();
Name_Map name_map__ZN3aaa9GG1323132E[] = {
  NSPAIR(_ZN3aaa9GG1323132C1Ev),
  NSPAIR(_ZN3aaa9GG1323132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1323132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323132E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13231323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231323barEv,_ZThn8_N3aaa9GG13231323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13231323barEv,_ZThn20_N3aaa9GG13231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231323barEv,_ZThn8_N3aaa9GG13231323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231323barEv,_ZThn20_N3aaa9GG13231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323132E[];
Class_Descriptor cd__ZN3aaa9GG1323132E = {  "_ZN3aaa9GG1323132E", // class name
  bases__ZN3aaa9GG1323132E, 6,
  &(vtc__ZN3aaa9GG1323132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323133  : ::aaa::EE132 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13231333fooEv
  virtual void  bar(); // _ZN3aaa9GG13231333barEv
  ~GG1323133(); // tgen
  GG1323133(); // tgen
};
//SIG(1 _ZN3aaa9GG1323133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13231333fooEv");}
void  aaa::GG1323133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13231333barEv");}
aaa::GG1323133 ::~GG1323133(){ note_dtor("_ZN3aaa9GG1323133E", this);} // tgen
aaa::GG1323133 ::GG1323133(){ note_ctor("_ZN3aaa9GG1323133E", this);} // tgen
}
static void Test__ZN3aaa9GG1323133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323133E, buf);
    ::aaa::GG1323133 *dp, &lv = *(dp=new (buf) ::aaa::GG1323133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323133E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1323133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1323133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1323133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323133E);
    dp->::aaa::GG1323133::~GG1323133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323133E(Test__ZN3aaa9GG1323133E, "_ZN3aaa9GG1323133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323133C1Ev();
extern void _ZN3aaa9GG1323133D1Ev();
Name_Map name_map__ZN3aaa9GG1323133E[] = {
  NSPAIR(_ZN3aaa9GG1323133C1Ev),
  NSPAIR(_ZN3aaa9GG1323133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1323133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323133E[];
extern void _ZN3aaa9GG13231333fooEv();
extern void _ZN3aaa9GG13231333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13231333fooEv,_ZThn8_N3aaa9GG13231333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13231333barEv,_ZThn8_N3aaa9GG13231333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231333fooEv,_ZThn20_N3aaa9GG13231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13231333barEv,_ZThn20_N3aaa9GG13231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13231333fooEv,_ZThn28_N3aaa9GG13231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13231333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13231333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231333fooEv,_ZThn8_N3aaa9GG13231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13231333barEv,_ZThn8_N3aaa9GG13231333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231333fooEv,_ZThn20_N3aaa9GG13231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13231333barEv,_ZThn20_N3aaa9GG13231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13231333fooEv,_ZThn28_N3aaa9GG13231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323133E[];
Class_Descriptor cd__ZN3aaa9GG1323133E = {  "_ZN3aaa9GG1323133E", // class name
  bases__ZN3aaa9GG1323133E, 6,
  &(vtc__ZN3aaa9GG1323133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323211  : ::aaa::EE132 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13232113fooEv
  ~GG1323211(); // tgen
  GG1323211(); // tgen
};
//SIG(1 _ZN3aaa9GG1323211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13232113fooEv");}
aaa::GG1323211 ::~GG1323211(){ note_dtor("_ZN3aaa9GG1323211E", this);} // tgen
aaa::GG1323211 ::GG1323211(){ note_ctor("_ZN3aaa9GG1323211E", this);} // tgen
}
static void Test__ZN3aaa9GG1323211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323211E, buf);
    ::aaa::GG1323211 *dp, &lv = *(dp=new (buf) ::aaa::GG1323211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323211E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1323211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1323211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1323211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323211E);
    dp->::aaa::GG1323211::~GG1323211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323211E(Test__ZN3aaa9GG1323211E, "_ZN3aaa9GG1323211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323211C1Ev();
extern void _ZN3aaa9GG1323211D1Ev();
Name_Map name_map__ZN3aaa9GG1323211E[] = {
  NSPAIR(_ZN3aaa9GG1323211C1Ev),
  NSPAIR(_ZN3aaa9GG1323211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1323211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323211E[];
extern void _ZN3aaa9GG13232113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232113fooEv,_ZThn8_N3aaa9GG13232113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232113fooEv,_ZThn20_N3aaa9GG13232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13232113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232113fooEv,_ZThn8_N3aaa9GG13232113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232113fooEv,_ZThn20_N3aaa9GG13232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323211E[];
Class_Descriptor cd__ZN3aaa9GG1323211E = {  "_ZN3aaa9GG1323211E", // class name
  bases__ZN3aaa9GG1323211E, 6,
  &(vtc__ZN3aaa9GG1323211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323212  : ::aaa::EE132 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13232123barEv
  ~GG1323212(); // tgen
  GG1323212(); // tgen
};
//SIG(1 _ZN3aaa9GG1323212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13232123barEv");}
aaa::GG1323212 ::~GG1323212(){ note_dtor("_ZN3aaa9GG1323212E", this);} // tgen
aaa::GG1323212 ::GG1323212(){ note_ctor("_ZN3aaa9GG1323212E", this);} // tgen
}
static void Test__ZN3aaa9GG1323212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323212E, buf);
    ::aaa::GG1323212 *dp, &lv = *(dp=new (buf) ::aaa::GG1323212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323212E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1323212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1323212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1323212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323212E);
    dp->::aaa::GG1323212::~GG1323212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323212E(Test__ZN3aaa9GG1323212E, "_ZN3aaa9GG1323212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323212C1Ev();
extern void _ZN3aaa9GG1323212D1Ev();
Name_Map name_map__ZN3aaa9GG1323212E[] = {
  NSPAIR(_ZN3aaa9GG1323212C1Ev),
  NSPAIR(_ZN3aaa9GG1323212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1323212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323212E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13232123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232123barEv,_ZThn8_N3aaa9GG13232123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13232123barEv,_ZThn20_N3aaa9GG13232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13232123barEv,_ZThn28_N3aaa9GG13232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232123barEv,_ZThn8_N3aaa9GG13232123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232123barEv,_ZThn20_N3aaa9GG13232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13232123barEv,_ZThn28_N3aaa9GG13232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323212E[];
Class_Descriptor cd__ZN3aaa9GG1323212E = {  "_ZN3aaa9GG1323212E", // class name
  bases__ZN3aaa9GG1323212E, 6,
  &(vtc__ZN3aaa9GG1323212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323213  : ::aaa::EE132 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13232133fooEv
  virtual void  bar(); // _ZN3aaa9GG13232133barEv
  ~GG1323213(); // tgen
  GG1323213(); // tgen
};
//SIG(1 _ZN3aaa9GG1323213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13232133fooEv");}
void  aaa::GG1323213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13232133barEv");}
aaa::GG1323213 ::~GG1323213(){ note_dtor("_ZN3aaa9GG1323213E", this);} // tgen
aaa::GG1323213 ::GG1323213(){ note_ctor("_ZN3aaa9GG1323213E", this);} // tgen
}
static void Test__ZN3aaa9GG1323213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323213E, buf);
    ::aaa::GG1323213 *dp, &lv = *(dp=new (buf) ::aaa::GG1323213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323213E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1323213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1323213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1323213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323213E);
    dp->::aaa::GG1323213::~GG1323213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323213E(Test__ZN3aaa9GG1323213E, "_ZN3aaa9GG1323213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323213C1Ev();
extern void _ZN3aaa9GG1323213D1Ev();
Name_Map name_map__ZN3aaa9GG1323213E[] = {
  NSPAIR(_ZN3aaa9GG1323213C1Ev),
  NSPAIR(_ZN3aaa9GG1323213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1323213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323213E[];
extern void _ZN3aaa9GG13232133fooEv();
extern void _ZN3aaa9GG13232133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232133fooEv,_ZThn8_N3aaa9GG13232133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13232133barEv,_ZThn8_N3aaa9GG13232133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232133fooEv,_ZThn20_N3aaa9GG13232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232133barEv,_ZThn20_N3aaa9GG13232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13232133barEv,_ZThn28_N3aaa9GG13232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13232133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13232133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232133fooEv,_ZThn8_N3aaa9GG13232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232133barEv,_ZThn8_N3aaa9GG13232133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232133fooEv,_ZThn20_N3aaa9GG13232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232133barEv,_ZThn20_N3aaa9GG13232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13232133barEv,_ZThn28_N3aaa9GG13232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323213E[];
Class_Descriptor cd__ZN3aaa9GG1323213E = {  "_ZN3aaa9GG1323213E", // class name
  bases__ZN3aaa9GG1323213E, 6,
  &(vtc__ZN3aaa9GG1323213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323221  : ::aaa::EE132 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13232213fooEv
  ~GG1323221(); // tgen
  GG1323221(); // tgen
};
//SIG(1 _ZN3aaa9GG1323221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13232213fooEv");}
aaa::GG1323221 ::~GG1323221(){ note_dtor("_ZN3aaa9GG1323221E", this);} // tgen
aaa::GG1323221 ::GG1323221(){ note_ctor("_ZN3aaa9GG1323221E", this);} // tgen
}
static void Test__ZN3aaa9GG1323221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323221E, buf);
    ::aaa::GG1323221 *dp, &lv = *(dp=new (buf) ::aaa::GG1323221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323221E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1323221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1323221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1323221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323221E);
    dp->::aaa::GG1323221::~GG1323221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323221E(Test__ZN3aaa9GG1323221E, "_ZN3aaa9GG1323221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323221C1Ev();
extern void _ZN3aaa9GG1323221D1Ev();
Name_Map name_map__ZN3aaa9GG1323221E[] = {
  NSPAIR(_ZN3aaa9GG1323221C1Ev),
  NSPAIR(_ZN3aaa9GG1323221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1323221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323221E[];
extern void _ZN3aaa9GG13232213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232213fooEv,_ZThn8_N3aaa9GG13232213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232213fooEv,_ZThn20_N3aaa9GG13232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13232213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232213fooEv,_ZThn8_N3aaa9GG13232213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232213fooEv,_ZThn20_N3aaa9GG13232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323221E[];
Class_Descriptor cd__ZN3aaa9GG1323221E = {  "_ZN3aaa9GG1323221E", // class name
  bases__ZN3aaa9GG1323221E, 6,
  &(vtc__ZN3aaa9GG1323221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323222  : ::aaa::EE132 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13232223barEv
  ~GG1323222(); // tgen
  GG1323222(); // tgen
};
//SIG(1 _ZN3aaa9GG1323222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13232223barEv");}
aaa::GG1323222 ::~GG1323222(){ note_dtor("_ZN3aaa9GG1323222E", this);} // tgen
aaa::GG1323222 ::GG1323222(){ note_ctor("_ZN3aaa9GG1323222E", this);} // tgen
}
static void Test__ZN3aaa9GG1323222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323222E, buf);
    ::aaa::GG1323222 *dp, &lv = *(dp=new (buf) ::aaa::GG1323222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323222E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1323222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1323222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1323222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323222E);
    dp->::aaa::GG1323222::~GG1323222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323222E(Test__ZN3aaa9GG1323222E, "_ZN3aaa9GG1323222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323222C1Ev();
extern void _ZN3aaa9GG1323222D1Ev();
Name_Map name_map__ZN3aaa9GG1323222E[] = {
  NSPAIR(_ZN3aaa9GG1323222C1Ev),
  NSPAIR(_ZN3aaa9GG1323222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1323222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323222E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13232223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232223barEv,_ZThn8_N3aaa9GG13232223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13232223barEv,_ZThn20_N3aaa9GG13232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13232223barEv,_ZThn28_N3aaa9GG13232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232223barEv,_ZThn8_N3aaa9GG13232223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232223barEv,_ZThn20_N3aaa9GG13232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13232223barEv,_ZThn28_N3aaa9GG13232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323222E[];
Class_Descriptor cd__ZN3aaa9GG1323222E = {  "_ZN3aaa9GG1323222E", // class name
  bases__ZN3aaa9GG1323222E, 6,
  &(vtc__ZN3aaa9GG1323222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323223  : ::aaa::EE132 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13232233fooEv
  virtual void  bar(); // _ZN3aaa9GG13232233barEv
  ~GG1323223(); // tgen
  GG1323223(); // tgen
};
//SIG(1 _ZN3aaa9GG1323223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13232233fooEv");}
void  aaa::GG1323223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13232233barEv");}
aaa::GG1323223 ::~GG1323223(){ note_dtor("_ZN3aaa9GG1323223E", this);} // tgen
aaa::GG1323223 ::GG1323223(){ note_ctor("_ZN3aaa9GG1323223E", this);} // tgen
}
static void Test__ZN3aaa9GG1323223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323223E, buf);
    ::aaa::GG1323223 *dp, &lv = *(dp=new (buf) ::aaa::GG1323223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323223E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1323223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1323223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1323223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323223E);
    dp->::aaa::GG1323223::~GG1323223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323223E(Test__ZN3aaa9GG1323223E, "_ZN3aaa9GG1323223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323223C1Ev();
extern void _ZN3aaa9GG1323223D1Ev();
Name_Map name_map__ZN3aaa9GG1323223E[] = {
  NSPAIR(_ZN3aaa9GG1323223C1Ev),
  NSPAIR(_ZN3aaa9GG1323223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1323223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323223E[];
extern void _ZN3aaa9GG13232233fooEv();
extern void _ZN3aaa9GG13232233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232233fooEv,_ZThn8_N3aaa9GG13232233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13232233barEv,_ZThn8_N3aaa9GG13232233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232233fooEv,_ZThn20_N3aaa9GG13232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232233barEv,_ZThn20_N3aaa9GG13232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13232233barEv,_ZThn28_N3aaa9GG13232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13232233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13232233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232233fooEv,_ZThn8_N3aaa9GG13232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232233barEv,_ZThn8_N3aaa9GG13232233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232233fooEv,_ZThn20_N3aaa9GG13232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232233barEv,_ZThn20_N3aaa9GG13232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13232233barEv,_ZThn28_N3aaa9GG13232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323223E[];
Class_Descriptor cd__ZN3aaa9GG1323223E = {  "_ZN3aaa9GG1323223E", // class name
  bases__ZN3aaa9GG1323223E, 6,
  &(vtc__ZN3aaa9GG1323223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323231  : ::aaa::EE132 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13232313fooEv
  ~GG1323231(); // tgen
  GG1323231(); // tgen
};
//SIG(1 _ZN3aaa9GG1323231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13232313fooEv");}
aaa::GG1323231 ::~GG1323231(){ note_dtor("_ZN3aaa9GG1323231E", this);} // tgen
aaa::GG1323231 ::GG1323231(){ note_ctor("_ZN3aaa9GG1323231E", this);} // tgen
}
static void Test__ZN3aaa9GG1323231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323231E, buf);
    ::aaa::GG1323231 *dp, &lv = *(dp=new (buf) ::aaa::GG1323231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323231E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1323231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1323231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1323231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323231E);
    dp->::aaa::GG1323231::~GG1323231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323231E(Test__ZN3aaa9GG1323231E, "_ZN3aaa9GG1323231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323231C1Ev();
extern void _ZN3aaa9GG1323231D1Ev();
Name_Map name_map__ZN3aaa9GG1323231E[] = {
  NSPAIR(_ZN3aaa9GG1323231C1Ev),
  NSPAIR(_ZN3aaa9GG1323231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1323231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323231E[];
extern void _ZN3aaa9GG13232313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232313fooEv,_ZThn8_N3aaa9GG13232313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232313fooEv,_ZThn20_N3aaa9GG13232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13232313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232313fooEv,_ZThn8_N3aaa9GG13232313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232313fooEv,_ZThn20_N3aaa9GG13232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323231E[];
Class_Descriptor cd__ZN3aaa9GG1323231E = {  "_ZN3aaa9GG1323231E", // class name
  bases__ZN3aaa9GG1323231E, 6,
  &(vtc__ZN3aaa9GG1323231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323232  : ::aaa::EE132 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13232323barEv
  ~GG1323232(); // tgen
  GG1323232(); // tgen
};
//SIG(1 _ZN3aaa9GG1323232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC7{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13232323barEv");}
aaa::GG1323232 ::~GG1323232(){ note_dtor("_ZN3aaa9GG1323232E", this);} // tgen
aaa::GG1323232 ::GG1323232(){ note_ctor("_ZN3aaa9GG1323232E", this);} // tgen
}
static void Test__ZN3aaa9GG1323232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323232E, buf);
    ::aaa::GG1323232 *dp, &lv = *(dp=new (buf) ::aaa::GG1323232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323232E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1323232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1323232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1323232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323232E);
    dp->::aaa::GG1323232::~GG1323232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323232E(Test__ZN3aaa9GG1323232E, "_ZN3aaa9GG1323232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323232C1Ev();
extern void _ZN3aaa9GG1323232D1Ev();
Name_Map name_map__ZN3aaa9GG1323232E[] = {
  NSPAIR(_ZN3aaa9GG1323232C1Ev),
  NSPAIR(_ZN3aaa9GG1323232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1323232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323232E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13232323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232323barEv,_ZThn8_N3aaa9GG13232323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13232323barEv,_ZThn20_N3aaa9GG13232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13232323barEv,_ZThn28_N3aaa9GG13232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232323barEv,_ZThn8_N3aaa9GG13232323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232323barEv,_ZThn20_N3aaa9GG13232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13232323barEv,_ZThn28_N3aaa9GG13232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323232E[];
Class_Descriptor cd__ZN3aaa9GG1323232E = {  "_ZN3aaa9GG1323232E", // class name
  bases__ZN3aaa9GG1323232E, 6,
  &(vtc__ZN3aaa9GG1323232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323233  : ::aaa::EE132 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13232333fooEv
  virtual void  bar(); // _ZN3aaa9GG13232333barEv
  ~GG1323233(); // tgen
  GG1323233(); // tgen
};
//SIG(1 _ZN3aaa9GG1323233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13232333fooEv");}
void  aaa::GG1323233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13232333barEv");}
aaa::GG1323233 ::~GG1323233(){ note_dtor("_ZN3aaa9GG1323233E", this);} // tgen
aaa::GG1323233 ::GG1323233(){ note_ctor("_ZN3aaa9GG1323233E", this);} // tgen
}
static void Test__ZN3aaa9GG1323233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323233E, buf);
    ::aaa::GG1323233 *dp, &lv = *(dp=new (buf) ::aaa::GG1323233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323233E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1323233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1323233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1323233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323233E);
    dp->::aaa::GG1323233::~GG1323233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323233E(Test__ZN3aaa9GG1323233E, "_ZN3aaa9GG1323233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323233C1Ev();
extern void _ZN3aaa9GG1323233D1Ev();
Name_Map name_map__ZN3aaa9GG1323233E[] = {
  NSPAIR(_ZN3aaa9GG1323233C1Ev),
  NSPAIR(_ZN3aaa9GG1323233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1323233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323233E[];
extern void _ZN3aaa9GG13232333fooEv();
extern void _ZN3aaa9GG13232333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13232333fooEv,_ZThn8_N3aaa9GG13232333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13232333barEv,_ZThn8_N3aaa9GG13232333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232333fooEv,_ZThn20_N3aaa9GG13232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13232333barEv,_ZThn20_N3aaa9GG13232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13232333barEv,_ZThn28_N3aaa9GG13232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13232333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13232333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232333fooEv,_ZThn8_N3aaa9GG13232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13232333barEv,_ZThn8_N3aaa9GG13232333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232333fooEv,_ZThn20_N3aaa9GG13232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13232333barEv,_ZThn20_N3aaa9GG13232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13232333barEv,_ZThn28_N3aaa9GG13232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323233E[];
Class_Descriptor cd__ZN3aaa9GG1323233E = {  "_ZN3aaa9GG1323233E", // class name
  bases__ZN3aaa9GG1323233E, 6,
  &(vtc__ZN3aaa9GG1323233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323311  : ::aaa::EE132 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13233113fooEv
  ~GG1323311(); // tgen
  GG1323311(); // tgen
};
//SIG(1 _ZN3aaa9GG1323311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13233113fooEv");}
aaa::GG1323311 ::~GG1323311(){ note_dtor("_ZN3aaa9GG1323311E", this);} // tgen
aaa::GG1323311 ::GG1323311(){ note_ctor("_ZN3aaa9GG1323311E", this);} // tgen
}
static void Test__ZN3aaa9GG1323311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323311E, buf);
    ::aaa::GG1323311 *dp, &lv = *(dp=new (buf) ::aaa::GG1323311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323311E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1323311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1323311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1323311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323311E);
    dp->::aaa::GG1323311::~GG1323311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323311E(Test__ZN3aaa9GG1323311E, "_ZN3aaa9GG1323311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323311C1Ev();
extern void _ZN3aaa9GG1323311D1Ev();
Name_Map name_map__ZN3aaa9GG1323311E[] = {
  NSPAIR(_ZN3aaa9GG1323311C1Ev),
  NSPAIR(_ZN3aaa9GG1323311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1323311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323311E[];
extern void _ZN3aaa9GG13233113fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233113fooEv,_ZThn8_N3aaa9GG13233113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233113fooEv,_ZThn20_N3aaa9GG13233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13233113fooEv,_ZThn28_N3aaa9GG13233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13233113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233113fooEv,_ZThn8_N3aaa9GG13233113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233113fooEv,_ZThn20_N3aaa9GG13233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233113fooEv,_ZThn28_N3aaa9GG13233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323311E[];
Class_Descriptor cd__ZN3aaa9GG1323311E = {  "_ZN3aaa9GG1323311E", // class name
  bases__ZN3aaa9GG1323311E, 6,
  &(vtc__ZN3aaa9GG1323311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323312  : ::aaa::EE132 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13233123barEv
  ~GG1323312(); // tgen
  GG1323312(); // tgen
};
//SIG(1 _ZN3aaa9GG1323312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13233123barEv");}
aaa::GG1323312 ::~GG1323312(){ note_dtor("_ZN3aaa9GG1323312E", this);} // tgen
aaa::GG1323312 ::GG1323312(){ note_ctor("_ZN3aaa9GG1323312E", this);} // tgen
}
static void Test__ZN3aaa9GG1323312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323312E, buf);
    ::aaa::GG1323312 *dp, &lv = *(dp=new (buf) ::aaa::GG1323312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323312E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1323312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1323312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1323312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323312E);
    dp->::aaa::GG1323312::~GG1323312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323312E(Test__ZN3aaa9GG1323312E, "_ZN3aaa9GG1323312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323312C1Ev();
extern void _ZN3aaa9GG1323312D1Ev();
Name_Map name_map__ZN3aaa9GG1323312E[] = {
  NSPAIR(_ZN3aaa9GG1323312C1Ev),
  NSPAIR(_ZN3aaa9GG1323312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1323312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323312E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13233123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233123barEv,_ZThn8_N3aaa9GG13233123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13233123barEv,_ZThn20_N3aaa9GG13233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13233123barEv,_ZThn28_N3aaa9GG13233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233123barEv,_ZThn8_N3aaa9GG13233123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233123barEv,_ZThn20_N3aaa9GG13233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233123barEv,_ZThn28_N3aaa9GG13233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323312E[];
Class_Descriptor cd__ZN3aaa9GG1323312E = {  "_ZN3aaa9GG1323312E", // class name
  bases__ZN3aaa9GG1323312E, 6,
  &(vtc__ZN3aaa9GG1323312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323313  : ::aaa::EE132 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13233133fooEv
  virtual void  bar(); // _ZN3aaa9GG13233133barEv
  ~GG1323313(); // tgen
  GG1323313(); // tgen
};
//SIG(1 _ZN3aaa9GG1323313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13233133fooEv");}
void  aaa::GG1323313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13233133barEv");}
aaa::GG1323313 ::~GG1323313(){ note_dtor("_ZN3aaa9GG1323313E", this);} // tgen
aaa::GG1323313 ::GG1323313(){ note_ctor("_ZN3aaa9GG1323313E", this);} // tgen
}
static void Test__ZN3aaa9GG1323313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323313E, buf);
    ::aaa::GG1323313 *dp, &lv = *(dp=new (buf) ::aaa::GG1323313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323313E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1323313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1323313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1323313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323313E);
    dp->::aaa::GG1323313::~GG1323313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323313E(Test__ZN3aaa9GG1323313E, "_ZN3aaa9GG1323313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323313C1Ev();
extern void _ZN3aaa9GG1323313D1Ev();
Name_Map name_map__ZN3aaa9GG1323313E[] = {
  NSPAIR(_ZN3aaa9GG1323313C1Ev),
  NSPAIR(_ZN3aaa9GG1323313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1323313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323313E[];
extern void _ZN3aaa9GG13233133fooEv();
extern void _ZN3aaa9GG13233133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233133fooEv,_ZThn8_N3aaa9GG13233133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13233133barEv,_ZThn8_N3aaa9GG13233133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233133fooEv,_ZThn20_N3aaa9GG13233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233133barEv,_ZThn20_N3aaa9GG13233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13233133fooEv,_ZThn28_N3aaa9GG13233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13233133barEv,_ZThn28_N3aaa9GG13233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13233133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13233133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233133fooEv,_ZThn8_N3aaa9GG13233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233133barEv,_ZThn8_N3aaa9GG13233133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233133fooEv,_ZThn20_N3aaa9GG13233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233133barEv,_ZThn20_N3aaa9GG13233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233133fooEv,_ZThn28_N3aaa9GG13233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233133barEv,_ZThn28_N3aaa9GG13233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323313E[];
Class_Descriptor cd__ZN3aaa9GG1323313E = {  "_ZN3aaa9GG1323313E", // class name
  bases__ZN3aaa9GG1323313E, 6,
  &(vtc__ZN3aaa9GG1323313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323321  : ::aaa::EE132 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13233213fooEv
  ~GG1323321(); // tgen
  GG1323321(); // tgen
};
//SIG(1 _ZN3aaa9GG1323321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13233213fooEv");}
aaa::GG1323321 ::~GG1323321(){ note_dtor("_ZN3aaa9GG1323321E", this);} // tgen
aaa::GG1323321 ::GG1323321(){ note_ctor("_ZN3aaa9GG1323321E", this);} // tgen
}
static void Test__ZN3aaa9GG1323321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323321E, buf);
    ::aaa::GG1323321 *dp, &lv = *(dp=new (buf) ::aaa::GG1323321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323321E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1323321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1323321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1323321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323321E);
    dp->::aaa::GG1323321::~GG1323321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323321E(Test__ZN3aaa9GG1323321E, "_ZN3aaa9GG1323321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323321C1Ev();
extern void _ZN3aaa9GG1323321D1Ev();
Name_Map name_map__ZN3aaa9GG1323321E[] = {
  NSPAIR(_ZN3aaa9GG1323321C1Ev),
  NSPAIR(_ZN3aaa9GG1323321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1323321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323321E[];
extern void _ZN3aaa9GG13233213fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233213fooEv,_ZThn8_N3aaa9GG13233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233213fooEv,_ZThn20_N3aaa9GG13233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13233213fooEv,_ZThn28_N3aaa9GG13233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13233213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233213fooEv,_ZThn8_N3aaa9GG13233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233213fooEv,_ZThn20_N3aaa9GG13233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233213fooEv,_ZThn28_N3aaa9GG13233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323321E[];
Class_Descriptor cd__ZN3aaa9GG1323321E = {  "_ZN3aaa9GG1323321E", // class name
  bases__ZN3aaa9GG1323321E, 6,
  &(vtc__ZN3aaa9GG1323321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323322  : ::aaa::EE132 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13233223barEv
  ~GG1323322(); // tgen
  GG1323322(); // tgen
};
//SIG(1 _ZN3aaa9GG1323322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13233223barEv");}
aaa::GG1323322 ::~GG1323322(){ note_dtor("_ZN3aaa9GG1323322E", this);} // tgen
aaa::GG1323322 ::GG1323322(){ note_ctor("_ZN3aaa9GG1323322E", this);} // tgen
}
static void Test__ZN3aaa9GG1323322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323322E, buf);
    ::aaa::GG1323322 *dp, &lv = *(dp=new (buf) ::aaa::GG1323322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323322E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1323322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1323322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1323322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323322E);
    dp->::aaa::GG1323322::~GG1323322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323322E(Test__ZN3aaa9GG1323322E, "_ZN3aaa9GG1323322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323322C1Ev();
extern void _ZN3aaa9GG1323322D1Ev();
Name_Map name_map__ZN3aaa9GG1323322E[] = {
  NSPAIR(_ZN3aaa9GG1323322C1Ev),
  NSPAIR(_ZN3aaa9GG1323322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1323322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323322E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13233223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233223barEv,_ZThn8_N3aaa9GG13233223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13233223barEv,_ZThn20_N3aaa9GG13233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13233223barEv,_ZThn28_N3aaa9GG13233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233223barEv,_ZThn8_N3aaa9GG13233223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233223barEv,_ZThn20_N3aaa9GG13233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233223barEv,_ZThn28_N3aaa9GG13233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323322E[];
Class_Descriptor cd__ZN3aaa9GG1323322E = {  "_ZN3aaa9GG1323322E", // class name
  bases__ZN3aaa9GG1323322E, 6,
  &(vtc__ZN3aaa9GG1323322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323323  : ::aaa::EE132 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13233233fooEv
  virtual void  bar(); // _ZN3aaa9GG13233233barEv
  ~GG1323323(); // tgen
  GG1323323(); // tgen
};
//SIG(1 _ZN3aaa9GG1323323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13233233fooEv");}
void  aaa::GG1323323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13233233barEv");}
aaa::GG1323323 ::~GG1323323(){ note_dtor("_ZN3aaa9GG1323323E", this);} // tgen
aaa::GG1323323 ::GG1323323(){ note_ctor("_ZN3aaa9GG1323323E", this);} // tgen
}
static void Test__ZN3aaa9GG1323323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323323E, buf);
    ::aaa::GG1323323 *dp, &lv = *(dp=new (buf) ::aaa::GG1323323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323323E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1323323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1323323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1323323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323323E);
    dp->::aaa::GG1323323::~GG1323323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323323E(Test__ZN3aaa9GG1323323E, "_ZN3aaa9GG1323323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323323C1Ev();
extern void _ZN3aaa9GG1323323D1Ev();
Name_Map name_map__ZN3aaa9GG1323323E[] = {
  NSPAIR(_ZN3aaa9GG1323323C1Ev),
  NSPAIR(_ZN3aaa9GG1323323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1323323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323323E[];
extern void _ZN3aaa9GG13233233fooEv();
extern void _ZN3aaa9GG13233233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233233fooEv,_ZThn8_N3aaa9GG13233233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13233233barEv,_ZThn8_N3aaa9GG13233233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233233fooEv,_ZThn20_N3aaa9GG13233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233233barEv,_ZThn20_N3aaa9GG13233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13233233fooEv,_ZThn28_N3aaa9GG13233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13233233barEv,_ZThn28_N3aaa9GG13233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13233233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13233233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233233fooEv,_ZThn8_N3aaa9GG13233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233233barEv,_ZThn8_N3aaa9GG13233233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233233fooEv,_ZThn20_N3aaa9GG13233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233233barEv,_ZThn20_N3aaa9GG13233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233233fooEv,_ZThn28_N3aaa9GG13233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233233barEv,_ZThn28_N3aaa9GG13233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323323E[];
Class_Descriptor cd__ZN3aaa9GG1323323E = {  "_ZN3aaa9GG1323323E", // class name
  bases__ZN3aaa9GG1323323E, 6,
  &(vtc__ZN3aaa9GG1323323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323331  : ::aaa::EE132 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13233313fooEv
  ~GG1323331(); // tgen
  GG1323331(); // tgen
};
//SIG(1 _ZN3aaa9GG1323331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13233313fooEv");}
aaa::GG1323331 ::~GG1323331(){ note_dtor("_ZN3aaa9GG1323331E", this);} // tgen
aaa::GG1323331 ::GG1323331(){ note_ctor("_ZN3aaa9GG1323331E", this);} // tgen
}
static void Test__ZN3aaa9GG1323331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323331E, buf);
    ::aaa::GG1323331 *dp, &lv = *(dp=new (buf) ::aaa::GG1323331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323331E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1323331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1323331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1323331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323331E);
    dp->::aaa::GG1323331::~GG1323331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323331E(Test__ZN3aaa9GG1323331E, "_ZN3aaa9GG1323331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323331C1Ev();
extern void _ZN3aaa9GG1323331D1Ev();
Name_Map name_map__ZN3aaa9GG1323331E[] = {
  NSPAIR(_ZN3aaa9GG1323331C1Ev),
  NSPAIR(_ZN3aaa9GG1323331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1323331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323331E[];
extern void _ZN3aaa9GG13233313fooEv();
extern void _ZN3aaa5EE1323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233313fooEv,_ZThn8_N3aaa9GG13233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233313fooEv,_ZThn20_N3aaa9GG13233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13233313fooEv,_ZThn28_N3aaa9GG13233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13233313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233313fooEv,_ZThn8_N3aaa9GG13233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1323barEv,_ZThn8_N3aaa5EE1323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233313fooEv,_ZThn20_N3aaa9GG13233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233313fooEv,_ZThn28_N3aaa9GG13233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323331E[];
Class_Descriptor cd__ZN3aaa9GG1323331E = {  "_ZN3aaa9GG1323331E", // class name
  bases__ZN3aaa9GG1323331E, 6,
  &(vtc__ZN3aaa9GG1323331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323332  : ::aaa::EE132 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13233323barEv
  ~GG1323332(); // tgen
  GG1323332(); // tgen
};
//SIG(1 _ZN3aaa9GG1323332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 v1 Fi} BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1323332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13233323barEv");}
aaa::GG1323332 ::~GG1323332(){ note_dtor("_ZN3aaa9GG1323332E", this);} // tgen
aaa::GG1323332 ::GG1323332(){ note_ctor("_ZN3aaa9GG1323332E", this);} // tgen
}
static void Test__ZN3aaa9GG1323332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323332E, buf);
    ::aaa::GG1323332 *dp, &lv = *(dp=new (buf) ::aaa::GG1323332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323332E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1323332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1323332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1323332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323332E);
    dp->::aaa::GG1323332::~GG1323332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323332E(Test__ZN3aaa9GG1323332E, "_ZN3aaa9GG1323332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323332C1Ev();
extern void _ZN3aaa9GG1323332D1Ev();
Name_Map name_map__ZN3aaa9GG1323332E[] = {
  NSPAIR(_ZN3aaa9GG1323332C1Ev),
  NSPAIR(_ZN3aaa9GG1323332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1323332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323332E[];
extern void _ZN3aaa3AA13fooEv();
extern void _ZN3aaa9GG13233323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233323barEv,_ZThn8_N3aaa9GG13233323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13233323barEv,_ZThn20_N3aaa9GG13233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13233323barEv,_ZThn28_N3aaa9GG13233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233323barEv,_ZThn8_N3aaa9GG13233323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233323barEv,_ZThn20_N3aaa9GG13233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233323barEv,_ZThn28_N3aaa9GG13233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323332E[];
Class_Descriptor cd__ZN3aaa9GG1323332E = {  "_ZN3aaa9GG1323332E", // class name
  bases__ZN3aaa9GG1323332E, 6,
  &(vtc__ZN3aaa9GG1323332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1323333  : ::aaa::EE132 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13233333fooEv
  virtual void  bar(); // _ZN3aaa9GG13233333barEv
  ~GG1323333(); // tgen
  GG1323333(); // tgen
};
//SIG(1 _ZN3aaa9GG1323333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1323333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13233333fooEv");}
void  aaa::GG1323333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13233333barEv");}
aaa::GG1323333 ::~GG1323333(){ note_dtor("_ZN3aaa9GG1323333E", this);} // tgen
aaa::GG1323333 ::GG1323333(){ note_ctor("_ZN3aaa9GG1323333E", this);} // tgen
}
static void Test__ZN3aaa9GG1323333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1323333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1323333E, buf);
    ::aaa::GG1323333 *dp, &lv = *(dp=new (buf) ::aaa::GG1323333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1323333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1323333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE132*), 0, "_ZN3aaa9GG1323333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE132*), ABISELECT(16,8), "_ZN3aaa9GG1323333E");
    check_base_class_offset(lv, (::aaa::EE132*), 0, "_ZN3aaa9GG1323333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1323333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1323333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1323333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1323333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1323333E);
    dp->::aaa::GG1323333::~GG1323333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1323333E(Test__ZN3aaa9GG1323333E, "_ZN3aaa9GG1323333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1323333C1Ev();
extern void _ZN3aaa9GG1323333D1Ev();
Name_Map name_map__ZN3aaa9GG1323333E[] = {
  NSPAIR(_ZN3aaa9GG1323333C1Ev),
  NSPAIR(_ZN3aaa9GG1323333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE132E;
extern VTBL_ENTRY _ZTIN3aaa5EE132E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE132E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1323333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE132E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1323333E[];
extern void _ZN3aaa9GG13233333fooEv();
extern void _ZN3aaa9GG13233333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13233333fooEv,_ZThn8_N3aaa9GG13233333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13233333barEv,_ZThn8_N3aaa9GG13233333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233333fooEv,_ZThn20_N3aaa9GG13233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13233333barEv,_ZThn20_N3aaa9GG13233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13233333fooEv,_ZThn28_N3aaa9GG13233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13233333barEv,_ZThn28_N3aaa9GG13233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1323333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13233333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13233333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233333fooEv,_ZThn8_N3aaa9GG13233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13233333barEv,_ZThn8_N3aaa9GG13233333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233333fooEv,_ZThn20_N3aaa9GG13233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13233333barEv,_ZThn20_N3aaa9GG13233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233333fooEv,_ZThn28_N3aaa9GG13233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13233333barEv,_ZThn28_N3aaa9GG13233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1323333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1323333E[];
Class_Descriptor cd__ZN3aaa9GG1323333E = {  "_ZN3aaa9GG1323333E", // class name
  bases__ZN3aaa9GG1323333E, 6,
  &(vtc__ZN3aaa9GG1323333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1323333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1323333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331111  : ::aaa::EE133 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13311113fooEv
  ~GG1331111(); // tgen
  GG1331111(); // tgen
};
//SIG(1 _ZN3aaa9GG1331111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13311113fooEv");}
aaa::GG1331111 ::~GG1331111(){ note_dtor("_ZN3aaa9GG1331111E", this);} // tgen
aaa::GG1331111 ::GG1331111(){ note_ctor("_ZN3aaa9GG1331111E", this);} // tgen
}
static void Test__ZN3aaa9GG1331111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331111E, buf);
    ::aaa::GG1331111 *dp, &lv = *(dp=new (buf) ::aaa::GG1331111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331111E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1331111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1331111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1331111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331111E);
    dp->::aaa::GG1331111::~GG1331111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331111E(Test__ZN3aaa9GG1331111E, "_ZN3aaa9GG1331111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331111C1Ev();
extern void _ZN3aaa9GG1331111D1Ev();
Name_Map name_map__ZN3aaa9GG1331111E[] = {
  NSPAIR(_ZN3aaa9GG1331111C1Ev),
  NSPAIR(_ZN3aaa9GG1331111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1331111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331111E[];
extern void _ZN3aaa9GG13311113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13311113fooEv,_ZThn8_N3aaa9GG13311113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13311113fooEv,_ZThn20_N3aaa9GG13311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13311113fooEv,_ZThn28_N3aaa9GG13311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13311113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311113fooEv,_ZThn8_N3aaa9GG13311113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311113fooEv,_ZThn20_N3aaa9GG13311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13311113fooEv,_ZThn28_N3aaa9GG13311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331111E[];
Class_Descriptor cd__ZN3aaa9GG1331111E = {  "_ZN3aaa9GG1331111E", // class name
  bases__ZN3aaa9GG1331111E, 6,
  &(vtc__ZN3aaa9GG1331111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331112  : ::aaa::EE133 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13311123barEv
  ~GG1331112(); // tgen
  GG1331112(); // tgen
};
//SIG(1 _ZN3aaa9GG1331112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13311123barEv");}
aaa::GG1331112 ::~GG1331112(){ note_dtor("_ZN3aaa9GG1331112E", this);} // tgen
aaa::GG1331112 ::GG1331112(){ note_ctor("_ZN3aaa9GG1331112E", this);} // tgen
}
static void Test__ZN3aaa9GG1331112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331112E, buf);
    ::aaa::GG1331112 *dp, &lv = *(dp=new (buf) ::aaa::GG1331112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331112E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1331112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1331112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1331112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331112E);
    dp->::aaa::GG1331112::~GG1331112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331112E(Test__ZN3aaa9GG1331112E, "_ZN3aaa9GG1331112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331112C1Ev();
extern void _ZN3aaa9GG1331112D1Ev();
Name_Map name_map__ZN3aaa9GG1331112E[] = {
  NSPAIR(_ZN3aaa9GG1331112C1Ev),
  NSPAIR(_ZN3aaa9GG1331112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1331112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331112E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13311123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13311123barEv,_ZThn8_N3aaa9GG13311123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13311123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311123barEv,_ZThn8_N3aaa9GG13311123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331112E[];
Class_Descriptor cd__ZN3aaa9GG1331112E = {  "_ZN3aaa9GG1331112E", // class name
  bases__ZN3aaa9GG1331112E, 6,
  &(vtc__ZN3aaa9GG1331112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331113  : ::aaa::EE133 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13311133fooEv
  virtual void  bar(); // _ZN3aaa9GG13311133barEv
  ~GG1331113(); // tgen
  GG1331113(); // tgen
};
//SIG(1 _ZN3aaa9GG1331113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13311133fooEv");}
void  aaa::GG1331113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13311133barEv");}
aaa::GG1331113 ::~GG1331113(){ note_dtor("_ZN3aaa9GG1331113E", this);} // tgen
aaa::GG1331113 ::GG1331113(){ note_ctor("_ZN3aaa9GG1331113E", this);} // tgen
}
static void Test__ZN3aaa9GG1331113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331113E, buf);
    ::aaa::GG1331113 *dp, &lv = *(dp=new (buf) ::aaa::GG1331113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331113E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1331113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG1331113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG1331113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331113E);
    dp->::aaa::GG1331113::~GG1331113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331113E(Test__ZN3aaa9GG1331113E, "_ZN3aaa9GG1331113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331113C1Ev();
extern void _ZN3aaa9GG1331113D1Ev();
Name_Map name_map__ZN3aaa9GG1331113E[] = {
  NSPAIR(_ZN3aaa9GG1331113C1Ev),
  NSPAIR(_ZN3aaa9GG1331113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG1331113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331113E[];
extern void _ZN3aaa9GG13311133fooEv();
extern void _ZN3aaa9GG13311133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13311133fooEv,_ZThn8_N3aaa9GG13311133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13311133barEv,_ZThn8_N3aaa9GG13311133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13311133fooEv,_ZThn20_N3aaa9GG13311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13311133fooEv,_ZThn28_N3aaa9GG13311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13311133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13311133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311133fooEv,_ZThn8_N3aaa9GG13311133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311133barEv,_ZThn8_N3aaa9GG13311133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311133fooEv,_ZThn20_N3aaa9GG13311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13311133fooEv,_ZThn28_N3aaa9GG13311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331113E[];
Class_Descriptor cd__ZN3aaa9GG1331113E = {  "_ZN3aaa9GG1331113E", // class name
  bases__ZN3aaa9GG1331113E, 6,
  &(vtc__ZN3aaa9GG1331113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331121  : ::aaa::EE133 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13311213fooEv
  ~GG1331121(); // tgen
  GG1331121(); // tgen
};
//SIG(1 _ZN3aaa9GG1331121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13311213fooEv");}
aaa::GG1331121 ::~GG1331121(){ note_dtor("_ZN3aaa9GG1331121E", this);} // tgen
aaa::GG1331121 ::GG1331121(){ note_ctor("_ZN3aaa9GG1331121E", this);} // tgen
}
static void Test__ZN3aaa9GG1331121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331121E, buf);
    ::aaa::GG1331121 *dp, &lv = *(dp=new (buf) ::aaa::GG1331121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331121E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1331121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1331121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1331121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331121E);
    dp->::aaa::GG1331121::~GG1331121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331121E(Test__ZN3aaa9GG1331121E, "_ZN3aaa9GG1331121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331121C1Ev();
extern void _ZN3aaa9GG1331121D1Ev();
Name_Map name_map__ZN3aaa9GG1331121E[] = {
  NSPAIR(_ZN3aaa9GG1331121C1Ev),
  NSPAIR(_ZN3aaa9GG1331121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1331121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331121E[];
extern void _ZN3aaa9GG13311213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13311213fooEv,_ZThn8_N3aaa9GG13311213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13311213fooEv,_ZThn20_N3aaa9GG13311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13311213fooEv,_ZThn28_N3aaa9GG13311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13311213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311213fooEv,_ZThn8_N3aaa9GG13311213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311213fooEv,_ZThn20_N3aaa9GG13311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13311213fooEv,_ZThn28_N3aaa9GG13311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331121E[];
Class_Descriptor cd__ZN3aaa9GG1331121E = {  "_ZN3aaa9GG1331121E", // class name
  bases__ZN3aaa9GG1331121E, 6,
  &(vtc__ZN3aaa9GG1331121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331122  : ::aaa::EE133 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13311223barEv
  ~GG1331122(); // tgen
  GG1331122(); // tgen
};
//SIG(1 _ZN3aaa9GG1331122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13311223barEv");}
aaa::GG1331122 ::~GG1331122(){ note_dtor("_ZN3aaa9GG1331122E", this);} // tgen
aaa::GG1331122 ::GG1331122(){ note_ctor("_ZN3aaa9GG1331122E", this);} // tgen
}
static void Test__ZN3aaa9GG1331122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331122E, buf);
    ::aaa::GG1331122 *dp, &lv = *(dp=new (buf) ::aaa::GG1331122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331122E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1331122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1331122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1331122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331122E);
    dp->::aaa::GG1331122::~GG1331122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331122E(Test__ZN3aaa9GG1331122E, "_ZN3aaa9GG1331122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331122C1Ev();
extern void _ZN3aaa9GG1331122D1Ev();
Name_Map name_map__ZN3aaa9GG1331122E[] = {
  NSPAIR(_ZN3aaa9GG1331122C1Ev),
  NSPAIR(_ZN3aaa9GG1331122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1331122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331122E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13311223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13311223barEv,_ZThn8_N3aaa9GG13311223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13311223barEv,_ZThn20_N3aaa9GG13311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13311223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311223barEv,_ZThn8_N3aaa9GG13311223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311223barEv,_ZThn20_N3aaa9GG13311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331122E[];
Class_Descriptor cd__ZN3aaa9GG1331122E = {  "_ZN3aaa9GG1331122E", // class name
  bases__ZN3aaa9GG1331122E, 6,
  &(vtc__ZN3aaa9GG1331122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331123  : ::aaa::EE133 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13311233fooEv
  virtual void  bar(); // _ZN3aaa9GG13311233barEv
  ~GG1331123(); // tgen
  GG1331123(); // tgen
};
//SIG(1 _ZN3aaa9GG1331123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13311233fooEv");}
void  aaa::GG1331123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13311233barEv");}
aaa::GG1331123 ::~GG1331123(){ note_dtor("_ZN3aaa9GG1331123E", this);} // tgen
aaa::GG1331123 ::GG1331123(){ note_ctor("_ZN3aaa9GG1331123E", this);} // tgen
}
static void Test__ZN3aaa9GG1331123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331123E, buf);
    ::aaa::GG1331123 *dp, &lv = *(dp=new (buf) ::aaa::GG1331123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331123E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1331123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG1331123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG1331123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331123E);
    dp->::aaa::GG1331123::~GG1331123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331123E(Test__ZN3aaa9GG1331123E, "_ZN3aaa9GG1331123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331123C1Ev();
extern void _ZN3aaa9GG1331123D1Ev();
Name_Map name_map__ZN3aaa9GG1331123E[] = {
  NSPAIR(_ZN3aaa9GG1331123C1Ev),
  NSPAIR(_ZN3aaa9GG1331123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG1331123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331123E[];
extern void _ZN3aaa9GG13311233fooEv();
extern void _ZN3aaa9GG13311233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13311233fooEv,_ZThn8_N3aaa9GG13311233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13311233barEv,_ZThn8_N3aaa9GG13311233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13311233fooEv,_ZThn20_N3aaa9GG13311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13311233barEv,_ZThn20_N3aaa9GG13311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13311233fooEv,_ZThn28_N3aaa9GG13311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13311233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13311233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311233fooEv,_ZThn8_N3aaa9GG13311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311233barEv,_ZThn8_N3aaa9GG13311233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311233fooEv,_ZThn20_N3aaa9GG13311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311233barEv,_ZThn20_N3aaa9GG13311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13311233fooEv,_ZThn28_N3aaa9GG13311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331123E[];
Class_Descriptor cd__ZN3aaa9GG1331123E = {  "_ZN3aaa9GG1331123E", // class name
  bases__ZN3aaa9GG1331123E, 6,
  &(vtc__ZN3aaa9GG1331123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331131  : ::aaa::EE133 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13311313fooEv
  ~GG1331131(); // tgen
  GG1331131(); // tgen
};
//SIG(1 _ZN3aaa9GG1331131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13311313fooEv");}
aaa::GG1331131 ::~GG1331131(){ note_dtor("_ZN3aaa9GG1331131E", this);} // tgen
aaa::GG1331131 ::GG1331131(){ note_ctor("_ZN3aaa9GG1331131E", this);} // tgen
}
static void Test__ZN3aaa9GG1331131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331131E, buf);
    ::aaa::GG1331131 *dp, &lv = *(dp=new (buf) ::aaa::GG1331131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331131E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1331131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1331131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1331131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331131E);
    dp->::aaa::GG1331131::~GG1331131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331131E(Test__ZN3aaa9GG1331131E, "_ZN3aaa9GG1331131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331131C1Ev();
extern void _ZN3aaa9GG1331131D1Ev();
Name_Map name_map__ZN3aaa9GG1331131E[] = {
  NSPAIR(_ZN3aaa9GG1331131C1Ev),
  NSPAIR(_ZN3aaa9GG1331131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1331131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331131E[];
extern void _ZN3aaa9GG13311313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13311313fooEv,_ZThn8_N3aaa9GG13311313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13311313fooEv,_ZThn20_N3aaa9GG13311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13311313fooEv,_ZThn28_N3aaa9GG13311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13311313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311313fooEv,_ZThn8_N3aaa9GG13311313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311313fooEv,_ZThn20_N3aaa9GG13311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13311313fooEv,_ZThn28_N3aaa9GG13311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331131E[];
Class_Descriptor cd__ZN3aaa9GG1331131E = {  "_ZN3aaa9GG1331131E", // class name
  bases__ZN3aaa9GG1331131E, 6,
  &(vtc__ZN3aaa9GG1331131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331132  : ::aaa::EE133 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13311323barEv
  ~GG1331132(); // tgen
  GG1331132(); // tgen
};
//SIG(1 _ZN3aaa9GG1331132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13311323barEv");}
aaa::GG1331132 ::~GG1331132(){ note_dtor("_ZN3aaa9GG1331132E", this);} // tgen
aaa::GG1331132 ::GG1331132(){ note_ctor("_ZN3aaa9GG1331132E", this);} // tgen
}
static void Test__ZN3aaa9GG1331132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331132E, buf);
    ::aaa::GG1331132 *dp, &lv = *(dp=new (buf) ::aaa::GG1331132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331132E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1331132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1331132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1331132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331132E);
    dp->::aaa::GG1331132::~GG1331132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331132E(Test__ZN3aaa9GG1331132E, "_ZN3aaa9GG1331132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331132C1Ev();
extern void _ZN3aaa9GG1331132D1Ev();
Name_Map name_map__ZN3aaa9GG1331132E[] = {
  NSPAIR(_ZN3aaa9GG1331132C1Ev),
  NSPAIR(_ZN3aaa9GG1331132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1331132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331132E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13311323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13311323barEv,_ZThn8_N3aaa9GG13311323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13311323barEv,_ZThn20_N3aaa9GG13311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13311323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311323barEv,_ZThn8_N3aaa9GG13311323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311323barEv,_ZThn20_N3aaa9GG13311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331132E[];
Class_Descriptor cd__ZN3aaa9GG1331132E = {  "_ZN3aaa9GG1331132E", // class name
  bases__ZN3aaa9GG1331132E, 6,
  &(vtc__ZN3aaa9GG1331132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331133  : ::aaa::EE133 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13311333fooEv
  virtual void  bar(); // _ZN3aaa9GG13311333barEv
  ~GG1331133(); // tgen
  GG1331133(); // tgen
};
//SIG(1 _ZN3aaa9GG1331133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13311333fooEv");}
void  aaa::GG1331133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13311333barEv");}
aaa::GG1331133 ::~GG1331133(){ note_dtor("_ZN3aaa9GG1331133E", this);} // tgen
aaa::GG1331133 ::GG1331133(){ note_ctor("_ZN3aaa9GG1331133E", this);} // tgen
}
static void Test__ZN3aaa9GG1331133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331133E, buf);
    ::aaa::GG1331133 *dp, &lv = *(dp=new (buf) ::aaa::GG1331133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331133E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1331133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG1331133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG1331133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331133E);
    dp->::aaa::GG1331133::~GG1331133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331133E(Test__ZN3aaa9GG1331133E, "_ZN3aaa9GG1331133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331133C1Ev();
extern void _ZN3aaa9GG1331133D1Ev();
Name_Map name_map__ZN3aaa9GG1331133E[] = {
  NSPAIR(_ZN3aaa9GG1331133C1Ev),
  NSPAIR(_ZN3aaa9GG1331133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG1331133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331133E[];
extern void _ZN3aaa9GG13311333fooEv();
extern void _ZN3aaa9GG13311333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13311333fooEv,_ZThn8_N3aaa9GG13311333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13311333barEv,_ZThn8_N3aaa9GG13311333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13311333fooEv,_ZThn20_N3aaa9GG13311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13311333barEv,_ZThn20_N3aaa9GG13311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13311333fooEv,_ZThn28_N3aaa9GG13311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13311333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13311333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311333fooEv,_ZThn8_N3aaa9GG13311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13311333barEv,_ZThn8_N3aaa9GG13311333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311333fooEv,_ZThn20_N3aaa9GG13311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13311333barEv,_ZThn20_N3aaa9GG13311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13311333fooEv,_ZThn28_N3aaa9GG13311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331133E[];
Class_Descriptor cd__ZN3aaa9GG1331133E = {  "_ZN3aaa9GG1331133E", // class name
  bases__ZN3aaa9GG1331133E, 6,
  &(vtc__ZN3aaa9GG1331133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331211  : ::aaa::EE133 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13312113fooEv
  ~GG1331211(); // tgen
  GG1331211(); // tgen
};
//SIG(1 _ZN3aaa9GG1331211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13312113fooEv");}
aaa::GG1331211 ::~GG1331211(){ note_dtor("_ZN3aaa9GG1331211E", this);} // tgen
aaa::GG1331211 ::GG1331211(){ note_ctor("_ZN3aaa9GG1331211E", this);} // tgen
}
static void Test__ZN3aaa9GG1331211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331211E, buf);
    ::aaa::GG1331211 *dp, &lv = *(dp=new (buf) ::aaa::GG1331211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331211E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1331211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1331211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1331211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331211E);
    dp->::aaa::GG1331211::~GG1331211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331211E(Test__ZN3aaa9GG1331211E, "_ZN3aaa9GG1331211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331211C1Ev();
extern void _ZN3aaa9GG1331211D1Ev();
Name_Map name_map__ZN3aaa9GG1331211E[] = {
  NSPAIR(_ZN3aaa9GG1331211C1Ev),
  NSPAIR(_ZN3aaa9GG1331211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1331211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331211E[];
extern void _ZN3aaa9GG13312113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13312113fooEv,_ZThn8_N3aaa9GG13312113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13312113fooEv,_ZThn20_N3aaa9GG13312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13312113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312113fooEv,_ZThn8_N3aaa9GG13312113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312113fooEv,_ZThn20_N3aaa9GG13312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331211E[];
Class_Descriptor cd__ZN3aaa9GG1331211E = {  "_ZN3aaa9GG1331211E", // class name
  bases__ZN3aaa9GG1331211E, 6,
  &(vtc__ZN3aaa9GG1331211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331212  : ::aaa::EE133 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13312123barEv
  ~GG1331212(); // tgen
  GG1331212(); // tgen
};
//SIG(1 _ZN3aaa9GG1331212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13312123barEv");}
aaa::GG1331212 ::~GG1331212(){ note_dtor("_ZN3aaa9GG1331212E", this);} // tgen
aaa::GG1331212 ::GG1331212(){ note_ctor("_ZN3aaa9GG1331212E", this);} // tgen
}
static void Test__ZN3aaa9GG1331212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331212E, buf);
    ::aaa::GG1331212 *dp, &lv = *(dp=new (buf) ::aaa::GG1331212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331212E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1331212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1331212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1331212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331212E);
    dp->::aaa::GG1331212::~GG1331212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331212E(Test__ZN3aaa9GG1331212E, "_ZN3aaa9GG1331212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331212C1Ev();
extern void _ZN3aaa9GG1331212D1Ev();
Name_Map name_map__ZN3aaa9GG1331212E[] = {
  NSPAIR(_ZN3aaa9GG1331212C1Ev),
  NSPAIR(_ZN3aaa9GG1331212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1331212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331212E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13312123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13312123barEv,_ZThn8_N3aaa9GG13312123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13312123barEv,_ZThn28_N3aaa9GG13312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13312123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312123barEv,_ZThn8_N3aaa9GG13312123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13312123barEv,_ZThn28_N3aaa9GG13312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331212E[];
Class_Descriptor cd__ZN3aaa9GG1331212E = {  "_ZN3aaa9GG1331212E", // class name
  bases__ZN3aaa9GG1331212E, 6,
  &(vtc__ZN3aaa9GG1331212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331213  : ::aaa::EE133 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13312133fooEv
  virtual void  bar(); // _ZN3aaa9GG13312133barEv
  ~GG1331213(); // tgen
  GG1331213(); // tgen
};
//SIG(1 _ZN3aaa9GG1331213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13312133fooEv");}
void  aaa::GG1331213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13312133barEv");}
aaa::GG1331213 ::~GG1331213(){ note_dtor("_ZN3aaa9GG1331213E", this);} // tgen
aaa::GG1331213 ::GG1331213(){ note_ctor("_ZN3aaa9GG1331213E", this);} // tgen
}
static void Test__ZN3aaa9GG1331213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331213E, buf);
    ::aaa::GG1331213 *dp, &lv = *(dp=new (buf) ::aaa::GG1331213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331213E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1331213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG1331213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG1331213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331213E);
    dp->::aaa::GG1331213::~GG1331213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331213E(Test__ZN3aaa9GG1331213E, "_ZN3aaa9GG1331213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331213C1Ev();
extern void _ZN3aaa9GG1331213D1Ev();
Name_Map name_map__ZN3aaa9GG1331213E[] = {
  NSPAIR(_ZN3aaa9GG1331213C1Ev),
  NSPAIR(_ZN3aaa9GG1331213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG1331213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331213E[];
extern void _ZN3aaa9GG13312133fooEv();
extern void _ZN3aaa9GG13312133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13312133fooEv,_ZThn8_N3aaa9GG13312133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13312133barEv,_ZThn8_N3aaa9GG13312133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13312133fooEv,_ZThn20_N3aaa9GG13312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13312133barEv,_ZThn28_N3aaa9GG13312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13312133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13312133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312133fooEv,_ZThn8_N3aaa9GG13312133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312133barEv,_ZThn8_N3aaa9GG13312133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312133fooEv,_ZThn20_N3aaa9GG13312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13312133barEv,_ZThn28_N3aaa9GG13312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331213E[];
Class_Descriptor cd__ZN3aaa9GG1331213E = {  "_ZN3aaa9GG1331213E", // class name
  bases__ZN3aaa9GG1331213E, 6,
  &(vtc__ZN3aaa9GG1331213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331221  : ::aaa::EE133 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13312213fooEv
  ~GG1331221(); // tgen
  GG1331221(); // tgen
};
//SIG(1 _ZN3aaa9GG1331221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13312213fooEv");}
aaa::GG1331221 ::~GG1331221(){ note_dtor("_ZN3aaa9GG1331221E", this);} // tgen
aaa::GG1331221 ::GG1331221(){ note_ctor("_ZN3aaa9GG1331221E", this);} // tgen
}
static void Test__ZN3aaa9GG1331221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331221E, buf);
    ::aaa::GG1331221 *dp, &lv = *(dp=new (buf) ::aaa::GG1331221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331221E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1331221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1331221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1331221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331221E);
    dp->::aaa::GG1331221::~GG1331221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331221E(Test__ZN3aaa9GG1331221E, "_ZN3aaa9GG1331221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331221C1Ev();
extern void _ZN3aaa9GG1331221D1Ev();
Name_Map name_map__ZN3aaa9GG1331221E[] = {
  NSPAIR(_ZN3aaa9GG1331221C1Ev),
  NSPAIR(_ZN3aaa9GG1331221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1331221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331221E[];
extern void _ZN3aaa9GG13312213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13312213fooEv,_ZThn8_N3aaa9GG13312213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13312213fooEv,_ZThn20_N3aaa9GG13312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13312213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312213fooEv,_ZThn8_N3aaa9GG13312213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312213fooEv,_ZThn20_N3aaa9GG13312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331221E[];
Class_Descriptor cd__ZN3aaa9GG1331221E = {  "_ZN3aaa9GG1331221E", // class name
  bases__ZN3aaa9GG1331221E, 6,
  &(vtc__ZN3aaa9GG1331221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331222  : ::aaa::EE133 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13312223barEv
  ~GG1331222(); // tgen
  GG1331222(); // tgen
};
//SIG(1 _ZN3aaa9GG1331222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13312223barEv");}
aaa::GG1331222 ::~GG1331222(){ note_dtor("_ZN3aaa9GG1331222E", this);} // tgen
aaa::GG1331222 ::GG1331222(){ note_ctor("_ZN3aaa9GG1331222E", this);} // tgen
}
static void Test__ZN3aaa9GG1331222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331222E, buf);
    ::aaa::GG1331222 *dp, &lv = *(dp=new (buf) ::aaa::GG1331222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331222E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1331222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1331222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1331222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331222E);
    dp->::aaa::GG1331222::~GG1331222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331222E(Test__ZN3aaa9GG1331222E, "_ZN3aaa9GG1331222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331222C1Ev();
extern void _ZN3aaa9GG1331222D1Ev();
Name_Map name_map__ZN3aaa9GG1331222E[] = {
  NSPAIR(_ZN3aaa9GG1331222C1Ev),
  NSPAIR(_ZN3aaa9GG1331222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1331222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331222E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13312223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13312223barEv,_ZThn8_N3aaa9GG13312223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13312223barEv,_ZThn20_N3aaa9GG13312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13312223barEv,_ZThn28_N3aaa9GG13312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13312223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312223barEv,_ZThn8_N3aaa9GG13312223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312223barEv,_ZThn20_N3aaa9GG13312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13312223barEv,_ZThn28_N3aaa9GG13312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331222E[];
Class_Descriptor cd__ZN3aaa9GG1331222E = {  "_ZN3aaa9GG1331222E", // class name
  bases__ZN3aaa9GG1331222E, 6,
  &(vtc__ZN3aaa9GG1331222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331223  : ::aaa::EE133 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13312233fooEv
  virtual void  bar(); // _ZN3aaa9GG13312233barEv
  ~GG1331223(); // tgen
  GG1331223(); // tgen
};
//SIG(1 _ZN3aaa9GG1331223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13312233fooEv");}
void  aaa::GG1331223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13312233barEv");}
aaa::GG1331223 ::~GG1331223(){ note_dtor("_ZN3aaa9GG1331223E", this);} // tgen
aaa::GG1331223 ::GG1331223(){ note_ctor("_ZN3aaa9GG1331223E", this);} // tgen
}
static void Test__ZN3aaa9GG1331223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331223E, buf);
    ::aaa::GG1331223 *dp, &lv = *(dp=new (buf) ::aaa::GG1331223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331223E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1331223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG1331223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG1331223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331223E);
    dp->::aaa::GG1331223::~GG1331223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331223E(Test__ZN3aaa9GG1331223E, "_ZN3aaa9GG1331223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331223C1Ev();
extern void _ZN3aaa9GG1331223D1Ev();
Name_Map name_map__ZN3aaa9GG1331223E[] = {
  NSPAIR(_ZN3aaa9GG1331223C1Ev),
  NSPAIR(_ZN3aaa9GG1331223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG1331223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331223E[];
extern void _ZN3aaa9GG13312233fooEv();
extern void _ZN3aaa9GG13312233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13312233fooEv,_ZThn8_N3aaa9GG13312233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13312233barEv,_ZThn8_N3aaa9GG13312233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13312233fooEv,_ZThn20_N3aaa9GG13312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13312233barEv,_ZThn20_N3aaa9GG13312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13312233barEv,_ZThn28_N3aaa9GG13312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13312233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13312233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312233fooEv,_ZThn8_N3aaa9GG13312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312233barEv,_ZThn8_N3aaa9GG13312233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312233fooEv,_ZThn20_N3aaa9GG13312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312233barEv,_ZThn20_N3aaa9GG13312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13312233barEv,_ZThn28_N3aaa9GG13312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331223E[];
Class_Descriptor cd__ZN3aaa9GG1331223E = {  "_ZN3aaa9GG1331223E", // class name
  bases__ZN3aaa9GG1331223E, 6,
  &(vtc__ZN3aaa9GG1331223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331231  : ::aaa::EE133 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13312313fooEv
  ~GG1331231(); // tgen
  GG1331231(); // tgen
};
//SIG(1 _ZN3aaa9GG1331231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13312313fooEv");}
aaa::GG1331231 ::~GG1331231(){ note_dtor("_ZN3aaa9GG1331231E", this);} // tgen
aaa::GG1331231 ::GG1331231(){ note_ctor("_ZN3aaa9GG1331231E", this);} // tgen
}
static void Test__ZN3aaa9GG1331231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331231E, buf);
    ::aaa::GG1331231 *dp, &lv = *(dp=new (buf) ::aaa::GG1331231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331231E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1331231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1331231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1331231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331231E);
    dp->::aaa::GG1331231::~GG1331231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331231E(Test__ZN3aaa9GG1331231E, "_ZN3aaa9GG1331231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331231C1Ev();
extern void _ZN3aaa9GG1331231D1Ev();
Name_Map name_map__ZN3aaa9GG1331231E[] = {
  NSPAIR(_ZN3aaa9GG1331231C1Ev),
  NSPAIR(_ZN3aaa9GG1331231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1331231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331231E[];
extern void _ZN3aaa9GG13312313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13312313fooEv,_ZThn8_N3aaa9GG13312313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13312313fooEv,_ZThn20_N3aaa9GG13312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13312313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312313fooEv,_ZThn8_N3aaa9GG13312313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312313fooEv,_ZThn20_N3aaa9GG13312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331231E[];
Class_Descriptor cd__ZN3aaa9GG1331231E = {  "_ZN3aaa9GG1331231E", // class name
  bases__ZN3aaa9GG1331231E, 6,
  &(vtc__ZN3aaa9GG1331231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331232  : ::aaa::EE133 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13312323barEv
  ~GG1331232(); // tgen
  GG1331232(); // tgen
};
//SIG(1 _ZN3aaa9GG1331232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13312323barEv");}
aaa::GG1331232 ::~GG1331232(){ note_dtor("_ZN3aaa9GG1331232E", this);} // tgen
aaa::GG1331232 ::GG1331232(){ note_ctor("_ZN3aaa9GG1331232E", this);} // tgen
}
static void Test__ZN3aaa9GG1331232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331232E, buf);
    ::aaa::GG1331232 *dp, &lv = *(dp=new (buf) ::aaa::GG1331232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331232E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1331232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1331232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1331232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331232E);
    dp->::aaa::GG1331232::~GG1331232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331232E(Test__ZN3aaa9GG1331232E, "_ZN3aaa9GG1331232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331232C1Ev();
extern void _ZN3aaa9GG1331232D1Ev();
Name_Map name_map__ZN3aaa9GG1331232E[] = {
  NSPAIR(_ZN3aaa9GG1331232C1Ev),
  NSPAIR(_ZN3aaa9GG1331232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1331232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331232E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13312323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13312323barEv,_ZThn8_N3aaa9GG13312323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13312323barEv,_ZThn20_N3aaa9GG13312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13312323barEv,_ZThn28_N3aaa9GG13312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13312323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312323barEv,_ZThn8_N3aaa9GG13312323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312323barEv,_ZThn20_N3aaa9GG13312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13312323barEv,_ZThn28_N3aaa9GG13312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331232E[];
Class_Descriptor cd__ZN3aaa9GG1331232E = {  "_ZN3aaa9GG1331232E", // class name
  bases__ZN3aaa9GG1331232E, 6,
  &(vtc__ZN3aaa9GG1331232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331233  : ::aaa::EE133 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13312333fooEv
  virtual void  bar(); // _ZN3aaa9GG13312333barEv
  ~GG1331233(); // tgen
  GG1331233(); // tgen
};
//SIG(1 _ZN3aaa9GG1331233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13312333fooEv");}
void  aaa::GG1331233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13312333barEv");}
aaa::GG1331233 ::~GG1331233(){ note_dtor("_ZN3aaa9GG1331233E", this);} // tgen
aaa::GG1331233 ::GG1331233(){ note_ctor("_ZN3aaa9GG1331233E", this);} // tgen
}
static void Test__ZN3aaa9GG1331233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331233E, buf);
    ::aaa::GG1331233 *dp, &lv = *(dp=new (buf) ::aaa::GG1331233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331233E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1331233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG1331233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG1331233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331233E);
    dp->::aaa::GG1331233::~GG1331233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331233E(Test__ZN3aaa9GG1331233E, "_ZN3aaa9GG1331233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331233C1Ev();
extern void _ZN3aaa9GG1331233D1Ev();
Name_Map name_map__ZN3aaa9GG1331233E[] = {
  NSPAIR(_ZN3aaa9GG1331233C1Ev),
  NSPAIR(_ZN3aaa9GG1331233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG1331233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331233E[];
extern void _ZN3aaa9GG13312333fooEv();
extern void _ZN3aaa9GG13312333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13312333fooEv,_ZThn8_N3aaa9GG13312333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13312333barEv,_ZThn8_N3aaa9GG13312333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13312333fooEv,_ZThn20_N3aaa9GG13312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13312333barEv,_ZThn20_N3aaa9GG13312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13312333barEv,_ZThn28_N3aaa9GG13312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13312333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13312333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312333fooEv,_ZThn8_N3aaa9GG13312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13312333barEv,_ZThn8_N3aaa9GG13312333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312333fooEv,_ZThn20_N3aaa9GG13312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13312333barEv,_ZThn20_N3aaa9GG13312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13312333barEv,_ZThn28_N3aaa9GG13312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331233E[];
Class_Descriptor cd__ZN3aaa9GG1331233E = {  "_ZN3aaa9GG1331233E", // class name
  bases__ZN3aaa9GG1331233E, 6,
  &(vtc__ZN3aaa9GG1331233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331311  : ::aaa::EE133 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13313113fooEv
  ~GG1331311(); // tgen
  GG1331311(); // tgen
};
//SIG(1 _ZN3aaa9GG1331311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13313113fooEv");}
aaa::GG1331311 ::~GG1331311(){ note_dtor("_ZN3aaa9GG1331311E", this);} // tgen
aaa::GG1331311 ::GG1331311(){ note_ctor("_ZN3aaa9GG1331311E", this);} // tgen
}
static void Test__ZN3aaa9GG1331311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331311E, buf);
    ::aaa::GG1331311 *dp, &lv = *(dp=new (buf) ::aaa::GG1331311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331311E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1331311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1331311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1331311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331311E);
    dp->::aaa::GG1331311::~GG1331311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331311E(Test__ZN3aaa9GG1331311E, "_ZN3aaa9GG1331311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331311C1Ev();
extern void _ZN3aaa9GG1331311D1Ev();
Name_Map name_map__ZN3aaa9GG1331311E[] = {
  NSPAIR(_ZN3aaa9GG1331311C1Ev),
  NSPAIR(_ZN3aaa9GG1331311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1331311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331311E[];
extern void _ZN3aaa9GG13313113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13313113fooEv,_ZThn8_N3aaa9GG13313113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13313113fooEv,_ZThn20_N3aaa9GG13313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313113fooEv,_ZThn28_N3aaa9GG13313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13313113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313113fooEv,_ZThn8_N3aaa9GG13313113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313113fooEv,_ZThn20_N3aaa9GG13313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313113fooEv,_ZThn28_N3aaa9GG13313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331311E[];
Class_Descriptor cd__ZN3aaa9GG1331311E = {  "_ZN3aaa9GG1331311E", // class name
  bases__ZN3aaa9GG1331311E, 6,
  &(vtc__ZN3aaa9GG1331311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331312  : ::aaa::EE133 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13313123barEv
  ~GG1331312(); // tgen
  GG1331312(); // tgen
};
//SIG(1 _ZN3aaa9GG1331312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13313123barEv");}
aaa::GG1331312 ::~GG1331312(){ note_dtor("_ZN3aaa9GG1331312E", this);} // tgen
aaa::GG1331312 ::GG1331312(){ note_ctor("_ZN3aaa9GG1331312E", this);} // tgen
}
static void Test__ZN3aaa9GG1331312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331312E, buf);
    ::aaa::GG1331312 *dp, &lv = *(dp=new (buf) ::aaa::GG1331312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331312E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1331312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1331312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1331312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331312E);
    dp->::aaa::GG1331312::~GG1331312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331312E(Test__ZN3aaa9GG1331312E, "_ZN3aaa9GG1331312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331312C1Ev();
extern void _ZN3aaa9GG1331312D1Ev();
Name_Map name_map__ZN3aaa9GG1331312E[] = {
  NSPAIR(_ZN3aaa9GG1331312C1Ev),
  NSPAIR(_ZN3aaa9GG1331312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1331312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331312E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13313123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13313123barEv,_ZThn8_N3aaa9GG13313123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313123barEv,_ZThn28_N3aaa9GG13313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13313123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313123barEv,_ZThn8_N3aaa9GG13313123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313123barEv,_ZThn28_N3aaa9GG13313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331312E[];
Class_Descriptor cd__ZN3aaa9GG1331312E = {  "_ZN3aaa9GG1331312E", // class name
  bases__ZN3aaa9GG1331312E, 6,
  &(vtc__ZN3aaa9GG1331312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331313  : ::aaa::EE133 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13313133fooEv
  virtual void  bar(); // _ZN3aaa9GG13313133barEv
  ~GG1331313(); // tgen
  GG1331313(); // tgen
};
//SIG(1 _ZN3aaa9GG1331313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13313133fooEv");}
void  aaa::GG1331313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13313133barEv");}
aaa::GG1331313 ::~GG1331313(){ note_dtor("_ZN3aaa9GG1331313E", this);} // tgen
aaa::GG1331313 ::GG1331313(){ note_ctor("_ZN3aaa9GG1331313E", this);} // tgen
}
static void Test__ZN3aaa9GG1331313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331313E, buf);
    ::aaa::GG1331313 *dp, &lv = *(dp=new (buf) ::aaa::GG1331313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331313E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1331313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG1331313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG1331313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331313E);
    dp->::aaa::GG1331313::~GG1331313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331313E(Test__ZN3aaa9GG1331313E, "_ZN3aaa9GG1331313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331313C1Ev();
extern void _ZN3aaa9GG1331313D1Ev();
Name_Map name_map__ZN3aaa9GG1331313E[] = {
  NSPAIR(_ZN3aaa9GG1331313C1Ev),
  NSPAIR(_ZN3aaa9GG1331313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG1331313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331313E[];
extern void _ZN3aaa9GG13313133fooEv();
extern void _ZN3aaa9GG13313133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13313133fooEv,_ZThn8_N3aaa9GG13313133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13313133barEv,_ZThn8_N3aaa9GG13313133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13313133fooEv,_ZThn20_N3aaa9GG13313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313133fooEv,_ZThn28_N3aaa9GG13313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313133barEv,_ZThn28_N3aaa9GG13313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13313133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13313133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313133fooEv,_ZThn8_N3aaa9GG13313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313133barEv,_ZThn8_N3aaa9GG13313133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313133fooEv,_ZThn20_N3aaa9GG13313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313133fooEv,_ZThn28_N3aaa9GG13313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313133barEv,_ZThn28_N3aaa9GG13313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331313E[];
Class_Descriptor cd__ZN3aaa9GG1331313E = {  "_ZN3aaa9GG1331313E", // class name
  bases__ZN3aaa9GG1331313E, 6,
  &(vtc__ZN3aaa9GG1331313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331321  : ::aaa::EE133 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13313213fooEv
  ~GG1331321(); // tgen
  GG1331321(); // tgen
};
//SIG(1 _ZN3aaa9GG1331321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13313213fooEv");}
aaa::GG1331321 ::~GG1331321(){ note_dtor("_ZN3aaa9GG1331321E", this);} // tgen
aaa::GG1331321 ::GG1331321(){ note_ctor("_ZN3aaa9GG1331321E", this);} // tgen
}
static void Test__ZN3aaa9GG1331321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331321E, buf);
    ::aaa::GG1331321 *dp, &lv = *(dp=new (buf) ::aaa::GG1331321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331321E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1331321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1331321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1331321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331321E);
    dp->::aaa::GG1331321::~GG1331321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331321E(Test__ZN3aaa9GG1331321E, "_ZN3aaa9GG1331321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331321C1Ev();
extern void _ZN3aaa9GG1331321D1Ev();
Name_Map name_map__ZN3aaa9GG1331321E[] = {
  NSPAIR(_ZN3aaa9GG1331321C1Ev),
  NSPAIR(_ZN3aaa9GG1331321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1331321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331321E[];
extern void _ZN3aaa9GG13313213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13313213fooEv,_ZThn8_N3aaa9GG13313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13313213fooEv,_ZThn20_N3aaa9GG13313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13313213fooEv,_ZThn28_N3aaa9GG13313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13313213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313213fooEv,_ZThn8_N3aaa9GG13313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313213fooEv,_ZThn20_N3aaa9GG13313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313213fooEv,_ZThn28_N3aaa9GG13313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331321E[];
Class_Descriptor cd__ZN3aaa9GG1331321E = {  "_ZN3aaa9GG1331321E", // class name
  bases__ZN3aaa9GG1331321E, 6,
  &(vtc__ZN3aaa9GG1331321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331322  : ::aaa::EE133 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13313223barEv
  ~GG1331322(); // tgen
  GG1331322(); // tgen
};
//SIG(1 _ZN3aaa9GG1331322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13313223barEv");}
aaa::GG1331322 ::~GG1331322(){ note_dtor("_ZN3aaa9GG1331322E", this);} // tgen
aaa::GG1331322 ::GG1331322(){ note_ctor("_ZN3aaa9GG1331322E", this);} // tgen
}
static void Test__ZN3aaa9GG1331322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331322E, buf);
    ::aaa::GG1331322 *dp, &lv = *(dp=new (buf) ::aaa::GG1331322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331322E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1331322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1331322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1331322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331322E);
    dp->::aaa::GG1331322::~GG1331322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331322E(Test__ZN3aaa9GG1331322E, "_ZN3aaa9GG1331322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331322C1Ev();
extern void _ZN3aaa9GG1331322D1Ev();
Name_Map name_map__ZN3aaa9GG1331322E[] = {
  NSPAIR(_ZN3aaa9GG1331322C1Ev),
  NSPAIR(_ZN3aaa9GG1331322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1331322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331322E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13313223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13313223barEv,_ZThn8_N3aaa9GG13313223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13313223barEv,_ZThn20_N3aaa9GG13313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13313223barEv,_ZThn28_N3aaa9GG13313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13313223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313223barEv,_ZThn8_N3aaa9GG13313223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313223barEv,_ZThn20_N3aaa9GG13313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313223barEv,_ZThn28_N3aaa9GG13313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331322E[];
Class_Descriptor cd__ZN3aaa9GG1331322E = {  "_ZN3aaa9GG1331322E", // class name
  bases__ZN3aaa9GG1331322E, 6,
  &(vtc__ZN3aaa9GG1331322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331323  : ::aaa::EE133 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13313233fooEv
  virtual void  bar(); // _ZN3aaa9GG13313233barEv
  ~GG1331323(); // tgen
  GG1331323(); // tgen
};
//SIG(1 _ZN3aaa9GG1331323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13313233fooEv");}
void  aaa::GG1331323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13313233barEv");}
aaa::GG1331323 ::~GG1331323(){ note_dtor("_ZN3aaa9GG1331323E", this);} // tgen
aaa::GG1331323 ::GG1331323(){ note_ctor("_ZN3aaa9GG1331323E", this);} // tgen
}
static void Test__ZN3aaa9GG1331323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331323E, buf);
    ::aaa::GG1331323 *dp, &lv = *(dp=new (buf) ::aaa::GG1331323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331323E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1331323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG1331323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG1331323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331323E);
    dp->::aaa::GG1331323::~GG1331323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331323E(Test__ZN3aaa9GG1331323E, "_ZN3aaa9GG1331323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331323C1Ev();
extern void _ZN3aaa9GG1331323D1Ev();
Name_Map name_map__ZN3aaa9GG1331323E[] = {
  NSPAIR(_ZN3aaa9GG1331323C1Ev),
  NSPAIR(_ZN3aaa9GG1331323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG1331323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331323E[];
extern void _ZN3aaa9GG13313233fooEv();
extern void _ZN3aaa9GG13313233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13313233fooEv,_ZThn8_N3aaa9GG13313233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13313233barEv,_ZThn8_N3aaa9GG13313233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13313233fooEv,_ZThn20_N3aaa9GG13313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13313233barEv,_ZThn20_N3aaa9GG13313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313233fooEv,_ZThn28_N3aaa9GG13313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313233barEv,_ZThn28_N3aaa9GG13313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13313233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13313233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313233fooEv,_ZThn8_N3aaa9GG13313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313233barEv,_ZThn8_N3aaa9GG13313233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313233fooEv,_ZThn20_N3aaa9GG13313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313233barEv,_ZThn20_N3aaa9GG13313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313233fooEv,_ZThn28_N3aaa9GG13313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313233barEv,_ZThn28_N3aaa9GG13313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331323E[];
Class_Descriptor cd__ZN3aaa9GG1331323E = {  "_ZN3aaa9GG1331323E", // class name
  bases__ZN3aaa9GG1331323E, 6,
  &(vtc__ZN3aaa9GG1331323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331331  : ::aaa::EE133 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13313313fooEv
  ~GG1331331(); // tgen
  GG1331331(); // tgen
};
//SIG(1 _ZN3aaa9GG1331331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13313313fooEv");}
aaa::GG1331331 ::~GG1331331(){ note_dtor("_ZN3aaa9GG1331331E", this);} // tgen
aaa::GG1331331 ::GG1331331(){ note_ctor("_ZN3aaa9GG1331331E", this);} // tgen
}
static void Test__ZN3aaa9GG1331331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331331E, buf);
    ::aaa::GG1331331 *dp, &lv = *(dp=new (buf) ::aaa::GG1331331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331331E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1331331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1331331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1331331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331331E);
    dp->::aaa::GG1331331::~GG1331331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331331E(Test__ZN3aaa9GG1331331E, "_ZN3aaa9GG1331331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331331C1Ev();
extern void _ZN3aaa9GG1331331D1Ev();
Name_Map name_map__ZN3aaa9GG1331331E[] = {
  NSPAIR(_ZN3aaa9GG1331331C1Ev),
  NSPAIR(_ZN3aaa9GG1331331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1331331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331331E[];
extern void _ZN3aaa9GG13313313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13313313fooEv,_ZThn8_N3aaa9GG13313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13313313fooEv,_ZThn20_N3aaa9GG13313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13313313fooEv,_ZThn28_N3aaa9GG13313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13313313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313313fooEv,_ZThn8_N3aaa9GG13313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313313fooEv,_ZThn20_N3aaa9GG13313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313313fooEv,_ZThn28_N3aaa9GG13313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331331E[];
Class_Descriptor cd__ZN3aaa9GG1331331E = {  "_ZN3aaa9GG1331331E", // class name
  bases__ZN3aaa9GG1331331E, 6,
  &(vtc__ZN3aaa9GG1331331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331332  : ::aaa::EE133 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13313323barEv
  ~GG1331332(); // tgen
  GG1331332(); // tgen
};
//SIG(1 _ZN3aaa9GG1331332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1331332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13313323barEv");}
aaa::GG1331332 ::~GG1331332(){ note_dtor("_ZN3aaa9GG1331332E", this);} // tgen
aaa::GG1331332 ::GG1331332(){ note_ctor("_ZN3aaa9GG1331332E", this);} // tgen
}
static void Test__ZN3aaa9GG1331332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331332E, buf);
    ::aaa::GG1331332 *dp, &lv = *(dp=new (buf) ::aaa::GG1331332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331332E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1331332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1331332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1331332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331332E);
    dp->::aaa::GG1331332::~GG1331332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331332E(Test__ZN3aaa9GG1331332E, "_ZN3aaa9GG1331332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331332C1Ev();
extern void _ZN3aaa9GG1331332D1Ev();
Name_Map name_map__ZN3aaa9GG1331332E[] = {
  NSPAIR(_ZN3aaa9GG1331332C1Ev),
  NSPAIR(_ZN3aaa9GG1331332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1331332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331332E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13313323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13313323barEv,_ZThn8_N3aaa9GG13313323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13313323barEv,_ZThn20_N3aaa9GG13313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313323barEv,_ZThn28_N3aaa9GG13313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13313323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313323barEv,_ZThn8_N3aaa9GG13313323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313323barEv,_ZThn20_N3aaa9GG13313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313323barEv,_ZThn28_N3aaa9GG13313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331332E[];
Class_Descriptor cd__ZN3aaa9GG1331332E = {  "_ZN3aaa9GG1331332E", // class name
  bases__ZN3aaa9GG1331332E, 6,
  &(vtc__ZN3aaa9GG1331332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1331333  : ::aaa::EE133 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13313333fooEv
  virtual void  bar(); // _ZN3aaa9GG13313333barEv
  ~GG1331333(); // tgen
  GG1331333(); // tgen
};
//SIG(1 _ZN3aaa9GG1331333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1331333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13313333fooEv");}
void  aaa::GG1331333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13313333barEv");}
aaa::GG1331333 ::~GG1331333(){ note_dtor("_ZN3aaa9GG1331333E", this);} // tgen
aaa::GG1331333 ::GG1331333(){ note_ctor("_ZN3aaa9GG1331333E", this);} // tgen
}
static void Test__ZN3aaa9GG1331333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1331333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1331333E, buf);
    ::aaa::GG1331333 *dp, &lv = *(dp=new (buf) ::aaa::GG1331333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1331333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1331333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1331333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1331333E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1331333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1331333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG1331333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG1331333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1331333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1331333E);
    dp->::aaa::GG1331333::~GG1331333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1331333E(Test__ZN3aaa9GG1331333E, "_ZN3aaa9GG1331333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1331333C1Ev();
extern void _ZN3aaa9GG1331333D1Ev();
Name_Map name_map__ZN3aaa9GG1331333E[] = {
  NSPAIR(_ZN3aaa9GG1331333C1Ev),
  NSPAIR(_ZN3aaa9GG1331333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG1331333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1331333E[];
extern void _ZN3aaa9GG13313333fooEv();
extern void _ZN3aaa9GG13313333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13313333fooEv,_ZThn8_N3aaa9GG13313333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13313333barEv,_ZThn8_N3aaa9GG13313333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13313333fooEv,_ZThn20_N3aaa9GG13313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13313333barEv,_ZThn20_N3aaa9GG13313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313333fooEv,_ZThn28_N3aaa9GG13313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13313333barEv,_ZThn28_N3aaa9GG13313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1331333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13313333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13313333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313333fooEv,_ZThn8_N3aaa9GG13313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13313333barEv,_ZThn8_N3aaa9GG13313333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313333fooEv,_ZThn20_N3aaa9GG13313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13313333barEv,_ZThn20_N3aaa9GG13313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313333fooEv,_ZThn28_N3aaa9GG13313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13313333barEv,_ZThn28_N3aaa9GG13313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1331333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1331333E[];
Class_Descriptor cd__ZN3aaa9GG1331333E = {  "_ZN3aaa9GG1331333E", // class name
  bases__ZN3aaa9GG1331333E, 6,
  &(vtc__ZN3aaa9GG1331333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1331333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1331333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332111  : ::aaa::EE133 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13321113fooEv
  ~GG1332111(); // tgen
  GG1332111(); // tgen
};
//SIG(1 _ZN3aaa9GG1332111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13321113fooEv");}
aaa::GG1332111 ::~GG1332111(){ note_dtor("_ZN3aaa9GG1332111E", this);} // tgen
aaa::GG1332111 ::GG1332111(){ note_ctor("_ZN3aaa9GG1332111E", this);} // tgen
}
static void Test__ZN3aaa9GG1332111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332111E, buf);
    ::aaa::GG1332111 *dp, &lv = *(dp=new (buf) ::aaa::GG1332111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332111E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1332111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1332111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1332111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332111E);
    dp->::aaa::GG1332111::~GG1332111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332111E(Test__ZN3aaa9GG1332111E, "_ZN3aaa9GG1332111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332111C1Ev();
extern void _ZN3aaa9GG1332111D1Ev();
Name_Map name_map__ZN3aaa9GG1332111E[] = {
  NSPAIR(_ZN3aaa9GG1332111C1Ev),
  NSPAIR(_ZN3aaa9GG1332111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1332111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332111E[];
extern void _ZN3aaa9GG13321113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13321113fooEv,_ZThn8_N3aaa9GG13321113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13321113fooEv,_ZThn20_N3aaa9GG13321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13321113fooEv,_ZThn28_N3aaa9GG13321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13321113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321113fooEv,_ZThn8_N3aaa9GG13321113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321113fooEv,_ZThn20_N3aaa9GG13321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13321113fooEv,_ZThn28_N3aaa9GG13321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332111E[];
Class_Descriptor cd__ZN3aaa9GG1332111E = {  "_ZN3aaa9GG1332111E", // class name
  bases__ZN3aaa9GG1332111E, 6,
  &(vtc__ZN3aaa9GG1332111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332112  : ::aaa::EE133 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13321123barEv
  ~GG1332112(); // tgen
  GG1332112(); // tgen
};
//SIG(1 _ZN3aaa9GG1332112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13321123barEv");}
aaa::GG1332112 ::~GG1332112(){ note_dtor("_ZN3aaa9GG1332112E", this);} // tgen
aaa::GG1332112 ::GG1332112(){ note_ctor("_ZN3aaa9GG1332112E", this);} // tgen
}
static void Test__ZN3aaa9GG1332112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332112E, buf);
    ::aaa::GG1332112 *dp, &lv = *(dp=new (buf) ::aaa::GG1332112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332112E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1332112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1332112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1332112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332112E);
    dp->::aaa::GG1332112::~GG1332112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332112E(Test__ZN3aaa9GG1332112E, "_ZN3aaa9GG1332112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332112C1Ev();
extern void _ZN3aaa9GG1332112D1Ev();
Name_Map name_map__ZN3aaa9GG1332112E[] = {
  NSPAIR(_ZN3aaa9GG1332112C1Ev),
  NSPAIR(_ZN3aaa9GG1332112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1332112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332112E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13321123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13321123barEv,_ZThn8_N3aaa9GG13321123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13321123barEv,_ZThn20_N3aaa9GG13321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13321123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321123barEv,_ZThn8_N3aaa9GG13321123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321123barEv,_ZThn20_N3aaa9GG13321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332112E[];
Class_Descriptor cd__ZN3aaa9GG1332112E = {  "_ZN3aaa9GG1332112E", // class name
  bases__ZN3aaa9GG1332112E, 6,
  &(vtc__ZN3aaa9GG1332112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332113  : ::aaa::EE133 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13321133fooEv
  virtual void  bar(); // _ZN3aaa9GG13321133barEv
  ~GG1332113(); // tgen
  GG1332113(); // tgen
};
//SIG(1 _ZN3aaa9GG1332113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13321133fooEv");}
void  aaa::GG1332113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13321133barEv");}
aaa::GG1332113 ::~GG1332113(){ note_dtor("_ZN3aaa9GG1332113E", this);} // tgen
aaa::GG1332113 ::GG1332113(){ note_ctor("_ZN3aaa9GG1332113E", this);} // tgen
}
static void Test__ZN3aaa9GG1332113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332113E, buf);
    ::aaa::GG1332113 *dp, &lv = *(dp=new (buf) ::aaa::GG1332113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332113E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1332113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG1332113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG1332113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332113E);
    dp->::aaa::GG1332113::~GG1332113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332113E(Test__ZN3aaa9GG1332113E, "_ZN3aaa9GG1332113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332113C1Ev();
extern void _ZN3aaa9GG1332113D1Ev();
Name_Map name_map__ZN3aaa9GG1332113E[] = {
  NSPAIR(_ZN3aaa9GG1332113C1Ev),
  NSPAIR(_ZN3aaa9GG1332113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG1332113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332113E[];
extern void _ZN3aaa9GG13321133fooEv();
extern void _ZN3aaa9GG13321133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13321133fooEv,_ZThn8_N3aaa9GG13321133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13321133barEv,_ZThn8_N3aaa9GG13321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13321133barEv,_ZThn20_N3aaa9GG13321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13321133fooEv,_ZThn20_N3aaa9GG13321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13321133fooEv,_ZThn28_N3aaa9GG13321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13321133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13321133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321133fooEv,_ZThn8_N3aaa9GG13321133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321133barEv,_ZThn8_N3aaa9GG13321133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321133barEv,_ZThn20_N3aaa9GG13321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321133fooEv,_ZThn20_N3aaa9GG13321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13321133fooEv,_ZThn28_N3aaa9GG13321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332113E[];
Class_Descriptor cd__ZN3aaa9GG1332113E = {  "_ZN3aaa9GG1332113E", // class name
  bases__ZN3aaa9GG1332113E, 6,
  &(vtc__ZN3aaa9GG1332113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332121  : ::aaa::EE133 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13321213fooEv
  ~GG1332121(); // tgen
  GG1332121(); // tgen
};
//SIG(1 _ZN3aaa9GG1332121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13321213fooEv");}
aaa::GG1332121 ::~GG1332121(){ note_dtor("_ZN3aaa9GG1332121E", this);} // tgen
aaa::GG1332121 ::GG1332121(){ note_ctor("_ZN3aaa9GG1332121E", this);} // tgen
}
static void Test__ZN3aaa9GG1332121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332121E, buf);
    ::aaa::GG1332121 *dp, &lv = *(dp=new (buf) ::aaa::GG1332121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332121E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1332121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1332121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1332121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332121E);
    dp->::aaa::GG1332121::~GG1332121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332121E(Test__ZN3aaa9GG1332121E, "_ZN3aaa9GG1332121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332121C1Ev();
extern void _ZN3aaa9GG1332121D1Ev();
Name_Map name_map__ZN3aaa9GG1332121E[] = {
  NSPAIR(_ZN3aaa9GG1332121C1Ev),
  NSPAIR(_ZN3aaa9GG1332121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1332121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332121E[];
extern void _ZN3aaa9GG13321213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13321213fooEv,_ZThn8_N3aaa9GG13321213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13321213fooEv,_ZThn28_N3aaa9GG13321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13321213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321213fooEv,_ZThn8_N3aaa9GG13321213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13321213fooEv,_ZThn28_N3aaa9GG13321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332121E[];
Class_Descriptor cd__ZN3aaa9GG1332121E = {  "_ZN3aaa9GG1332121E", // class name
  bases__ZN3aaa9GG1332121E, 6,
  &(vtc__ZN3aaa9GG1332121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332122  : ::aaa::EE133 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13321223barEv
  ~GG1332122(); // tgen
  GG1332122(); // tgen
};
//SIG(1 _ZN3aaa9GG1332122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13321223barEv");}
aaa::GG1332122 ::~GG1332122(){ note_dtor("_ZN3aaa9GG1332122E", this);} // tgen
aaa::GG1332122 ::GG1332122(){ note_ctor("_ZN3aaa9GG1332122E", this);} // tgen
}
static void Test__ZN3aaa9GG1332122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332122E, buf);
    ::aaa::GG1332122 *dp, &lv = *(dp=new (buf) ::aaa::GG1332122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332122E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1332122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1332122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1332122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332122E);
    dp->::aaa::GG1332122::~GG1332122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332122E(Test__ZN3aaa9GG1332122E, "_ZN3aaa9GG1332122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332122C1Ev();
extern void _ZN3aaa9GG1332122D1Ev();
Name_Map name_map__ZN3aaa9GG1332122E[] = {
  NSPAIR(_ZN3aaa9GG1332122C1Ev),
  NSPAIR(_ZN3aaa9GG1332122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1332122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332122E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13321223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13321223barEv,_ZThn8_N3aaa9GG13321223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13321223barEv,_ZThn20_N3aaa9GG13321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13321223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321223barEv,_ZThn8_N3aaa9GG13321223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321223barEv,_ZThn20_N3aaa9GG13321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332122E[];
Class_Descriptor cd__ZN3aaa9GG1332122E = {  "_ZN3aaa9GG1332122E", // class name
  bases__ZN3aaa9GG1332122E, 6,
  &(vtc__ZN3aaa9GG1332122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332123  : ::aaa::EE133 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13321233fooEv
  virtual void  bar(); // _ZN3aaa9GG13321233barEv
  ~GG1332123(); // tgen
  GG1332123(); // tgen
};
//SIG(1 _ZN3aaa9GG1332123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13321233fooEv");}
void  aaa::GG1332123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13321233barEv");}
aaa::GG1332123 ::~GG1332123(){ note_dtor("_ZN3aaa9GG1332123E", this);} // tgen
aaa::GG1332123 ::GG1332123(){ note_ctor("_ZN3aaa9GG1332123E", this);} // tgen
}
static void Test__ZN3aaa9GG1332123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332123E, buf);
    ::aaa::GG1332123 *dp, &lv = *(dp=new (buf) ::aaa::GG1332123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332123E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1332123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG1332123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG1332123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332123E);
    dp->::aaa::GG1332123::~GG1332123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332123E(Test__ZN3aaa9GG1332123E, "_ZN3aaa9GG1332123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332123C1Ev();
extern void _ZN3aaa9GG1332123D1Ev();
Name_Map name_map__ZN3aaa9GG1332123E[] = {
  NSPAIR(_ZN3aaa9GG1332123C1Ev),
  NSPAIR(_ZN3aaa9GG1332123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG1332123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332123E[];
extern void _ZN3aaa9GG13321233fooEv();
extern void _ZN3aaa9GG13321233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13321233fooEv,_ZThn8_N3aaa9GG13321233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13321233barEv,_ZThn8_N3aaa9GG13321233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13321233barEv,_ZThn20_N3aaa9GG13321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13321233fooEv,_ZThn28_N3aaa9GG13321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13321233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13321233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321233fooEv,_ZThn8_N3aaa9GG13321233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321233barEv,_ZThn8_N3aaa9GG13321233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321233barEv,_ZThn20_N3aaa9GG13321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13321233fooEv,_ZThn28_N3aaa9GG13321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332123E[];
Class_Descriptor cd__ZN3aaa9GG1332123E = {  "_ZN3aaa9GG1332123E", // class name
  bases__ZN3aaa9GG1332123E, 6,
  &(vtc__ZN3aaa9GG1332123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332131  : ::aaa::EE133 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13321313fooEv
  ~GG1332131(); // tgen
  GG1332131(); // tgen
};
//SIG(1 _ZN3aaa9GG1332131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13321313fooEv");}
aaa::GG1332131 ::~GG1332131(){ note_dtor("_ZN3aaa9GG1332131E", this);} // tgen
aaa::GG1332131 ::GG1332131(){ note_ctor("_ZN3aaa9GG1332131E", this);} // tgen
}
static void Test__ZN3aaa9GG1332131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332131E, buf);
    ::aaa::GG1332131 *dp, &lv = *(dp=new (buf) ::aaa::GG1332131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332131E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1332131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1332131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1332131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332131E);
    dp->::aaa::GG1332131::~GG1332131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332131E(Test__ZN3aaa9GG1332131E, "_ZN3aaa9GG1332131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332131C1Ev();
extern void _ZN3aaa9GG1332131D1Ev();
Name_Map name_map__ZN3aaa9GG1332131E[] = {
  NSPAIR(_ZN3aaa9GG1332131C1Ev),
  NSPAIR(_ZN3aaa9GG1332131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1332131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332131E[];
extern void _ZN3aaa9GG13321313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13321313fooEv,_ZThn8_N3aaa9GG13321313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13321313fooEv,_ZThn20_N3aaa9GG13321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13321313fooEv,_ZThn28_N3aaa9GG13321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13321313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321313fooEv,_ZThn8_N3aaa9GG13321313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321313fooEv,_ZThn20_N3aaa9GG13321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13321313fooEv,_ZThn28_N3aaa9GG13321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332131E[];
Class_Descriptor cd__ZN3aaa9GG1332131E = {  "_ZN3aaa9GG1332131E", // class name
  bases__ZN3aaa9GG1332131E, 6,
  &(vtc__ZN3aaa9GG1332131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332132  : ::aaa::EE133 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13321323barEv
  ~GG1332132(); // tgen
  GG1332132(); // tgen
};
//SIG(1 _ZN3aaa9GG1332132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13321323barEv");}
aaa::GG1332132 ::~GG1332132(){ note_dtor("_ZN3aaa9GG1332132E", this);} // tgen
aaa::GG1332132 ::GG1332132(){ note_ctor("_ZN3aaa9GG1332132E", this);} // tgen
}
static void Test__ZN3aaa9GG1332132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332132E, buf);
    ::aaa::GG1332132 *dp, &lv = *(dp=new (buf) ::aaa::GG1332132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332132E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1332132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1332132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1332132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332132E);
    dp->::aaa::GG1332132::~GG1332132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332132E(Test__ZN3aaa9GG1332132E, "_ZN3aaa9GG1332132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332132C1Ev();
extern void _ZN3aaa9GG1332132D1Ev();
Name_Map name_map__ZN3aaa9GG1332132E[] = {
  NSPAIR(_ZN3aaa9GG1332132C1Ev),
  NSPAIR(_ZN3aaa9GG1332132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1332132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332132E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13321323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13321323barEv,_ZThn8_N3aaa9GG13321323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13321323barEv,_ZThn20_N3aaa9GG13321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13321323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321323barEv,_ZThn8_N3aaa9GG13321323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321323barEv,_ZThn20_N3aaa9GG13321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332132E[];
Class_Descriptor cd__ZN3aaa9GG1332132E = {  "_ZN3aaa9GG1332132E", // class name
  bases__ZN3aaa9GG1332132E, 6,
  &(vtc__ZN3aaa9GG1332132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332133  : ::aaa::EE133 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13321333fooEv
  virtual void  bar(); // _ZN3aaa9GG13321333barEv
  ~GG1332133(); // tgen
  GG1332133(); // tgen
};
//SIG(1 _ZN3aaa9GG1332133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13321333fooEv");}
void  aaa::GG1332133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13321333barEv");}
aaa::GG1332133 ::~GG1332133(){ note_dtor("_ZN3aaa9GG1332133E", this);} // tgen
aaa::GG1332133 ::GG1332133(){ note_ctor("_ZN3aaa9GG1332133E", this);} // tgen
}
static void Test__ZN3aaa9GG1332133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332133E, buf);
    ::aaa::GG1332133 *dp, &lv = *(dp=new (buf) ::aaa::GG1332133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332133E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1332133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG1332133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG1332133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332133E);
    dp->::aaa::GG1332133::~GG1332133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332133E(Test__ZN3aaa9GG1332133E, "_ZN3aaa9GG1332133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332133C1Ev();
extern void _ZN3aaa9GG1332133D1Ev();
Name_Map name_map__ZN3aaa9GG1332133E[] = {
  NSPAIR(_ZN3aaa9GG1332133C1Ev),
  NSPAIR(_ZN3aaa9GG1332133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG1332133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332133E[];
extern void _ZN3aaa9GG13321333fooEv();
extern void _ZN3aaa9GG13321333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13321333fooEv,_ZThn8_N3aaa9GG13321333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13321333barEv,_ZThn8_N3aaa9GG13321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13321333barEv,_ZThn20_N3aaa9GG13321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13321333fooEv,_ZThn20_N3aaa9GG13321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13321333fooEv,_ZThn28_N3aaa9GG13321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13321333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13321333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321333fooEv,_ZThn8_N3aaa9GG13321333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13321333barEv,_ZThn8_N3aaa9GG13321333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321333barEv,_ZThn20_N3aaa9GG13321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13321333fooEv,_ZThn20_N3aaa9GG13321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13321333fooEv,_ZThn28_N3aaa9GG13321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332133E[];
Class_Descriptor cd__ZN3aaa9GG1332133E = {  "_ZN3aaa9GG1332133E", // class name
  bases__ZN3aaa9GG1332133E, 6,
  &(vtc__ZN3aaa9GG1332133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332211  : ::aaa::EE133 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13322113fooEv
  ~GG1332211(); // tgen
  GG1332211(); // tgen
};
//SIG(1 _ZN3aaa9GG1332211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13322113fooEv");}
aaa::GG1332211 ::~GG1332211(){ note_dtor("_ZN3aaa9GG1332211E", this);} // tgen
aaa::GG1332211 ::GG1332211(){ note_ctor("_ZN3aaa9GG1332211E", this);} // tgen
}
static void Test__ZN3aaa9GG1332211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332211E, buf);
    ::aaa::GG1332211 *dp, &lv = *(dp=new (buf) ::aaa::GG1332211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332211E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1332211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1332211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1332211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332211E);
    dp->::aaa::GG1332211::~GG1332211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332211E(Test__ZN3aaa9GG1332211E, "_ZN3aaa9GG1332211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332211C1Ev();
extern void _ZN3aaa9GG1332211D1Ev();
Name_Map name_map__ZN3aaa9GG1332211E[] = {
  NSPAIR(_ZN3aaa9GG1332211C1Ev),
  NSPAIR(_ZN3aaa9GG1332211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1332211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332211E[];
extern void _ZN3aaa9GG13322113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13322113fooEv,_ZThn8_N3aaa9GG13322113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13322113fooEv,_ZThn20_N3aaa9GG13322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13322113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322113fooEv,_ZThn8_N3aaa9GG13322113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322113fooEv,_ZThn20_N3aaa9GG13322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332211E[];
Class_Descriptor cd__ZN3aaa9GG1332211E = {  "_ZN3aaa9GG1332211E", // class name
  bases__ZN3aaa9GG1332211E, 6,
  &(vtc__ZN3aaa9GG1332211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332212  : ::aaa::EE133 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13322123barEv
  ~GG1332212(); // tgen
  GG1332212(); // tgen
};
//SIG(1 _ZN3aaa9GG1332212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13322123barEv");}
aaa::GG1332212 ::~GG1332212(){ note_dtor("_ZN3aaa9GG1332212E", this);} // tgen
aaa::GG1332212 ::GG1332212(){ note_ctor("_ZN3aaa9GG1332212E", this);} // tgen
}
static void Test__ZN3aaa9GG1332212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332212E, buf);
    ::aaa::GG1332212 *dp, &lv = *(dp=new (buf) ::aaa::GG1332212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332212E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1332212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1332212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1332212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332212E);
    dp->::aaa::GG1332212::~GG1332212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332212E(Test__ZN3aaa9GG1332212E, "_ZN3aaa9GG1332212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332212C1Ev();
extern void _ZN3aaa9GG1332212D1Ev();
Name_Map name_map__ZN3aaa9GG1332212E[] = {
  NSPAIR(_ZN3aaa9GG1332212C1Ev),
  NSPAIR(_ZN3aaa9GG1332212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1332212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332212E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13322123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13322123barEv,_ZThn8_N3aaa9GG13322123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13322123barEv,_ZThn20_N3aaa9GG13322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13322123barEv,_ZThn28_N3aaa9GG13322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13322123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322123barEv,_ZThn8_N3aaa9GG13322123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322123barEv,_ZThn20_N3aaa9GG13322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13322123barEv,_ZThn28_N3aaa9GG13322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332212E[];
Class_Descriptor cd__ZN3aaa9GG1332212E = {  "_ZN3aaa9GG1332212E", // class name
  bases__ZN3aaa9GG1332212E, 6,
  &(vtc__ZN3aaa9GG1332212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332213  : ::aaa::EE133 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13322133fooEv
  virtual void  bar(); // _ZN3aaa9GG13322133barEv
  ~GG1332213(); // tgen
  GG1332213(); // tgen
};
//SIG(1 _ZN3aaa9GG1332213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13322133fooEv");}
void  aaa::GG1332213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13322133barEv");}
aaa::GG1332213 ::~GG1332213(){ note_dtor("_ZN3aaa9GG1332213E", this);} // tgen
aaa::GG1332213 ::GG1332213(){ note_ctor("_ZN3aaa9GG1332213E", this);} // tgen
}
static void Test__ZN3aaa9GG1332213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332213E, buf);
    ::aaa::GG1332213 *dp, &lv = *(dp=new (buf) ::aaa::GG1332213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332213E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1332213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG1332213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG1332213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332213E);
    dp->::aaa::GG1332213::~GG1332213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332213E(Test__ZN3aaa9GG1332213E, "_ZN3aaa9GG1332213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332213C1Ev();
extern void _ZN3aaa9GG1332213D1Ev();
Name_Map name_map__ZN3aaa9GG1332213E[] = {
  NSPAIR(_ZN3aaa9GG1332213C1Ev),
  NSPAIR(_ZN3aaa9GG1332213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG1332213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332213E[];
extern void _ZN3aaa9GG13322133fooEv();
extern void _ZN3aaa9GG13322133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13322133fooEv,_ZThn8_N3aaa9GG13322133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13322133barEv,_ZThn8_N3aaa9GG13322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13322133barEv,_ZThn20_N3aaa9GG13322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13322133fooEv,_ZThn20_N3aaa9GG13322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13322133barEv,_ZThn28_N3aaa9GG13322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13322133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13322133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322133fooEv,_ZThn8_N3aaa9GG13322133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322133barEv,_ZThn8_N3aaa9GG13322133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322133barEv,_ZThn20_N3aaa9GG13322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322133fooEv,_ZThn20_N3aaa9GG13322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13322133barEv,_ZThn28_N3aaa9GG13322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332213E[];
Class_Descriptor cd__ZN3aaa9GG1332213E = {  "_ZN3aaa9GG1332213E", // class name
  bases__ZN3aaa9GG1332213E, 6,
  &(vtc__ZN3aaa9GG1332213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332221  : ::aaa::EE133 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13322213fooEv
  ~GG1332221(); // tgen
  GG1332221(); // tgen
};
//SIG(1 _ZN3aaa9GG1332221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13322213fooEv");}
aaa::GG1332221 ::~GG1332221(){ note_dtor("_ZN3aaa9GG1332221E", this);} // tgen
aaa::GG1332221 ::GG1332221(){ note_ctor("_ZN3aaa9GG1332221E", this);} // tgen
}
static void Test__ZN3aaa9GG1332221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332221E, buf);
    ::aaa::GG1332221 *dp, &lv = *(dp=new (buf) ::aaa::GG1332221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332221E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1332221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1332221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1332221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332221E);
    dp->::aaa::GG1332221::~GG1332221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332221E(Test__ZN3aaa9GG1332221E, "_ZN3aaa9GG1332221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332221C1Ev();
extern void _ZN3aaa9GG1332221D1Ev();
Name_Map name_map__ZN3aaa9GG1332221E[] = {
  NSPAIR(_ZN3aaa9GG1332221C1Ev),
  NSPAIR(_ZN3aaa9GG1332221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1332221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332221E[];
extern void _ZN3aaa9GG13322213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13322213fooEv,_ZThn8_N3aaa9GG13322213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13322213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322213fooEv,_ZThn8_N3aaa9GG13322213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332221E[];
Class_Descriptor cd__ZN3aaa9GG1332221E = {  "_ZN3aaa9GG1332221E", // class name
  bases__ZN3aaa9GG1332221E, 6,
  &(vtc__ZN3aaa9GG1332221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332222  : ::aaa::EE133 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13322223barEv
  ~GG1332222(); // tgen
  GG1332222(); // tgen
};
//SIG(1 _ZN3aaa9GG1332222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13322223barEv");}
aaa::GG1332222 ::~GG1332222(){ note_dtor("_ZN3aaa9GG1332222E", this);} // tgen
aaa::GG1332222 ::GG1332222(){ note_ctor("_ZN3aaa9GG1332222E", this);} // tgen
}
static void Test__ZN3aaa9GG1332222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332222E, buf);
    ::aaa::GG1332222 *dp, &lv = *(dp=new (buf) ::aaa::GG1332222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332222E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1332222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1332222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1332222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332222E);
    dp->::aaa::GG1332222::~GG1332222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332222E(Test__ZN3aaa9GG1332222E, "_ZN3aaa9GG1332222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332222C1Ev();
extern void _ZN3aaa9GG1332222D1Ev();
Name_Map name_map__ZN3aaa9GG1332222E[] = {
  NSPAIR(_ZN3aaa9GG1332222C1Ev),
  NSPAIR(_ZN3aaa9GG1332222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1332222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332222E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13322223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13322223barEv,_ZThn8_N3aaa9GG13322223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13322223barEv,_ZThn20_N3aaa9GG13322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13322223barEv,_ZThn28_N3aaa9GG13322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13322223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322223barEv,_ZThn8_N3aaa9GG13322223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322223barEv,_ZThn20_N3aaa9GG13322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13322223barEv,_ZThn28_N3aaa9GG13322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332222E[];
Class_Descriptor cd__ZN3aaa9GG1332222E = {  "_ZN3aaa9GG1332222E", // class name
  bases__ZN3aaa9GG1332222E, 6,
  &(vtc__ZN3aaa9GG1332222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332223  : ::aaa::EE133 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13322233fooEv
  virtual void  bar(); // _ZN3aaa9GG13322233barEv
  ~GG1332223(); // tgen
  GG1332223(); // tgen
};
//SIG(1 _ZN3aaa9GG1332223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13322233fooEv");}
void  aaa::GG1332223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13322233barEv");}
aaa::GG1332223 ::~GG1332223(){ note_dtor("_ZN3aaa9GG1332223E", this);} // tgen
aaa::GG1332223 ::GG1332223(){ note_ctor("_ZN3aaa9GG1332223E", this);} // tgen
}
static void Test__ZN3aaa9GG1332223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332223E, buf);
    ::aaa::GG1332223 *dp, &lv = *(dp=new (buf) ::aaa::GG1332223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332223E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1332223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG1332223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG1332223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332223E);
    dp->::aaa::GG1332223::~GG1332223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332223E(Test__ZN3aaa9GG1332223E, "_ZN3aaa9GG1332223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332223C1Ev();
extern void _ZN3aaa9GG1332223D1Ev();
Name_Map name_map__ZN3aaa9GG1332223E[] = {
  NSPAIR(_ZN3aaa9GG1332223C1Ev),
  NSPAIR(_ZN3aaa9GG1332223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG1332223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332223E[];
extern void _ZN3aaa9GG13322233fooEv();
extern void _ZN3aaa9GG13322233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13322233fooEv,_ZThn8_N3aaa9GG13322233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13322233barEv,_ZThn8_N3aaa9GG13322233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13322233barEv,_ZThn20_N3aaa9GG13322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13322233barEv,_ZThn28_N3aaa9GG13322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13322233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13322233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322233fooEv,_ZThn8_N3aaa9GG13322233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322233barEv,_ZThn8_N3aaa9GG13322233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322233barEv,_ZThn20_N3aaa9GG13322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13322233barEv,_ZThn28_N3aaa9GG13322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332223E[];
Class_Descriptor cd__ZN3aaa9GG1332223E = {  "_ZN3aaa9GG1332223E", // class name
  bases__ZN3aaa9GG1332223E, 6,
  &(vtc__ZN3aaa9GG1332223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332231  : ::aaa::EE133 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13322313fooEv
  ~GG1332231(); // tgen
  GG1332231(); // tgen
};
//SIG(1 _ZN3aaa9GG1332231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13322313fooEv");}
aaa::GG1332231 ::~GG1332231(){ note_dtor("_ZN3aaa9GG1332231E", this);} // tgen
aaa::GG1332231 ::GG1332231(){ note_ctor("_ZN3aaa9GG1332231E", this);} // tgen
}
static void Test__ZN3aaa9GG1332231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332231E, buf);
    ::aaa::GG1332231 *dp, &lv = *(dp=new (buf) ::aaa::GG1332231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332231E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1332231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1332231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1332231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332231E);
    dp->::aaa::GG1332231::~GG1332231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332231E(Test__ZN3aaa9GG1332231E, "_ZN3aaa9GG1332231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332231C1Ev();
extern void _ZN3aaa9GG1332231D1Ev();
Name_Map name_map__ZN3aaa9GG1332231E[] = {
  NSPAIR(_ZN3aaa9GG1332231C1Ev),
  NSPAIR(_ZN3aaa9GG1332231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1332231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332231E[];
extern void _ZN3aaa9GG13322313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13322313fooEv,_ZThn8_N3aaa9GG13322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13322313fooEv,_ZThn20_N3aaa9GG13322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13322313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322313fooEv,_ZThn8_N3aaa9GG13322313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322313fooEv,_ZThn20_N3aaa9GG13322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332231E[];
Class_Descriptor cd__ZN3aaa9GG1332231E = {  "_ZN3aaa9GG1332231E", // class name
  bases__ZN3aaa9GG1332231E, 6,
  &(vtc__ZN3aaa9GG1332231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332232  : ::aaa::EE133 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13322323barEv
  ~GG1332232(); // tgen
  GG1332232(); // tgen
};
//SIG(1 _ZN3aaa9GG1332232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13322323barEv");}
aaa::GG1332232 ::~GG1332232(){ note_dtor("_ZN3aaa9GG1332232E", this);} // tgen
aaa::GG1332232 ::GG1332232(){ note_ctor("_ZN3aaa9GG1332232E", this);} // tgen
}
static void Test__ZN3aaa9GG1332232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332232E, buf);
    ::aaa::GG1332232 *dp, &lv = *(dp=new (buf) ::aaa::GG1332232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332232E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1332232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1332232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1332232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332232E);
    dp->::aaa::GG1332232::~GG1332232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332232E(Test__ZN3aaa9GG1332232E, "_ZN3aaa9GG1332232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332232C1Ev();
extern void _ZN3aaa9GG1332232D1Ev();
Name_Map name_map__ZN3aaa9GG1332232E[] = {
  NSPAIR(_ZN3aaa9GG1332232C1Ev),
  NSPAIR(_ZN3aaa9GG1332232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1332232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332232E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13322323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13322323barEv,_ZThn8_N3aaa9GG13322323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13322323barEv,_ZThn20_N3aaa9GG13322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13322323barEv,_ZThn28_N3aaa9GG13322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13322323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322323barEv,_ZThn8_N3aaa9GG13322323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322323barEv,_ZThn20_N3aaa9GG13322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13322323barEv,_ZThn28_N3aaa9GG13322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332232E[];
Class_Descriptor cd__ZN3aaa9GG1332232E = {  "_ZN3aaa9GG1332232E", // class name
  bases__ZN3aaa9GG1332232E, 6,
  &(vtc__ZN3aaa9GG1332232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332233  : ::aaa::EE133 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13322333fooEv
  virtual void  bar(); // _ZN3aaa9GG13322333barEv
  ~GG1332233(); // tgen
  GG1332233(); // tgen
};
//SIG(1 _ZN3aaa9GG1332233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13322333fooEv");}
void  aaa::GG1332233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13322333barEv");}
aaa::GG1332233 ::~GG1332233(){ note_dtor("_ZN3aaa9GG1332233E", this);} // tgen
aaa::GG1332233 ::GG1332233(){ note_ctor("_ZN3aaa9GG1332233E", this);} // tgen
}
static void Test__ZN3aaa9GG1332233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332233E, buf);
    ::aaa::GG1332233 *dp, &lv = *(dp=new (buf) ::aaa::GG1332233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332233E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1332233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG1332233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG1332233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332233E);
    dp->::aaa::GG1332233::~GG1332233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332233E(Test__ZN3aaa9GG1332233E, "_ZN3aaa9GG1332233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332233C1Ev();
extern void _ZN3aaa9GG1332233D1Ev();
Name_Map name_map__ZN3aaa9GG1332233E[] = {
  NSPAIR(_ZN3aaa9GG1332233C1Ev),
  NSPAIR(_ZN3aaa9GG1332233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG1332233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332233E[];
extern void _ZN3aaa9GG13322333fooEv();
extern void _ZN3aaa9GG13322333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13322333fooEv,_ZThn8_N3aaa9GG13322333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13322333barEv,_ZThn8_N3aaa9GG13322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13322333barEv,_ZThn20_N3aaa9GG13322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13322333fooEv,_ZThn20_N3aaa9GG13322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13322333barEv,_ZThn28_N3aaa9GG13322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13322333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13322333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322333fooEv,_ZThn8_N3aaa9GG13322333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13322333barEv,_ZThn8_N3aaa9GG13322333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322333barEv,_ZThn20_N3aaa9GG13322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13322333fooEv,_ZThn20_N3aaa9GG13322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13322333barEv,_ZThn28_N3aaa9GG13322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332233E[];
Class_Descriptor cd__ZN3aaa9GG1332233E = {  "_ZN3aaa9GG1332233E", // class name
  bases__ZN3aaa9GG1332233E, 6,
  &(vtc__ZN3aaa9GG1332233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332311  : ::aaa::EE133 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13323113fooEv
  ~GG1332311(); // tgen
  GG1332311(); // tgen
};
//SIG(1 _ZN3aaa9GG1332311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13323113fooEv");}
aaa::GG1332311 ::~GG1332311(){ note_dtor("_ZN3aaa9GG1332311E", this);} // tgen
aaa::GG1332311 ::GG1332311(){ note_ctor("_ZN3aaa9GG1332311E", this);} // tgen
}
static void Test__ZN3aaa9GG1332311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332311E, buf);
    ::aaa::GG1332311 *dp, &lv = *(dp=new (buf) ::aaa::GG1332311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332311E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1332311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1332311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1332311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332311E);
    dp->::aaa::GG1332311::~GG1332311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332311E(Test__ZN3aaa9GG1332311E, "_ZN3aaa9GG1332311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332311C1Ev();
extern void _ZN3aaa9GG1332311D1Ev();
Name_Map name_map__ZN3aaa9GG1332311E[] = {
  NSPAIR(_ZN3aaa9GG1332311C1Ev),
  NSPAIR(_ZN3aaa9GG1332311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1332311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332311E[];
extern void _ZN3aaa9GG13323113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13323113fooEv,_ZThn8_N3aaa9GG13323113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13323113fooEv,_ZThn20_N3aaa9GG13323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323113fooEv,_ZThn28_N3aaa9GG13323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13323113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323113fooEv,_ZThn8_N3aaa9GG13323113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323113fooEv,_ZThn20_N3aaa9GG13323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323113fooEv,_ZThn28_N3aaa9GG13323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332311E[];
Class_Descriptor cd__ZN3aaa9GG1332311E = {  "_ZN3aaa9GG1332311E", // class name
  bases__ZN3aaa9GG1332311E, 6,
  &(vtc__ZN3aaa9GG1332311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332312  : ::aaa::EE133 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13323123barEv
  ~GG1332312(); // tgen
  GG1332312(); // tgen
};
//SIG(1 _ZN3aaa9GG1332312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13323123barEv");}
aaa::GG1332312 ::~GG1332312(){ note_dtor("_ZN3aaa9GG1332312E", this);} // tgen
aaa::GG1332312 ::GG1332312(){ note_ctor("_ZN3aaa9GG1332312E", this);} // tgen
}
static void Test__ZN3aaa9GG1332312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332312E, buf);
    ::aaa::GG1332312 *dp, &lv = *(dp=new (buf) ::aaa::GG1332312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332312E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1332312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1332312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1332312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332312E);
    dp->::aaa::GG1332312::~GG1332312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332312E(Test__ZN3aaa9GG1332312E, "_ZN3aaa9GG1332312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332312C1Ev();
extern void _ZN3aaa9GG1332312D1Ev();
Name_Map name_map__ZN3aaa9GG1332312E[] = {
  NSPAIR(_ZN3aaa9GG1332312C1Ev),
  NSPAIR(_ZN3aaa9GG1332312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1332312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332312E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13323123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13323123barEv,_ZThn8_N3aaa9GG13323123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13323123barEv,_ZThn20_N3aaa9GG13323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323123barEv,_ZThn28_N3aaa9GG13323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13323123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323123barEv,_ZThn8_N3aaa9GG13323123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323123barEv,_ZThn20_N3aaa9GG13323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323123barEv,_ZThn28_N3aaa9GG13323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332312E[];
Class_Descriptor cd__ZN3aaa9GG1332312E = {  "_ZN3aaa9GG1332312E", // class name
  bases__ZN3aaa9GG1332312E, 6,
  &(vtc__ZN3aaa9GG1332312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332313  : ::aaa::EE133 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13323133fooEv
  virtual void  bar(); // _ZN3aaa9GG13323133barEv
  ~GG1332313(); // tgen
  GG1332313(); // tgen
};
//SIG(1 _ZN3aaa9GG1332313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13323133fooEv");}
void  aaa::GG1332313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13323133barEv");}
aaa::GG1332313 ::~GG1332313(){ note_dtor("_ZN3aaa9GG1332313E", this);} // tgen
aaa::GG1332313 ::GG1332313(){ note_ctor("_ZN3aaa9GG1332313E", this);} // tgen
}
static void Test__ZN3aaa9GG1332313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332313E, buf);
    ::aaa::GG1332313 *dp, &lv = *(dp=new (buf) ::aaa::GG1332313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332313E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1332313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG1332313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG1332313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332313E);
    dp->::aaa::GG1332313::~GG1332313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332313E(Test__ZN3aaa9GG1332313E, "_ZN3aaa9GG1332313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332313C1Ev();
extern void _ZN3aaa9GG1332313D1Ev();
Name_Map name_map__ZN3aaa9GG1332313E[] = {
  NSPAIR(_ZN3aaa9GG1332313C1Ev),
  NSPAIR(_ZN3aaa9GG1332313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG1332313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332313E[];
extern void _ZN3aaa9GG13323133fooEv();
extern void _ZN3aaa9GG13323133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13323133fooEv,_ZThn8_N3aaa9GG13323133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13323133barEv,_ZThn8_N3aaa9GG13323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13323133barEv,_ZThn20_N3aaa9GG13323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13323133fooEv,_ZThn20_N3aaa9GG13323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323133fooEv,_ZThn28_N3aaa9GG13323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323133barEv,_ZThn28_N3aaa9GG13323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13323133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13323133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323133fooEv,_ZThn8_N3aaa9GG13323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323133barEv,_ZThn8_N3aaa9GG13323133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323133barEv,_ZThn20_N3aaa9GG13323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323133fooEv,_ZThn20_N3aaa9GG13323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323133fooEv,_ZThn28_N3aaa9GG13323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323133barEv,_ZThn28_N3aaa9GG13323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332313E[];
Class_Descriptor cd__ZN3aaa9GG1332313E = {  "_ZN3aaa9GG1332313E", // class name
  bases__ZN3aaa9GG1332313E, 6,
  &(vtc__ZN3aaa9GG1332313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332321  : ::aaa::EE133 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13323213fooEv
  ~GG1332321(); // tgen
  GG1332321(); // tgen
};
//SIG(1 _ZN3aaa9GG1332321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13323213fooEv");}
aaa::GG1332321 ::~GG1332321(){ note_dtor("_ZN3aaa9GG1332321E", this);} // tgen
aaa::GG1332321 ::GG1332321(){ note_ctor("_ZN3aaa9GG1332321E", this);} // tgen
}
static void Test__ZN3aaa9GG1332321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332321E, buf);
    ::aaa::GG1332321 *dp, &lv = *(dp=new (buf) ::aaa::GG1332321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332321E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1332321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1332321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1332321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332321E);
    dp->::aaa::GG1332321::~GG1332321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332321E(Test__ZN3aaa9GG1332321E, "_ZN3aaa9GG1332321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332321C1Ev();
extern void _ZN3aaa9GG1332321D1Ev();
Name_Map name_map__ZN3aaa9GG1332321E[] = {
  NSPAIR(_ZN3aaa9GG1332321C1Ev),
  NSPAIR(_ZN3aaa9GG1332321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1332321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332321E[];
extern void _ZN3aaa9GG13323213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13323213fooEv,_ZThn8_N3aaa9GG13323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13323213fooEv,_ZThn28_N3aaa9GG13323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13323213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323213fooEv,_ZThn8_N3aaa9GG13323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323213fooEv,_ZThn28_N3aaa9GG13323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332321E[];
Class_Descriptor cd__ZN3aaa9GG1332321E = {  "_ZN3aaa9GG1332321E", // class name
  bases__ZN3aaa9GG1332321E, 6,
  &(vtc__ZN3aaa9GG1332321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332322  : ::aaa::EE133 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13323223barEv
  ~GG1332322(); // tgen
  GG1332322(); // tgen
};
//SIG(1 _ZN3aaa9GG1332322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13323223barEv");}
aaa::GG1332322 ::~GG1332322(){ note_dtor("_ZN3aaa9GG1332322E", this);} // tgen
aaa::GG1332322 ::GG1332322(){ note_ctor("_ZN3aaa9GG1332322E", this);} // tgen
}
static void Test__ZN3aaa9GG1332322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332322E, buf);
    ::aaa::GG1332322 *dp, &lv = *(dp=new (buf) ::aaa::GG1332322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332322E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1332322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1332322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1332322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332322E);
    dp->::aaa::GG1332322::~GG1332322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332322E(Test__ZN3aaa9GG1332322E, "_ZN3aaa9GG1332322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332322C1Ev();
extern void _ZN3aaa9GG1332322D1Ev();
Name_Map name_map__ZN3aaa9GG1332322E[] = {
  NSPAIR(_ZN3aaa9GG1332322C1Ev),
  NSPAIR(_ZN3aaa9GG1332322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1332322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332322E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13323223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13323223barEv,_ZThn8_N3aaa9GG13323223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13323223barEv,_ZThn20_N3aaa9GG13323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13323223barEv,_ZThn28_N3aaa9GG13323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13323223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323223barEv,_ZThn8_N3aaa9GG13323223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323223barEv,_ZThn20_N3aaa9GG13323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323223barEv,_ZThn28_N3aaa9GG13323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332322E[];
Class_Descriptor cd__ZN3aaa9GG1332322E = {  "_ZN3aaa9GG1332322E", // class name
  bases__ZN3aaa9GG1332322E, 6,
  &(vtc__ZN3aaa9GG1332322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332323  : ::aaa::EE133 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13323233fooEv
  virtual void  bar(); // _ZN3aaa9GG13323233barEv
  ~GG1332323(); // tgen
  GG1332323(); // tgen
};
//SIG(1 _ZN3aaa9GG1332323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13323233fooEv");}
void  aaa::GG1332323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13323233barEv");}
aaa::GG1332323 ::~GG1332323(){ note_dtor("_ZN3aaa9GG1332323E", this);} // tgen
aaa::GG1332323 ::GG1332323(){ note_ctor("_ZN3aaa9GG1332323E", this);} // tgen
}
static void Test__ZN3aaa9GG1332323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332323E, buf);
    ::aaa::GG1332323 *dp, &lv = *(dp=new (buf) ::aaa::GG1332323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332323E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1332323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG1332323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG1332323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332323E);
    dp->::aaa::GG1332323::~GG1332323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332323E(Test__ZN3aaa9GG1332323E, "_ZN3aaa9GG1332323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332323C1Ev();
extern void _ZN3aaa9GG1332323D1Ev();
Name_Map name_map__ZN3aaa9GG1332323E[] = {
  NSPAIR(_ZN3aaa9GG1332323C1Ev),
  NSPAIR(_ZN3aaa9GG1332323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG1332323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332323E[];
extern void _ZN3aaa9GG13323233fooEv();
extern void _ZN3aaa9GG13323233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13323233fooEv,_ZThn8_N3aaa9GG13323233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13323233barEv,_ZThn8_N3aaa9GG13323233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13323233barEv,_ZThn20_N3aaa9GG13323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323233fooEv,_ZThn28_N3aaa9GG13323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323233barEv,_ZThn28_N3aaa9GG13323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13323233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13323233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323233fooEv,_ZThn8_N3aaa9GG13323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323233barEv,_ZThn8_N3aaa9GG13323233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323233barEv,_ZThn20_N3aaa9GG13323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323233fooEv,_ZThn28_N3aaa9GG13323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323233barEv,_ZThn28_N3aaa9GG13323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332323E[];
Class_Descriptor cd__ZN3aaa9GG1332323E = {  "_ZN3aaa9GG1332323E", // class name
  bases__ZN3aaa9GG1332323E, 6,
  &(vtc__ZN3aaa9GG1332323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332331  : ::aaa::EE133 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13323313fooEv
  ~GG1332331(); // tgen
  GG1332331(); // tgen
};
//SIG(1 _ZN3aaa9GG1332331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13323313fooEv");}
aaa::GG1332331 ::~GG1332331(){ note_dtor("_ZN3aaa9GG1332331E", this);} // tgen
aaa::GG1332331 ::GG1332331(){ note_ctor("_ZN3aaa9GG1332331E", this);} // tgen
}
static void Test__ZN3aaa9GG1332331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332331E, buf);
    ::aaa::GG1332331 *dp, &lv = *(dp=new (buf) ::aaa::GG1332331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332331E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1332331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1332331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1332331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332331E);
    dp->::aaa::GG1332331::~GG1332331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332331E(Test__ZN3aaa9GG1332331E, "_ZN3aaa9GG1332331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332331C1Ev();
extern void _ZN3aaa9GG1332331D1Ev();
Name_Map name_map__ZN3aaa9GG1332331E[] = {
  NSPAIR(_ZN3aaa9GG1332331C1Ev),
  NSPAIR(_ZN3aaa9GG1332331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1332331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332331E[];
extern void _ZN3aaa9GG13323313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13323313fooEv,_ZThn8_N3aaa9GG13323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13323313fooEv,_ZThn20_N3aaa9GG13323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323313fooEv,_ZThn28_N3aaa9GG13323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13323313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323313fooEv,_ZThn8_N3aaa9GG13323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323313fooEv,_ZThn20_N3aaa9GG13323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323313fooEv,_ZThn28_N3aaa9GG13323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332331E[];
Class_Descriptor cd__ZN3aaa9GG1332331E = {  "_ZN3aaa9GG1332331E", // class name
  bases__ZN3aaa9GG1332331E, 6,
  &(vtc__ZN3aaa9GG1332331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332332  : ::aaa::EE133 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13323323barEv
  ~GG1332332(); // tgen
  GG1332332(); // tgen
};
//SIG(1 _ZN3aaa9GG1332332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1332332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13323323barEv");}
aaa::GG1332332 ::~GG1332332(){ note_dtor("_ZN3aaa9GG1332332E", this);} // tgen
aaa::GG1332332 ::GG1332332(){ note_ctor("_ZN3aaa9GG1332332E", this);} // tgen
}
static void Test__ZN3aaa9GG1332332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332332E, buf);
    ::aaa::GG1332332 *dp, &lv = *(dp=new (buf) ::aaa::GG1332332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332332E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1332332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1332332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1332332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332332E);
    dp->::aaa::GG1332332::~GG1332332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332332E(Test__ZN3aaa9GG1332332E, "_ZN3aaa9GG1332332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332332C1Ev();
extern void _ZN3aaa9GG1332332D1Ev();
Name_Map name_map__ZN3aaa9GG1332332E[] = {
  NSPAIR(_ZN3aaa9GG1332332C1Ev),
  NSPAIR(_ZN3aaa9GG1332332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1332332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332332E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13323323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13323323barEv,_ZThn8_N3aaa9GG13323323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13323323barEv,_ZThn20_N3aaa9GG13323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323323barEv,_ZThn28_N3aaa9GG13323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13323323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323323barEv,_ZThn8_N3aaa9GG13323323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323323barEv,_ZThn20_N3aaa9GG13323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323323barEv,_ZThn28_N3aaa9GG13323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332332E[];
Class_Descriptor cd__ZN3aaa9GG1332332E = {  "_ZN3aaa9GG1332332E", // class name
  bases__ZN3aaa9GG1332332E, 6,
  &(vtc__ZN3aaa9GG1332332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1332333  : ::aaa::EE133 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13323333fooEv
  virtual void  bar(); // _ZN3aaa9GG13323333barEv
  ~GG1332333(); // tgen
  GG1332333(); // tgen
};
//SIG(1 _ZN3aaa9GG1332333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1332333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13323333fooEv");}
void  aaa::GG1332333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13323333barEv");}
aaa::GG1332333 ::~GG1332333(){ note_dtor("_ZN3aaa9GG1332333E", this);} // tgen
aaa::GG1332333 ::GG1332333(){ note_ctor("_ZN3aaa9GG1332333E", this);} // tgen
}
static void Test__ZN3aaa9GG1332333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1332333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1332333E, buf);
    ::aaa::GG1332333 *dp, &lv = *(dp=new (buf) ::aaa::GG1332333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1332333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1332333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1332333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1332333E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1332333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1332333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG1332333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG1332333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1332333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1332333E);
    dp->::aaa::GG1332333::~GG1332333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1332333E(Test__ZN3aaa9GG1332333E, "_ZN3aaa9GG1332333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1332333C1Ev();
extern void _ZN3aaa9GG1332333D1Ev();
Name_Map name_map__ZN3aaa9GG1332333E[] = {
  NSPAIR(_ZN3aaa9GG1332333C1Ev),
  NSPAIR(_ZN3aaa9GG1332333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG1332333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1332333E[];
extern void _ZN3aaa9GG13323333fooEv();
extern void _ZN3aaa9GG13323333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13323333fooEv,_ZThn8_N3aaa9GG13323333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13323333barEv,_ZThn8_N3aaa9GG13323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13323333barEv,_ZThn20_N3aaa9GG13323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13323333fooEv,_ZThn20_N3aaa9GG13323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323333fooEv,_ZThn28_N3aaa9GG13323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13323333barEv,_ZThn28_N3aaa9GG13323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1332333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13323333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13323333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323333fooEv,_ZThn8_N3aaa9GG13323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13323333barEv,_ZThn8_N3aaa9GG13323333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323333barEv,_ZThn20_N3aaa9GG13323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13323333fooEv,_ZThn20_N3aaa9GG13323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323333fooEv,_ZThn28_N3aaa9GG13323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13323333barEv,_ZThn28_N3aaa9GG13323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1332333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1332333E[];
Class_Descriptor cd__ZN3aaa9GG1332333E = {  "_ZN3aaa9GG1332333E", // class name
  bases__ZN3aaa9GG1332333E, 6,
  &(vtc__ZN3aaa9GG1332333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1332333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1332333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333111  : ::aaa::EE133 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13331113fooEv
  ~GG1333111(); // tgen
  GG1333111(); // tgen
};
//SIG(1 _ZN3aaa9GG1333111E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333111 ::foo(){vfunc_called(this, "_ZN3aaa9GG13331113fooEv");}
aaa::GG1333111 ::~GG1333111(){ note_dtor("_ZN3aaa9GG1333111E", this);} // tgen
aaa::GG1333111 ::GG1333111(){ note_ctor("_ZN3aaa9GG1333111E", this);} // tgen
}
static void Test__ZN3aaa9GG1333111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333111E, buf);
    ::aaa::GG1333111 *dp, &lv = *(dp=new (buf) ::aaa::GG1333111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333111E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333111E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1333111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1333111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1333111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333111E);
    dp->::aaa::GG1333111::~GG1333111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333111E(Test__ZN3aaa9GG1333111E, "_ZN3aaa9GG1333111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333111C1Ev();
extern void _ZN3aaa9GG1333111D1Ev();
Name_Map name_map__ZN3aaa9GG1333111E[] = {
  NSPAIR(_ZN3aaa9GG1333111C1Ev),
  NSPAIR(_ZN3aaa9GG1333111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1333111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333111E[];
extern void _ZN3aaa9GG13331113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13331113fooEv,_ZThn8_N3aaa9GG13331113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331113fooEv,_ZThn20_N3aaa9GG13331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13331113fooEv,_ZThn28_N3aaa9GG13331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13331113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331113fooEv,_ZThn8_N3aaa9GG13331113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331113fooEv,_ZThn20_N3aaa9GG13331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13331113fooEv,_ZThn28_N3aaa9GG13331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333111E[];
Class_Descriptor cd__ZN3aaa9GG1333111E = {  "_ZN3aaa9GG1333111E", // class name
  bases__ZN3aaa9GG1333111E, 6,
  &(vtc__ZN3aaa9GG1333111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333112  : ::aaa::EE133 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13331123barEv
  ~GG1333112(); // tgen
  GG1333112(); // tgen
};
//SIG(1 _ZN3aaa9GG1333112E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333112 ::bar(){vfunc_called(this, "_ZN3aaa9GG13331123barEv");}
aaa::GG1333112 ::~GG1333112(){ note_dtor("_ZN3aaa9GG1333112E", this);} // tgen
aaa::GG1333112 ::GG1333112(){ note_ctor("_ZN3aaa9GG1333112E", this);} // tgen
}
static void Test__ZN3aaa9GG1333112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333112E, buf);
    ::aaa::GG1333112 *dp, &lv = *(dp=new (buf) ::aaa::GG1333112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333112E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333112E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1333112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1333112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1333112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333112E);
    dp->::aaa::GG1333112::~GG1333112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333112E(Test__ZN3aaa9GG1333112E, "_ZN3aaa9GG1333112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333112C1Ev();
extern void _ZN3aaa9GG1333112D1Ev();
Name_Map name_map__ZN3aaa9GG1333112E[] = {
  NSPAIR(_ZN3aaa9GG1333112C1Ev),
  NSPAIR(_ZN3aaa9GG1333112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1333112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333112E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13331123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13331123barEv,_ZThn8_N3aaa9GG13331123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13331123barEv,_ZThn20_N3aaa9GG13331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13331123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331123barEv,_ZThn8_N3aaa9GG13331123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331123barEv,_ZThn20_N3aaa9GG13331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333112E[];
Class_Descriptor cd__ZN3aaa9GG1333112E = {  "_ZN3aaa9GG1333112E", // class name
  bases__ZN3aaa9GG1333112E, 6,
  &(vtc__ZN3aaa9GG1333112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333113  : ::aaa::EE133 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13331133fooEv
  virtual void  bar(); // _ZN3aaa9GG13331133barEv
  ~GG1333113(); // tgen
  GG1333113(); // tgen
};
//SIG(1 _ZN3aaa9GG1333113E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333113 ::foo(){vfunc_called(this, "_ZN3aaa9GG13331133fooEv");}
void  aaa::GG1333113 ::bar(){vfunc_called(this, "_ZN3aaa9GG13331133barEv");}
aaa::GG1333113 ::~GG1333113(){ note_dtor("_ZN3aaa9GG1333113E", this);} // tgen
aaa::GG1333113 ::GG1333113(){ note_ctor("_ZN3aaa9GG1333113E", this);} // tgen
}
static void Test__ZN3aaa9GG1333113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333113E, buf);
    ::aaa::GG1333113 *dp, &lv = *(dp=new (buf) ::aaa::GG1333113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333113E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333113E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1333113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG1333113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG1333113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333113E);
    dp->::aaa::GG1333113::~GG1333113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333113E(Test__ZN3aaa9GG1333113E, "_ZN3aaa9GG1333113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333113C1Ev();
extern void _ZN3aaa9GG1333113D1Ev();
Name_Map name_map__ZN3aaa9GG1333113E[] = {
  NSPAIR(_ZN3aaa9GG1333113C1Ev),
  NSPAIR(_ZN3aaa9GG1333113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG1333113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333113E[];
extern void _ZN3aaa9GG13331133fooEv();
extern void _ZN3aaa9GG13331133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13331133fooEv,_ZThn8_N3aaa9GG13331133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13331133barEv,_ZThn8_N3aaa9GG13331133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331133fooEv,_ZThn20_N3aaa9GG13331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331133barEv,_ZThn20_N3aaa9GG13331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13331133fooEv,_ZThn28_N3aaa9GG13331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13331133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13331133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331133fooEv,_ZThn8_N3aaa9GG13331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331133barEv,_ZThn8_N3aaa9GG13331133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331133fooEv,_ZThn20_N3aaa9GG13331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331133barEv,_ZThn20_N3aaa9GG13331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13331133fooEv,_ZThn28_N3aaa9GG13331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333113E[];
Class_Descriptor cd__ZN3aaa9GG1333113E = {  "_ZN3aaa9GG1333113E", // class name
  bases__ZN3aaa9GG1333113E, 6,
  &(vtc__ZN3aaa9GG1333113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333121  : ::aaa::EE133 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13331213fooEv
  ~GG1333121(); // tgen
  GG1333121(); // tgen
};
//SIG(1 _ZN3aaa9GG1333121E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333121 ::foo(){vfunc_called(this, "_ZN3aaa9GG13331213fooEv");}
aaa::GG1333121 ::~GG1333121(){ note_dtor("_ZN3aaa9GG1333121E", this);} // tgen
aaa::GG1333121 ::GG1333121(){ note_ctor("_ZN3aaa9GG1333121E", this);} // tgen
}
static void Test__ZN3aaa9GG1333121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333121E, buf);
    ::aaa::GG1333121 *dp, &lv = *(dp=new (buf) ::aaa::GG1333121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333121E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333121E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1333121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1333121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1333121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333121E);
    dp->::aaa::GG1333121::~GG1333121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333121E(Test__ZN3aaa9GG1333121E, "_ZN3aaa9GG1333121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333121C1Ev();
extern void _ZN3aaa9GG1333121D1Ev();
Name_Map name_map__ZN3aaa9GG1333121E[] = {
  NSPAIR(_ZN3aaa9GG1333121C1Ev),
  NSPAIR(_ZN3aaa9GG1333121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1333121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333121E[];
extern void _ZN3aaa9GG13331213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13331213fooEv,_ZThn8_N3aaa9GG13331213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331213fooEv,_ZThn20_N3aaa9GG13331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13331213fooEv,_ZThn28_N3aaa9GG13331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13331213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331213fooEv,_ZThn8_N3aaa9GG13331213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331213fooEv,_ZThn20_N3aaa9GG13331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13331213fooEv,_ZThn28_N3aaa9GG13331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333121E[];
Class_Descriptor cd__ZN3aaa9GG1333121E = {  "_ZN3aaa9GG1333121E", // class name
  bases__ZN3aaa9GG1333121E, 6,
  &(vtc__ZN3aaa9GG1333121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333122  : ::aaa::EE133 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13331223barEv
  ~GG1333122(); // tgen
  GG1333122(); // tgen
};
//SIG(1 _ZN3aaa9GG1333122E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333122 ::bar(){vfunc_called(this, "_ZN3aaa9GG13331223barEv");}
aaa::GG1333122 ::~GG1333122(){ note_dtor("_ZN3aaa9GG1333122E", this);} // tgen
aaa::GG1333122 ::GG1333122(){ note_ctor("_ZN3aaa9GG1333122E", this);} // tgen
}
static void Test__ZN3aaa9GG1333122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333122E, buf);
    ::aaa::GG1333122 *dp, &lv = *(dp=new (buf) ::aaa::GG1333122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333122E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333122E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1333122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1333122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1333122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333122E);
    dp->::aaa::GG1333122::~GG1333122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333122E(Test__ZN3aaa9GG1333122E, "_ZN3aaa9GG1333122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333122C1Ev();
extern void _ZN3aaa9GG1333122D1Ev();
Name_Map name_map__ZN3aaa9GG1333122E[] = {
  NSPAIR(_ZN3aaa9GG1333122C1Ev),
  NSPAIR(_ZN3aaa9GG1333122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1333122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333122E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13331223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13331223barEv,_ZThn8_N3aaa9GG13331223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13331223barEv,_ZThn20_N3aaa9GG13331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13331223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331223barEv,_ZThn8_N3aaa9GG13331223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331223barEv,_ZThn20_N3aaa9GG13331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333122E[];
Class_Descriptor cd__ZN3aaa9GG1333122E = {  "_ZN3aaa9GG1333122E", // class name
  bases__ZN3aaa9GG1333122E, 6,
  &(vtc__ZN3aaa9GG1333122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333123  : ::aaa::EE133 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13331233fooEv
  virtual void  bar(); // _ZN3aaa9GG13331233barEv
  ~GG1333123(); // tgen
  GG1333123(); // tgen
};
//SIG(1 _ZN3aaa9GG1333123E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333123 ::foo(){vfunc_called(this, "_ZN3aaa9GG13331233fooEv");}
void  aaa::GG1333123 ::bar(){vfunc_called(this, "_ZN3aaa9GG13331233barEv");}
aaa::GG1333123 ::~GG1333123(){ note_dtor("_ZN3aaa9GG1333123E", this);} // tgen
aaa::GG1333123 ::GG1333123(){ note_ctor("_ZN3aaa9GG1333123E", this);} // tgen
}
static void Test__ZN3aaa9GG1333123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333123E, buf);
    ::aaa::GG1333123 *dp, &lv = *(dp=new (buf) ::aaa::GG1333123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333123E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333123E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1333123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG1333123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG1333123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333123E);
    dp->::aaa::GG1333123::~GG1333123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333123E(Test__ZN3aaa9GG1333123E, "_ZN3aaa9GG1333123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333123C1Ev();
extern void _ZN3aaa9GG1333123D1Ev();
Name_Map name_map__ZN3aaa9GG1333123E[] = {
  NSPAIR(_ZN3aaa9GG1333123C1Ev),
  NSPAIR(_ZN3aaa9GG1333123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG1333123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333123E[];
extern void _ZN3aaa9GG13331233fooEv();
extern void _ZN3aaa9GG13331233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13331233fooEv,_ZThn8_N3aaa9GG13331233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13331233barEv,_ZThn8_N3aaa9GG13331233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331233fooEv,_ZThn20_N3aaa9GG13331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331233barEv,_ZThn20_N3aaa9GG13331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13331233fooEv,_ZThn28_N3aaa9GG13331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13331233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13331233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331233fooEv,_ZThn8_N3aaa9GG13331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331233barEv,_ZThn8_N3aaa9GG13331233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331233fooEv,_ZThn20_N3aaa9GG13331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331233barEv,_ZThn20_N3aaa9GG13331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13331233fooEv,_ZThn28_N3aaa9GG13331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333123E[];
Class_Descriptor cd__ZN3aaa9GG1333123E = {  "_ZN3aaa9GG1333123E", // class name
  bases__ZN3aaa9GG1333123E, 6,
  &(vtc__ZN3aaa9GG1333123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333131  : ::aaa::EE133 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13331313fooEv
  ~GG1333131(); // tgen
  GG1333131(); // tgen
};
//SIG(1 _ZN3aaa9GG1333131E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333131 ::foo(){vfunc_called(this, "_ZN3aaa9GG13331313fooEv");}
aaa::GG1333131 ::~GG1333131(){ note_dtor("_ZN3aaa9GG1333131E", this);} // tgen
aaa::GG1333131 ::GG1333131(){ note_ctor("_ZN3aaa9GG1333131E", this);} // tgen
}
static void Test__ZN3aaa9GG1333131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333131E, buf);
    ::aaa::GG1333131 *dp, &lv = *(dp=new (buf) ::aaa::GG1333131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333131E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333131E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1333131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1333131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1333131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333131E);
    dp->::aaa::GG1333131::~GG1333131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333131E(Test__ZN3aaa9GG1333131E, "_ZN3aaa9GG1333131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333131C1Ev();
extern void _ZN3aaa9GG1333131D1Ev();
Name_Map name_map__ZN3aaa9GG1333131E[] = {
  NSPAIR(_ZN3aaa9GG1333131C1Ev),
  NSPAIR(_ZN3aaa9GG1333131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1333131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333131E[];
extern void _ZN3aaa9GG13331313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13331313fooEv,_ZThn8_N3aaa9GG13331313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331313fooEv,_ZThn20_N3aaa9GG13331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13331313fooEv,_ZThn28_N3aaa9GG13331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13331313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331313fooEv,_ZThn8_N3aaa9GG13331313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331313fooEv,_ZThn20_N3aaa9GG13331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13331313fooEv,_ZThn28_N3aaa9GG13331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333131E[];
Class_Descriptor cd__ZN3aaa9GG1333131E = {  "_ZN3aaa9GG1333131E", // class name
  bases__ZN3aaa9GG1333131E, 6,
  &(vtc__ZN3aaa9GG1333131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333132  : ::aaa::EE133 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13331323barEv
  ~GG1333132(); // tgen
  GG1333132(); // tgen
};
//SIG(1 _ZN3aaa9GG1333132E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333132 ::bar(){vfunc_called(this, "_ZN3aaa9GG13331323barEv");}
aaa::GG1333132 ::~GG1333132(){ note_dtor("_ZN3aaa9GG1333132E", this);} // tgen
aaa::GG1333132 ::GG1333132(){ note_ctor("_ZN3aaa9GG1333132E", this);} // tgen
}
static void Test__ZN3aaa9GG1333132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333132E, buf);
    ::aaa::GG1333132 *dp, &lv = *(dp=new (buf) ::aaa::GG1333132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333132E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333132E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1333132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1333132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1333132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333132E);
    dp->::aaa::GG1333132::~GG1333132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333132E(Test__ZN3aaa9GG1333132E, "_ZN3aaa9GG1333132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333132C1Ev();
extern void _ZN3aaa9GG1333132D1Ev();
Name_Map name_map__ZN3aaa9GG1333132E[] = {
  NSPAIR(_ZN3aaa9GG1333132C1Ev),
  NSPAIR(_ZN3aaa9GG1333132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1333132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333132E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13331323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13331323barEv,_ZThn8_N3aaa9GG13331323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13331323barEv,_ZThn20_N3aaa9GG13331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13331323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331323barEv,_ZThn8_N3aaa9GG13331323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331323barEv,_ZThn20_N3aaa9GG13331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333132E[];
Class_Descriptor cd__ZN3aaa9GG1333132E = {  "_ZN3aaa9GG1333132E", // class name
  bases__ZN3aaa9GG1333132E, 6,
  &(vtc__ZN3aaa9GG1333132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333133  : ::aaa::EE133 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13331333fooEv
  virtual void  bar(); // _ZN3aaa9GG13331333barEv
  ~GG1333133(); // tgen
  GG1333133(); // tgen
};
//SIG(1 _ZN3aaa9GG1333133E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333133 ::foo(){vfunc_called(this, "_ZN3aaa9GG13331333fooEv");}
void  aaa::GG1333133 ::bar(){vfunc_called(this, "_ZN3aaa9GG13331333barEv");}
aaa::GG1333133 ::~GG1333133(){ note_dtor("_ZN3aaa9GG1333133E", this);} // tgen
aaa::GG1333133 ::GG1333133(){ note_ctor("_ZN3aaa9GG1333133E", this);} // tgen
}
static void Test__ZN3aaa9GG1333133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333133E, buf);
    ::aaa::GG1333133 *dp, &lv = *(dp=new (buf) ::aaa::GG1333133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333133E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333133E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1333133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG1333133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG1333133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333133E);
    dp->::aaa::GG1333133::~GG1333133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333133E(Test__ZN3aaa9GG1333133E, "_ZN3aaa9GG1333133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333133C1Ev();
extern void _ZN3aaa9GG1333133D1Ev();
Name_Map name_map__ZN3aaa9GG1333133E[] = {
  NSPAIR(_ZN3aaa9GG1333133C1Ev),
  NSPAIR(_ZN3aaa9GG1333133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG1333133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333133E[];
extern void _ZN3aaa9GG13331333fooEv();
extern void _ZN3aaa9GG13331333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13331333fooEv,_ZThn8_N3aaa9GG13331333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13331333barEv,_ZThn8_N3aaa9GG13331333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331333fooEv,_ZThn20_N3aaa9GG13331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13331333barEv,_ZThn20_N3aaa9GG13331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13331333fooEv,_ZThn28_N3aaa9GG13331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13331333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13331333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331333fooEv,_ZThn8_N3aaa9GG13331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13331333barEv,_ZThn8_N3aaa9GG13331333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331333fooEv,_ZThn20_N3aaa9GG13331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13331333barEv,_ZThn20_N3aaa9GG13331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13331333fooEv,_ZThn28_N3aaa9GG13331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333133E[];
Class_Descriptor cd__ZN3aaa9GG1333133E = {  "_ZN3aaa9GG1333133E", // class name
  bases__ZN3aaa9GG1333133E, 6,
  &(vtc__ZN3aaa9GG1333133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333211  : ::aaa::EE133 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13332113fooEv
  ~GG1333211(); // tgen
  GG1333211(); // tgen
};
//SIG(1 _ZN3aaa9GG1333211E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333211 ::foo(){vfunc_called(this, "_ZN3aaa9GG13332113fooEv");}
aaa::GG1333211 ::~GG1333211(){ note_dtor("_ZN3aaa9GG1333211E", this);} // tgen
aaa::GG1333211 ::GG1333211(){ note_ctor("_ZN3aaa9GG1333211E", this);} // tgen
}
static void Test__ZN3aaa9GG1333211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333211E, buf);
    ::aaa::GG1333211 *dp, &lv = *(dp=new (buf) ::aaa::GG1333211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333211E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333211E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1333211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1333211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1333211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333211E);
    dp->::aaa::GG1333211::~GG1333211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333211E(Test__ZN3aaa9GG1333211E, "_ZN3aaa9GG1333211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333211C1Ev();
extern void _ZN3aaa9GG1333211D1Ev();
Name_Map name_map__ZN3aaa9GG1333211E[] = {
  NSPAIR(_ZN3aaa9GG1333211C1Ev),
  NSPAIR(_ZN3aaa9GG1333211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1333211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333211E[];
extern void _ZN3aaa9GG13332113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13332113fooEv,_ZThn8_N3aaa9GG13332113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332113fooEv,_ZThn20_N3aaa9GG13332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13332113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332113fooEv,_ZThn8_N3aaa9GG13332113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332113fooEv,_ZThn20_N3aaa9GG13332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333211E[];
Class_Descriptor cd__ZN3aaa9GG1333211E = {  "_ZN3aaa9GG1333211E", // class name
  bases__ZN3aaa9GG1333211E, 6,
  &(vtc__ZN3aaa9GG1333211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333212  : ::aaa::EE133 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13332123barEv
  ~GG1333212(); // tgen
  GG1333212(); // tgen
};
//SIG(1 _ZN3aaa9GG1333212E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333212 ::bar(){vfunc_called(this, "_ZN3aaa9GG13332123barEv");}
aaa::GG1333212 ::~GG1333212(){ note_dtor("_ZN3aaa9GG1333212E", this);} // tgen
aaa::GG1333212 ::GG1333212(){ note_ctor("_ZN3aaa9GG1333212E", this);} // tgen
}
static void Test__ZN3aaa9GG1333212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333212E, buf);
    ::aaa::GG1333212 *dp, &lv = *(dp=new (buf) ::aaa::GG1333212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333212E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333212E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1333212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1333212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1333212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333212E);
    dp->::aaa::GG1333212::~GG1333212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333212E(Test__ZN3aaa9GG1333212E, "_ZN3aaa9GG1333212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333212C1Ev();
extern void _ZN3aaa9GG1333212D1Ev();
Name_Map name_map__ZN3aaa9GG1333212E[] = {
  NSPAIR(_ZN3aaa9GG1333212C1Ev),
  NSPAIR(_ZN3aaa9GG1333212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1333212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333212E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13332123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13332123barEv,_ZThn8_N3aaa9GG13332123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13332123barEv,_ZThn20_N3aaa9GG13332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13332123barEv,_ZThn28_N3aaa9GG13332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13332123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332123barEv,_ZThn8_N3aaa9GG13332123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332123barEv,_ZThn20_N3aaa9GG13332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13332123barEv,_ZThn28_N3aaa9GG13332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333212E[];
Class_Descriptor cd__ZN3aaa9GG1333212E = {  "_ZN3aaa9GG1333212E", // class name
  bases__ZN3aaa9GG1333212E, 6,
  &(vtc__ZN3aaa9GG1333212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333213  : ::aaa::EE133 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13332133fooEv
  virtual void  bar(); // _ZN3aaa9GG13332133barEv
  ~GG1333213(); // tgen
  GG1333213(); // tgen
};
//SIG(1 _ZN3aaa9GG1333213E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333213 ::foo(){vfunc_called(this, "_ZN3aaa9GG13332133fooEv");}
void  aaa::GG1333213 ::bar(){vfunc_called(this, "_ZN3aaa9GG13332133barEv");}
aaa::GG1333213 ::~GG1333213(){ note_dtor("_ZN3aaa9GG1333213E", this);} // tgen
aaa::GG1333213 ::GG1333213(){ note_ctor("_ZN3aaa9GG1333213E", this);} // tgen
}
static void Test__ZN3aaa9GG1333213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333213E, buf);
    ::aaa::GG1333213 *dp, &lv = *(dp=new (buf) ::aaa::GG1333213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333213E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333213E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1333213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG1333213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG1333213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333213E);
    dp->::aaa::GG1333213::~GG1333213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333213E(Test__ZN3aaa9GG1333213E, "_ZN3aaa9GG1333213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333213C1Ev();
extern void _ZN3aaa9GG1333213D1Ev();
Name_Map name_map__ZN3aaa9GG1333213E[] = {
  NSPAIR(_ZN3aaa9GG1333213C1Ev),
  NSPAIR(_ZN3aaa9GG1333213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG1333213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333213E[];
extern void _ZN3aaa9GG13332133fooEv();
extern void _ZN3aaa9GG13332133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13332133fooEv,_ZThn8_N3aaa9GG13332133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13332133barEv,_ZThn8_N3aaa9GG13332133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332133fooEv,_ZThn20_N3aaa9GG13332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332133barEv,_ZThn20_N3aaa9GG13332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13332133barEv,_ZThn28_N3aaa9GG13332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13332133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13332133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332133fooEv,_ZThn8_N3aaa9GG13332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332133barEv,_ZThn8_N3aaa9GG13332133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332133fooEv,_ZThn20_N3aaa9GG13332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332133barEv,_ZThn20_N3aaa9GG13332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13332133barEv,_ZThn28_N3aaa9GG13332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333213E[];
Class_Descriptor cd__ZN3aaa9GG1333213E = {  "_ZN3aaa9GG1333213E", // class name
  bases__ZN3aaa9GG1333213E, 6,
  &(vtc__ZN3aaa9GG1333213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333221  : ::aaa::EE133 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13332213fooEv
  ~GG1333221(); // tgen
  GG1333221(); // tgen
};
//SIG(1 _ZN3aaa9GG1333221E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333221 ::foo(){vfunc_called(this, "_ZN3aaa9GG13332213fooEv");}
aaa::GG1333221 ::~GG1333221(){ note_dtor("_ZN3aaa9GG1333221E", this);} // tgen
aaa::GG1333221 ::GG1333221(){ note_ctor("_ZN3aaa9GG1333221E", this);} // tgen
}
static void Test__ZN3aaa9GG1333221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333221E, buf);
    ::aaa::GG1333221 *dp, &lv = *(dp=new (buf) ::aaa::GG1333221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333221E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333221E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1333221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1333221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1333221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333221E);
    dp->::aaa::GG1333221::~GG1333221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333221E(Test__ZN3aaa9GG1333221E, "_ZN3aaa9GG1333221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333221C1Ev();
extern void _ZN3aaa9GG1333221D1Ev();
Name_Map name_map__ZN3aaa9GG1333221E[] = {
  NSPAIR(_ZN3aaa9GG1333221C1Ev),
  NSPAIR(_ZN3aaa9GG1333221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1333221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333221E[];
extern void _ZN3aaa9GG13332213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13332213fooEv,_ZThn8_N3aaa9GG13332213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332213fooEv,_ZThn20_N3aaa9GG13332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13332213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332213fooEv,_ZThn8_N3aaa9GG13332213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332213fooEv,_ZThn20_N3aaa9GG13332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333221E[];
Class_Descriptor cd__ZN3aaa9GG1333221E = {  "_ZN3aaa9GG1333221E", // class name
  bases__ZN3aaa9GG1333221E, 6,
  &(vtc__ZN3aaa9GG1333221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333222  : ::aaa::EE133 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13332223barEv
  ~GG1333222(); // tgen
  GG1333222(); // tgen
};
//SIG(1 _ZN3aaa9GG1333222E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333222 ::bar(){vfunc_called(this, "_ZN3aaa9GG13332223barEv");}
aaa::GG1333222 ::~GG1333222(){ note_dtor("_ZN3aaa9GG1333222E", this);} // tgen
aaa::GG1333222 ::GG1333222(){ note_ctor("_ZN3aaa9GG1333222E", this);} // tgen
}
static void Test__ZN3aaa9GG1333222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333222E, buf);
    ::aaa::GG1333222 *dp, &lv = *(dp=new (buf) ::aaa::GG1333222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333222E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333222E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1333222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1333222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1333222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333222E);
    dp->::aaa::GG1333222::~GG1333222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333222E(Test__ZN3aaa9GG1333222E, "_ZN3aaa9GG1333222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333222C1Ev();
extern void _ZN3aaa9GG1333222D1Ev();
Name_Map name_map__ZN3aaa9GG1333222E[] = {
  NSPAIR(_ZN3aaa9GG1333222C1Ev),
  NSPAIR(_ZN3aaa9GG1333222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1333222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333222E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13332223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13332223barEv,_ZThn8_N3aaa9GG13332223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13332223barEv,_ZThn20_N3aaa9GG13332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13332223barEv,_ZThn28_N3aaa9GG13332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13332223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332223barEv,_ZThn8_N3aaa9GG13332223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332223barEv,_ZThn20_N3aaa9GG13332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13332223barEv,_ZThn28_N3aaa9GG13332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333222E[];
Class_Descriptor cd__ZN3aaa9GG1333222E = {  "_ZN3aaa9GG1333222E", // class name
  bases__ZN3aaa9GG1333222E, 6,
  &(vtc__ZN3aaa9GG1333222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333223  : ::aaa::EE133 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13332233fooEv
  virtual void  bar(); // _ZN3aaa9GG13332233barEv
  ~GG1333223(); // tgen
  GG1333223(); // tgen
};
//SIG(1 _ZN3aaa9GG1333223E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333223 ::foo(){vfunc_called(this, "_ZN3aaa9GG13332233fooEv");}
void  aaa::GG1333223 ::bar(){vfunc_called(this, "_ZN3aaa9GG13332233barEv");}
aaa::GG1333223 ::~GG1333223(){ note_dtor("_ZN3aaa9GG1333223E", this);} // tgen
aaa::GG1333223 ::GG1333223(){ note_ctor("_ZN3aaa9GG1333223E", this);} // tgen
}
static void Test__ZN3aaa9GG1333223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333223E, buf);
    ::aaa::GG1333223 *dp, &lv = *(dp=new (buf) ::aaa::GG1333223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333223E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333223E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1333223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG1333223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG1333223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333223E);
    dp->::aaa::GG1333223::~GG1333223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333223E(Test__ZN3aaa9GG1333223E, "_ZN3aaa9GG1333223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333223C1Ev();
extern void _ZN3aaa9GG1333223D1Ev();
Name_Map name_map__ZN3aaa9GG1333223E[] = {
  NSPAIR(_ZN3aaa9GG1333223C1Ev),
  NSPAIR(_ZN3aaa9GG1333223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG1333223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333223E[];
extern void _ZN3aaa9GG13332233fooEv();
extern void _ZN3aaa9GG13332233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13332233fooEv,_ZThn8_N3aaa9GG13332233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13332233barEv,_ZThn8_N3aaa9GG13332233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332233fooEv,_ZThn20_N3aaa9GG13332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332233barEv,_ZThn20_N3aaa9GG13332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13332233barEv,_ZThn28_N3aaa9GG13332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13332233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13332233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332233fooEv,_ZThn8_N3aaa9GG13332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332233barEv,_ZThn8_N3aaa9GG13332233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332233fooEv,_ZThn20_N3aaa9GG13332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332233barEv,_ZThn20_N3aaa9GG13332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13332233barEv,_ZThn28_N3aaa9GG13332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333223E[];
Class_Descriptor cd__ZN3aaa9GG1333223E = {  "_ZN3aaa9GG1333223E", // class name
  bases__ZN3aaa9GG1333223E, 6,
  &(vtc__ZN3aaa9GG1333223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333231  : ::aaa::EE133 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13332313fooEv
  ~GG1333231(); // tgen
  GG1333231(); // tgen
};
//SIG(1 _ZN3aaa9GG1333231E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333231 ::foo(){vfunc_called(this, "_ZN3aaa9GG13332313fooEv");}
aaa::GG1333231 ::~GG1333231(){ note_dtor("_ZN3aaa9GG1333231E", this);} // tgen
aaa::GG1333231 ::GG1333231(){ note_ctor("_ZN3aaa9GG1333231E", this);} // tgen
}
static void Test__ZN3aaa9GG1333231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333231E, buf);
    ::aaa::GG1333231 *dp, &lv = *(dp=new (buf) ::aaa::GG1333231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333231E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333231E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1333231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1333231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1333231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333231E);
    dp->::aaa::GG1333231::~GG1333231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333231E(Test__ZN3aaa9GG1333231E, "_ZN3aaa9GG1333231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333231C1Ev();
extern void _ZN3aaa9GG1333231D1Ev();
Name_Map name_map__ZN3aaa9GG1333231E[] = {
  NSPAIR(_ZN3aaa9GG1333231C1Ev),
  NSPAIR(_ZN3aaa9GG1333231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1333231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333231E[];
extern void _ZN3aaa9GG13332313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13332313fooEv,_ZThn8_N3aaa9GG13332313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332313fooEv,_ZThn20_N3aaa9GG13332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13332313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332313fooEv,_ZThn8_N3aaa9GG13332313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332313fooEv,_ZThn20_N3aaa9GG13332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333231E[];
Class_Descriptor cd__ZN3aaa9GG1333231E = {  "_ZN3aaa9GG1333231E", // class name
  bases__ZN3aaa9GG1333231E, 6,
  &(vtc__ZN3aaa9GG1333231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333232  : ::aaa::EE133 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13332323barEv
  ~GG1333232(); // tgen
  GG1333232(); // tgen
};
//SIG(1 _ZN3aaa9GG1333232E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333232 ::bar(){vfunc_called(this, "_ZN3aaa9GG13332323barEv");}
aaa::GG1333232 ::~GG1333232(){ note_dtor("_ZN3aaa9GG1333232E", this);} // tgen
aaa::GG1333232 ::GG1333232(){ note_ctor("_ZN3aaa9GG1333232E", this);} // tgen
}
static void Test__ZN3aaa9GG1333232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333232E, buf);
    ::aaa::GG1333232 *dp, &lv = *(dp=new (buf) ::aaa::GG1333232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333232E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333232E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1333232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1333232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1333232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333232E);
    dp->::aaa::GG1333232::~GG1333232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333232E(Test__ZN3aaa9GG1333232E, "_ZN3aaa9GG1333232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333232C1Ev();
extern void _ZN3aaa9GG1333232D1Ev();
Name_Map name_map__ZN3aaa9GG1333232E[] = {
  NSPAIR(_ZN3aaa9GG1333232C1Ev),
  NSPAIR(_ZN3aaa9GG1333232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1333232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333232E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13332323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13332323barEv,_ZThn8_N3aaa9GG13332323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13332323barEv,_ZThn20_N3aaa9GG13332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13332323barEv,_ZThn28_N3aaa9GG13332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13332323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332323barEv,_ZThn8_N3aaa9GG13332323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332323barEv,_ZThn20_N3aaa9GG13332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13332323barEv,_ZThn28_N3aaa9GG13332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333232E[];
Class_Descriptor cd__ZN3aaa9GG1333232E = {  "_ZN3aaa9GG1333232E", // class name
  bases__ZN3aaa9GG1333232E, 6,
  &(vtc__ZN3aaa9GG1333232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333233  : ::aaa::EE133 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13332333fooEv
  virtual void  bar(); // _ZN3aaa9GG13332333barEv
  ~GG1333233(); // tgen
  GG1333233(); // tgen
};
//SIG(1 _ZN3aaa9GG1333233E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333233 ::foo(){vfunc_called(this, "_ZN3aaa9GG13332333fooEv");}
void  aaa::GG1333233 ::bar(){vfunc_called(this, "_ZN3aaa9GG13332333barEv");}
aaa::GG1333233 ::~GG1333233(){ note_dtor("_ZN3aaa9GG1333233E", this);} // tgen
aaa::GG1333233 ::GG1333233(){ note_ctor("_ZN3aaa9GG1333233E", this);} // tgen
}
static void Test__ZN3aaa9GG1333233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333233E, buf);
    ::aaa::GG1333233 *dp, &lv = *(dp=new (buf) ::aaa::GG1333233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333233E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333233E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1333233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG1333233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG1333233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333233E);
    dp->::aaa::GG1333233::~GG1333233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333233E(Test__ZN3aaa9GG1333233E, "_ZN3aaa9GG1333233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333233C1Ev();
extern void _ZN3aaa9GG1333233D1Ev();
Name_Map name_map__ZN3aaa9GG1333233E[] = {
  NSPAIR(_ZN3aaa9GG1333233C1Ev),
  NSPAIR(_ZN3aaa9GG1333233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG1333233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333233E[];
extern void _ZN3aaa9GG13332333fooEv();
extern void _ZN3aaa9GG13332333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13332333fooEv,_ZThn8_N3aaa9GG13332333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13332333barEv,_ZThn8_N3aaa9GG13332333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332333fooEv,_ZThn20_N3aaa9GG13332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13332333barEv,_ZThn20_N3aaa9GG13332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13332333barEv,_ZThn28_N3aaa9GG13332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13332333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13332333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332333fooEv,_ZThn8_N3aaa9GG13332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13332333barEv,_ZThn8_N3aaa9GG13332333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332333fooEv,_ZThn20_N3aaa9GG13332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13332333barEv,_ZThn20_N3aaa9GG13332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13332333barEv,_ZThn28_N3aaa9GG13332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333233E[];
Class_Descriptor cd__ZN3aaa9GG1333233E = {  "_ZN3aaa9GG1333233E", // class name
  bases__ZN3aaa9GG1333233E, 6,
  &(vtc__ZN3aaa9GG1333233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333311  : ::aaa::EE133 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13333113fooEv
  ~GG1333311(); // tgen
  GG1333311(); // tgen
};
//SIG(1 _ZN3aaa9GG1333311E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333311 ::foo(){vfunc_called(this, "_ZN3aaa9GG13333113fooEv");}
aaa::GG1333311 ::~GG1333311(){ note_dtor("_ZN3aaa9GG1333311E", this);} // tgen
aaa::GG1333311 ::GG1333311(){ note_ctor("_ZN3aaa9GG1333311E", this);} // tgen
}
static void Test__ZN3aaa9GG1333311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333311E, buf);
    ::aaa::GG1333311 *dp, &lv = *(dp=new (buf) ::aaa::GG1333311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333311E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333311E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1333311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1333311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1333311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333311E);
    dp->::aaa::GG1333311::~GG1333311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333311E(Test__ZN3aaa9GG1333311E, "_ZN3aaa9GG1333311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333311C1Ev();
extern void _ZN3aaa9GG1333311D1Ev();
Name_Map name_map__ZN3aaa9GG1333311E[] = {
  NSPAIR(_ZN3aaa9GG1333311C1Ev),
  NSPAIR(_ZN3aaa9GG1333311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1333311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333311E[];
extern void _ZN3aaa9GG13333113fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13333113fooEv,_ZThn8_N3aaa9GG13333113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333113fooEv,_ZThn20_N3aaa9GG13333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13333113fooEv,_ZThn28_N3aaa9GG13333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13333113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333113fooEv,_ZThn8_N3aaa9GG13333113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333113fooEv,_ZThn20_N3aaa9GG13333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333113fooEv,_ZThn28_N3aaa9GG13333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333311E[];
Class_Descriptor cd__ZN3aaa9GG1333311E = {  "_ZN3aaa9GG1333311E", // class name
  bases__ZN3aaa9GG1333311E, 6,
  &(vtc__ZN3aaa9GG1333311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333312  : ::aaa::EE133 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13333123barEv
  ~GG1333312(); // tgen
  GG1333312(); // tgen
};
//SIG(1 _ZN3aaa9GG1333312E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333312 ::bar(){vfunc_called(this, "_ZN3aaa9GG13333123barEv");}
aaa::GG1333312 ::~GG1333312(){ note_dtor("_ZN3aaa9GG1333312E", this);} // tgen
aaa::GG1333312 ::GG1333312(){ note_ctor("_ZN3aaa9GG1333312E", this);} // tgen
}
static void Test__ZN3aaa9GG1333312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333312E, buf);
    ::aaa::GG1333312 *dp, &lv = *(dp=new (buf) ::aaa::GG1333312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333312E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333312E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1333312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1333312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1333312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333312E);
    dp->::aaa::GG1333312::~GG1333312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333312E(Test__ZN3aaa9GG1333312E, "_ZN3aaa9GG1333312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333312C1Ev();
extern void _ZN3aaa9GG1333312D1Ev();
Name_Map name_map__ZN3aaa9GG1333312E[] = {
  NSPAIR(_ZN3aaa9GG1333312C1Ev),
  NSPAIR(_ZN3aaa9GG1333312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1333312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333312E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13333123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13333123barEv,_ZThn8_N3aaa9GG13333123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13333123barEv,_ZThn20_N3aaa9GG13333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13333123barEv,_ZThn28_N3aaa9GG13333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13333123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333123barEv,_ZThn8_N3aaa9GG13333123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333123barEv,_ZThn20_N3aaa9GG13333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333123barEv,_ZThn28_N3aaa9GG13333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333312E[];
Class_Descriptor cd__ZN3aaa9GG1333312E = {  "_ZN3aaa9GG1333312E", // class name
  bases__ZN3aaa9GG1333312E, 6,
  &(vtc__ZN3aaa9GG1333312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333313  : ::aaa::EE133 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13333133fooEv
  virtual void  bar(); // _ZN3aaa9GG13333133barEv
  ~GG1333313(); // tgen
  GG1333313(); // tgen
};
//SIG(1 _ZN3aaa9GG1333313E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333313 ::foo(){vfunc_called(this, "_ZN3aaa9GG13333133fooEv");}
void  aaa::GG1333313 ::bar(){vfunc_called(this, "_ZN3aaa9GG13333133barEv");}
aaa::GG1333313 ::~GG1333313(){ note_dtor("_ZN3aaa9GG1333313E", this);} // tgen
aaa::GG1333313 ::GG1333313(){ note_ctor("_ZN3aaa9GG1333313E", this);} // tgen
}
static void Test__ZN3aaa9GG1333313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333313E, buf);
    ::aaa::GG1333313 *dp, &lv = *(dp=new (buf) ::aaa::GG1333313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333313E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333313E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1333313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG1333313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG1333313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333313E);
    dp->::aaa::GG1333313::~GG1333313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333313E(Test__ZN3aaa9GG1333313E, "_ZN3aaa9GG1333313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333313C1Ev();
extern void _ZN3aaa9GG1333313D1Ev();
Name_Map name_map__ZN3aaa9GG1333313E[] = {
  NSPAIR(_ZN3aaa9GG1333313C1Ev),
  NSPAIR(_ZN3aaa9GG1333313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG1333313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333313E[];
extern void _ZN3aaa9GG13333133fooEv();
extern void _ZN3aaa9GG13333133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13333133fooEv,_ZThn8_N3aaa9GG13333133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13333133barEv,_ZThn8_N3aaa9GG13333133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333133fooEv,_ZThn20_N3aaa9GG13333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333133barEv,_ZThn20_N3aaa9GG13333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13333133fooEv,_ZThn28_N3aaa9GG13333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13333133barEv,_ZThn28_N3aaa9GG13333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13333133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13333133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333133fooEv,_ZThn8_N3aaa9GG13333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333133barEv,_ZThn8_N3aaa9GG13333133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333133fooEv,_ZThn20_N3aaa9GG13333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333133barEv,_ZThn20_N3aaa9GG13333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333133fooEv,_ZThn28_N3aaa9GG13333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333133barEv,_ZThn28_N3aaa9GG13333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333313E[];
Class_Descriptor cd__ZN3aaa9GG1333313E = {  "_ZN3aaa9GG1333313E", // class name
  bases__ZN3aaa9GG1333313E, 6,
  &(vtc__ZN3aaa9GG1333313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333321  : ::aaa::EE133 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13333213fooEv
  ~GG1333321(); // tgen
  GG1333321(); // tgen
};
//SIG(1 _ZN3aaa9GG1333321E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333321 ::foo(){vfunc_called(this, "_ZN3aaa9GG13333213fooEv");}
aaa::GG1333321 ::~GG1333321(){ note_dtor("_ZN3aaa9GG1333321E", this);} // tgen
aaa::GG1333321 ::GG1333321(){ note_ctor("_ZN3aaa9GG1333321E", this);} // tgen
}
static void Test__ZN3aaa9GG1333321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333321E, buf);
    ::aaa::GG1333321 *dp, &lv = *(dp=new (buf) ::aaa::GG1333321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333321E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333321E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1333321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1333321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1333321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333321E);
    dp->::aaa::GG1333321::~GG1333321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333321E(Test__ZN3aaa9GG1333321E, "_ZN3aaa9GG1333321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333321C1Ev();
extern void _ZN3aaa9GG1333321D1Ev();
Name_Map name_map__ZN3aaa9GG1333321E[] = {
  NSPAIR(_ZN3aaa9GG1333321C1Ev),
  NSPAIR(_ZN3aaa9GG1333321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1333321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333321E[];
extern void _ZN3aaa9GG13333213fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13333213fooEv,_ZThn8_N3aaa9GG13333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333213fooEv,_ZThn20_N3aaa9GG13333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13333213fooEv,_ZThn28_N3aaa9GG13333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13333213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333213fooEv,_ZThn8_N3aaa9GG13333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333213fooEv,_ZThn20_N3aaa9GG13333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333213fooEv,_ZThn28_N3aaa9GG13333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333321E[];
Class_Descriptor cd__ZN3aaa9GG1333321E = {  "_ZN3aaa9GG1333321E", // class name
  bases__ZN3aaa9GG1333321E, 6,
  &(vtc__ZN3aaa9GG1333321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333322  : ::aaa::EE133 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13333223barEv
  ~GG1333322(); // tgen
  GG1333322(); // tgen
};
//SIG(1 _ZN3aaa9GG1333322E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333322 ::bar(){vfunc_called(this, "_ZN3aaa9GG13333223barEv");}
aaa::GG1333322 ::~GG1333322(){ note_dtor("_ZN3aaa9GG1333322E", this);} // tgen
aaa::GG1333322 ::GG1333322(){ note_ctor("_ZN3aaa9GG1333322E", this);} // tgen
}
static void Test__ZN3aaa9GG1333322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333322E, buf);
    ::aaa::GG1333322 *dp, &lv = *(dp=new (buf) ::aaa::GG1333322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333322E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333322E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1333322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1333322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1333322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333322E);
    dp->::aaa::GG1333322::~GG1333322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333322E(Test__ZN3aaa9GG1333322E, "_ZN3aaa9GG1333322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333322C1Ev();
extern void _ZN3aaa9GG1333322D1Ev();
Name_Map name_map__ZN3aaa9GG1333322E[] = {
  NSPAIR(_ZN3aaa9GG1333322C1Ev),
  NSPAIR(_ZN3aaa9GG1333322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1333322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333322E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13333223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13333223barEv,_ZThn8_N3aaa9GG13333223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13333223barEv,_ZThn20_N3aaa9GG13333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13333223barEv,_ZThn28_N3aaa9GG13333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13333223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333223barEv,_ZThn8_N3aaa9GG13333223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333223barEv,_ZThn20_N3aaa9GG13333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333223barEv,_ZThn28_N3aaa9GG13333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333322E[];
Class_Descriptor cd__ZN3aaa9GG1333322E = {  "_ZN3aaa9GG1333322E", // class name
  bases__ZN3aaa9GG1333322E, 6,
  &(vtc__ZN3aaa9GG1333322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333323  : ::aaa::EE133 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13333233fooEv
  virtual void  bar(); // _ZN3aaa9GG13333233barEv
  ~GG1333323(); // tgen
  GG1333323(); // tgen
};
//SIG(1 _ZN3aaa9GG1333323E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333323 ::foo(){vfunc_called(this, "_ZN3aaa9GG13333233fooEv");}
void  aaa::GG1333323 ::bar(){vfunc_called(this, "_ZN3aaa9GG13333233barEv");}
aaa::GG1333323 ::~GG1333323(){ note_dtor("_ZN3aaa9GG1333323E", this);} // tgen
aaa::GG1333323 ::GG1333323(){ note_ctor("_ZN3aaa9GG1333323E", this);} // tgen
}
static void Test__ZN3aaa9GG1333323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333323E, buf);
    ::aaa::GG1333323 *dp, &lv = *(dp=new (buf) ::aaa::GG1333323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333323E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333323E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1333323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG1333323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG1333323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333323E);
    dp->::aaa::GG1333323::~GG1333323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333323E(Test__ZN3aaa9GG1333323E, "_ZN3aaa9GG1333323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333323C1Ev();
extern void _ZN3aaa9GG1333323D1Ev();
Name_Map name_map__ZN3aaa9GG1333323E[] = {
  NSPAIR(_ZN3aaa9GG1333323C1Ev),
  NSPAIR(_ZN3aaa9GG1333323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG1333323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333323E[];
extern void _ZN3aaa9GG13333233fooEv();
extern void _ZN3aaa9GG13333233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13333233fooEv,_ZThn8_N3aaa9GG13333233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13333233barEv,_ZThn8_N3aaa9GG13333233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333233fooEv,_ZThn20_N3aaa9GG13333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333233barEv,_ZThn20_N3aaa9GG13333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13333233fooEv,_ZThn28_N3aaa9GG13333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13333233barEv,_ZThn28_N3aaa9GG13333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13333233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13333233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333233fooEv,_ZThn8_N3aaa9GG13333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333233barEv,_ZThn8_N3aaa9GG13333233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333233fooEv,_ZThn20_N3aaa9GG13333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333233barEv,_ZThn20_N3aaa9GG13333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333233fooEv,_ZThn28_N3aaa9GG13333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333233barEv,_ZThn28_N3aaa9GG13333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333323E[];
Class_Descriptor cd__ZN3aaa9GG1333323E = {  "_ZN3aaa9GG1333323E", // class name
  bases__ZN3aaa9GG1333323E, 6,
  &(vtc__ZN3aaa9GG1333323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333331  : ::aaa::EE133 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13333313fooEv
  ~GG1333331(); // tgen
  GG1333331(); // tgen
};
//SIG(1 _ZN3aaa9GG1333331E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333331 ::foo(){vfunc_called(this, "_ZN3aaa9GG13333313fooEv");}
aaa::GG1333331 ::~GG1333331(){ note_dtor("_ZN3aaa9GG1333331E", this);} // tgen
aaa::GG1333331 ::GG1333331(){ note_ctor("_ZN3aaa9GG1333331E", this);} // tgen
}
static void Test__ZN3aaa9GG1333331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333331E, buf);
    ::aaa::GG1333331 *dp, &lv = *(dp=new (buf) ::aaa::GG1333331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333331E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333331E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1333331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1333331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1333331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333331E);
    dp->::aaa::GG1333331::~GG1333331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333331E(Test__ZN3aaa9GG1333331E, "_ZN3aaa9GG1333331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333331C1Ev();
extern void _ZN3aaa9GG1333331D1Ev();
Name_Map name_map__ZN3aaa9GG1333331E[] = {
  NSPAIR(_ZN3aaa9GG1333331C1Ev),
  NSPAIR(_ZN3aaa9GG1333331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1333331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333331E[];
extern void _ZN3aaa9GG13333313fooEv();
extern void _ZN3aaa5EE1333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13333313fooEv,_ZThn8_N3aaa9GG13333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333313fooEv,_ZThn20_N3aaa9GG13333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG13333313fooEv,_ZThn28_N3aaa9GG13333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13333313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE1333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333313fooEv,_ZThn8_N3aaa9GG13333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333barEv,_ZThn8_N3aaa5EE1333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333313fooEv,_ZThn20_N3aaa9GG13333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333313fooEv,_ZThn28_N3aaa9GG13333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333331E[];
Class_Descriptor cd__ZN3aaa9GG1333331E = {  "_ZN3aaa9GG1333331E", // class name
  bases__ZN3aaa9GG1333331E, 6,
  &(vtc__ZN3aaa9GG1333331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333332  : ::aaa::EE133 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG13333323barEv
  ~GG1333332(); // tgen
  GG1333332(); // tgen
};
//SIG(1 _ZN3aaa9GG1333332E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG1333332 ::bar(){vfunc_called(this, "_ZN3aaa9GG13333323barEv");}
aaa::GG1333332 ::~GG1333332(){ note_dtor("_ZN3aaa9GG1333332E", this);} // tgen
aaa::GG1333332 ::GG1333332(){ note_ctor("_ZN3aaa9GG1333332E", this);} // tgen
}
static void Test__ZN3aaa9GG1333332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333332E, buf);
    ::aaa::GG1333332 *dp, &lv = *(dp=new (buf) ::aaa::GG1333332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333332E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333332E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1333332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1333332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1333332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333332E);
    dp->::aaa::GG1333332::~GG1333332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333332E(Test__ZN3aaa9GG1333332E, "_ZN3aaa9GG1333332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333332C1Ev();
extern void _ZN3aaa9GG1333332D1Ev();
Name_Map name_map__ZN3aaa9GG1333332E[] = {
  NSPAIR(_ZN3aaa9GG1333332C1Ev),
  NSPAIR(_ZN3aaa9GG1333332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1333332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333332E[];
extern void _ZN3aaa5EE1333fooEv();
extern void _ZN3aaa9GG13333323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13333323barEv,_ZThn8_N3aaa9GG13333323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG13333323barEv,_ZThn20_N3aaa9GG13333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13333323barEv,_ZThn28_N3aaa9GG13333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE1333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13333323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE1333fooEv,_ZThn8_N3aaa5EE1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333323barEv,_ZThn8_N3aaa9GG13333323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333323barEv,_ZThn20_N3aaa9GG13333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333323barEv,_ZThn28_N3aaa9GG13333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333332E[];
Class_Descriptor cd__ZN3aaa9GG1333332E = {  "_ZN3aaa9GG1333332E", // class name
  bases__ZN3aaa9GG1333332E, 6,
  &(vtc__ZN3aaa9GG1333332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG1333333  : ::aaa::EE133 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG13333333fooEv
  virtual void  bar(); // _ZN3aaa9GG13333333barEv
  ~GG1333333(); // tgen
  GG1333333(); // tgen
};
//SIG(1 _ZN3aaa9GG1333333E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG1333333 ::foo(){vfunc_called(this, "_ZN3aaa9GG13333333fooEv");}
void  aaa::GG1333333 ::bar(){vfunc_called(this, "_ZN3aaa9GG13333333barEv");}
aaa::GG1333333 ::~GG1333333(){ note_dtor("_ZN3aaa9GG1333333E", this);} // tgen
aaa::GG1333333 ::GG1333333(){ note_ctor("_ZN3aaa9GG1333333E", this);} // tgen
}
static void Test__ZN3aaa9GG1333333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG1333333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG1333333E, buf);
    ::aaa::GG1333333 *dp, &lv = *(dp=new (buf) ::aaa::GG1333333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG1333333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG1333333E)");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::EE133*), 0, "_ZN3aaa9GG1333333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE133*), ABISELECT(16,8), "_ZN3aaa9GG1333333E");
    check_base_class_offset(lv, (::aaa::EE133*), 0, "_ZN3aaa9GG1333333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1333333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG1333333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG1333333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG1333333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG1333333E);
    dp->::aaa::GG1333333::~GG1333333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG1333333E(Test__ZN3aaa9GG1333333E, "_ZN3aaa9GG1333333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG1333333C1Ev();
extern void _ZN3aaa9GG1333333D1Ev();
Name_Map name_map__ZN3aaa9GG1333333E[] = {
  NSPAIR(_ZN3aaa9GG1333333C1Ev),
  NSPAIR(_ZN3aaa9GG1333333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE133E;
extern VTBL_ENTRY _ZTIN3aaa5EE133E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE133E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG1333333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA1E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE133E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG1333333E[];
extern void _ZN3aaa9GG13333333fooEv();
extern void _ZN3aaa9GG13333333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG13333333fooEv,_ZThn8_N3aaa9GG13333333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG13333333barEv,_ZThn8_N3aaa9GG13333333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333333fooEv,_ZThn20_N3aaa9GG13333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG13333333barEv,_ZThn20_N3aaa9GG13333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13333333fooEv,_ZThn28_N3aaa9GG13333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG13333333barEv,_ZThn28_N3aaa9GG13333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG1333333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG13333333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG13333333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333333fooEv,_ZThn8_N3aaa9GG13333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG13333333barEv,_ZThn8_N3aaa9GG13333333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333333fooEv,_ZThn20_N3aaa9GG13333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG13333333barEv,_ZThn20_N3aaa9GG13333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG1333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333333fooEv,_ZThn28_N3aaa9GG13333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG13333333barEv,_ZThn28_N3aaa9GG13333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG1333333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG1333333E[];
Class_Descriptor cd__ZN3aaa9GG1333333E = {  "_ZN3aaa9GG1333333E", // class name
  bases__ZN3aaa9GG1333333E, 6,
  &(vtc__ZN3aaa9GG1333333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG1333333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG1333333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111111  : ::aaa::EE211 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21111113fooEv
  ~GG2111111(); // tgen
  GG2111111(); // tgen
};
//SIG(1 _ZN3aaa9GG2111111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21111113fooEv");}
aaa::GG2111111 ::~GG2111111(){ note_dtor("_ZN3aaa9GG2111111E", this);} // tgen
aaa::GG2111111 ::GG2111111(){ note_ctor("_ZN3aaa9GG2111111E", this);} // tgen
}
static void Test__ZN3aaa9GG2111111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111111E, buf);
    ::aaa::GG2111111 *dp, &lv = *(dp=new (buf) ::aaa::GG2111111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111111E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2111111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2111111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2111111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111111E);
    dp->::aaa::GG2111111::~GG2111111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111111E(Test__ZN3aaa9GG2111111E, "_ZN3aaa9GG2111111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111111C1Ev();
extern void _ZN3aaa9GG2111111D1Ev();
Name_Map name_map__ZN3aaa9GG2111111E[] = {
  NSPAIR(_ZN3aaa9GG2111111C1Ev),
  NSPAIR(_ZN3aaa9GG2111111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2111111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21111113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21111113fooEv,_ZThn8_N3aaa9GG21111113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21111113fooEv,_ZThn20_N3aaa9GG21111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21111113fooEv,_ZThn28_N3aaa9GG21111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21111113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21111113fooEv,_ZThn8_N3aaa9GG21111113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111113fooEv,_ZThn20_N3aaa9GG21111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21111113fooEv,_ZThn28_N3aaa9GG21111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111111E[];
Class_Descriptor cd__ZN3aaa9GG2111111E = {  "_ZN3aaa9GG2111111E", // class name
  bases__ZN3aaa9GG2111111E, 6,
  &(vtc__ZN3aaa9GG2111111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111112  : ::aaa::EE211 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21111123barEv
  ~GG2111112(); // tgen
  GG2111112(); // tgen
};
//SIG(1 _ZN3aaa9GG2111112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21111123barEv");}
aaa::GG2111112 ::~GG2111112(){ note_dtor("_ZN3aaa9GG2111112E", this);} // tgen
aaa::GG2111112 ::GG2111112(){ note_ctor("_ZN3aaa9GG2111112E", this);} // tgen
}
static void Test__ZN3aaa9GG2111112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111112E, buf);
    ::aaa::GG2111112 *dp, &lv = *(dp=new (buf) ::aaa::GG2111112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111112E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2111112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2111112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2111112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111112E);
    dp->::aaa::GG2111112::~GG2111112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111112E(Test__ZN3aaa9GG2111112E, "_ZN3aaa9GG2111112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111112C1Ev();
extern void _ZN3aaa9GG2111112D1Ev();
Name_Map name_map__ZN3aaa9GG2111112E[] = {
  NSPAIR(_ZN3aaa9GG2111112C1Ev),
  NSPAIR(_ZN3aaa9GG2111112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2111112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111112E[];
extern void _ZN3aaa9GG21111123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21111123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111112E[];
Class_Descriptor cd__ZN3aaa9GG2111112E = {  "_ZN3aaa9GG2111112E", // class name
  bases__ZN3aaa9GG2111112E, 6,
  &(vtc__ZN3aaa9GG2111112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111113  : ::aaa::EE211 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21111133fooEv
  virtual void  bar(); // _ZN3aaa9GG21111133barEv
  ~GG2111113(); // tgen
  GG2111113(); // tgen
};
//SIG(1 _ZN3aaa9GG2111113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21111133fooEv");}
void  aaa::GG2111113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21111133barEv");}
aaa::GG2111113 ::~GG2111113(){ note_dtor("_ZN3aaa9GG2111113E", this);} // tgen
aaa::GG2111113 ::GG2111113(){ note_ctor("_ZN3aaa9GG2111113E", this);} // tgen
}
static void Test__ZN3aaa9GG2111113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111113E, buf);
    ::aaa::GG2111113 *dp, &lv = *(dp=new (buf) ::aaa::GG2111113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111113E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2111113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2111113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2111113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111113E);
    dp->::aaa::GG2111113::~GG2111113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111113E(Test__ZN3aaa9GG2111113E, "_ZN3aaa9GG2111113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111113C1Ev();
extern void _ZN3aaa9GG2111113D1Ev();
Name_Map name_map__ZN3aaa9GG2111113E[] = {
  NSPAIR(_ZN3aaa9GG2111113C1Ev),
  NSPAIR(_ZN3aaa9GG2111113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2111113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111113E[];
extern void _ZN3aaa9GG21111133barEv();
extern void _ZN3aaa9GG21111133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21111133fooEv,_ZThn8_N3aaa9GG21111133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21111133fooEv,_ZThn20_N3aaa9GG21111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21111133fooEv,_ZThn28_N3aaa9GG21111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21111133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21111133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21111133fooEv,_ZThn8_N3aaa9GG21111133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111133fooEv,_ZThn20_N3aaa9GG21111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21111133fooEv,_ZThn28_N3aaa9GG21111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111113E[];
Class_Descriptor cd__ZN3aaa9GG2111113E = {  "_ZN3aaa9GG2111113E", // class name
  bases__ZN3aaa9GG2111113E, 6,
  &(vtc__ZN3aaa9GG2111113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111121  : ::aaa::EE211 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21111213fooEv
  ~GG2111121(); // tgen
  GG2111121(); // tgen
};
//SIG(1 _ZN3aaa9GG2111121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21111213fooEv");}
aaa::GG2111121 ::~GG2111121(){ note_dtor("_ZN3aaa9GG2111121E", this);} // tgen
aaa::GG2111121 ::GG2111121(){ note_ctor("_ZN3aaa9GG2111121E", this);} // tgen
}
static void Test__ZN3aaa9GG2111121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111121E, buf);
    ::aaa::GG2111121 *dp, &lv = *(dp=new (buf) ::aaa::GG2111121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111121E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2111121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2111121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2111121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111121E);
    dp->::aaa::GG2111121::~GG2111121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111121E(Test__ZN3aaa9GG2111121E, "_ZN3aaa9GG2111121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111121C1Ev();
extern void _ZN3aaa9GG2111121D1Ev();
Name_Map name_map__ZN3aaa9GG2111121E[] = {
  NSPAIR(_ZN3aaa9GG2111121C1Ev),
  NSPAIR(_ZN3aaa9GG2111121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2111121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21111213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21111213fooEv,_ZThn8_N3aaa9GG21111213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21111213fooEv,_ZThn20_N3aaa9GG21111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21111213fooEv,_ZThn28_N3aaa9GG21111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21111213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21111213fooEv,_ZThn8_N3aaa9GG21111213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111213fooEv,_ZThn20_N3aaa9GG21111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21111213fooEv,_ZThn28_N3aaa9GG21111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111121E[];
Class_Descriptor cd__ZN3aaa9GG2111121E = {  "_ZN3aaa9GG2111121E", // class name
  bases__ZN3aaa9GG2111121E, 6,
  &(vtc__ZN3aaa9GG2111121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111122  : ::aaa::EE211 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21111223barEv
  ~GG2111122(); // tgen
  GG2111122(); // tgen
};
//SIG(1 _ZN3aaa9GG2111122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21111223barEv");}
aaa::GG2111122 ::~GG2111122(){ note_dtor("_ZN3aaa9GG2111122E", this);} // tgen
aaa::GG2111122 ::GG2111122(){ note_ctor("_ZN3aaa9GG2111122E", this);} // tgen
}
static void Test__ZN3aaa9GG2111122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111122E, buf);
    ::aaa::GG2111122 *dp, &lv = *(dp=new (buf) ::aaa::GG2111122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111122E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2111122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2111122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2111122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111122E);
    dp->::aaa::GG2111122::~GG2111122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111122E(Test__ZN3aaa9GG2111122E, "_ZN3aaa9GG2111122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111122C1Ev();
extern void _ZN3aaa9GG2111122D1Ev();
Name_Map name_map__ZN3aaa9GG2111122E[] = {
  NSPAIR(_ZN3aaa9GG2111122C1Ev),
  NSPAIR(_ZN3aaa9GG2111122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2111122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111122E[];
extern void _ZN3aaa9GG21111223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21111223barEv,_ZThn20_N3aaa9GG21111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21111223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111223barEv,_ZThn20_N3aaa9GG21111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111122E[];
Class_Descriptor cd__ZN3aaa9GG2111122E = {  "_ZN3aaa9GG2111122E", // class name
  bases__ZN3aaa9GG2111122E, 6,
  &(vtc__ZN3aaa9GG2111122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111123  : ::aaa::EE211 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21111233fooEv
  virtual void  bar(); // _ZN3aaa9GG21111233barEv
  ~GG2111123(); // tgen
  GG2111123(); // tgen
};
//SIG(1 _ZN3aaa9GG2111123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21111233fooEv");}
void  aaa::GG2111123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21111233barEv");}
aaa::GG2111123 ::~GG2111123(){ note_dtor("_ZN3aaa9GG2111123E", this);} // tgen
aaa::GG2111123 ::GG2111123(){ note_ctor("_ZN3aaa9GG2111123E", this);} // tgen
}
static void Test__ZN3aaa9GG2111123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111123E, buf);
    ::aaa::GG2111123 *dp, &lv = *(dp=new (buf) ::aaa::GG2111123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111123E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2111123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2111123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2111123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111123E);
    dp->::aaa::GG2111123::~GG2111123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111123E(Test__ZN3aaa9GG2111123E, "_ZN3aaa9GG2111123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111123C1Ev();
extern void _ZN3aaa9GG2111123D1Ev();
Name_Map name_map__ZN3aaa9GG2111123E[] = {
  NSPAIR(_ZN3aaa9GG2111123C1Ev),
  NSPAIR(_ZN3aaa9GG2111123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2111123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111123E[];
extern void _ZN3aaa9GG21111233barEv();
extern void _ZN3aaa9GG21111233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21111233fooEv,_ZThn8_N3aaa9GG21111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21111233fooEv,_ZThn20_N3aaa9GG21111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21111233barEv,_ZThn20_N3aaa9GG21111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21111233fooEv,_ZThn28_N3aaa9GG21111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21111233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21111233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21111233fooEv,_ZThn8_N3aaa9GG21111233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111233fooEv,_ZThn20_N3aaa9GG21111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111233barEv,_ZThn20_N3aaa9GG21111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21111233fooEv,_ZThn28_N3aaa9GG21111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111123E[];
Class_Descriptor cd__ZN3aaa9GG2111123E = {  "_ZN3aaa9GG2111123E", // class name
  bases__ZN3aaa9GG2111123E, 6,
  &(vtc__ZN3aaa9GG2111123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111131  : ::aaa::EE211 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21111313fooEv
  ~GG2111131(); // tgen
  GG2111131(); // tgen
};
//SIG(1 _ZN3aaa9GG2111131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21111313fooEv");}
aaa::GG2111131 ::~GG2111131(){ note_dtor("_ZN3aaa9GG2111131E", this);} // tgen
aaa::GG2111131 ::GG2111131(){ note_ctor("_ZN3aaa9GG2111131E", this);} // tgen
}
static void Test__ZN3aaa9GG2111131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111131E, buf);
    ::aaa::GG2111131 *dp, &lv = *(dp=new (buf) ::aaa::GG2111131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111131E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2111131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2111131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2111131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111131E);
    dp->::aaa::GG2111131::~GG2111131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111131E(Test__ZN3aaa9GG2111131E, "_ZN3aaa9GG2111131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111131C1Ev();
extern void _ZN3aaa9GG2111131D1Ev();
Name_Map name_map__ZN3aaa9GG2111131E[] = {
  NSPAIR(_ZN3aaa9GG2111131C1Ev),
  NSPAIR(_ZN3aaa9GG2111131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2111131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21111313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21111313fooEv,_ZThn8_N3aaa9GG21111313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21111313fooEv,_ZThn20_N3aaa9GG21111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21111313fooEv,_ZThn28_N3aaa9GG21111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21111313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21111313fooEv,_ZThn8_N3aaa9GG21111313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111313fooEv,_ZThn20_N3aaa9GG21111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21111313fooEv,_ZThn28_N3aaa9GG21111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111131E[];
Class_Descriptor cd__ZN3aaa9GG2111131E = {  "_ZN3aaa9GG2111131E", // class name
  bases__ZN3aaa9GG2111131E, 6,
  &(vtc__ZN3aaa9GG2111131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111132  : ::aaa::EE211 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21111323barEv
  ~GG2111132(); // tgen
  GG2111132(); // tgen
};
//SIG(1 _ZN3aaa9GG2111132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21111323barEv");}
aaa::GG2111132 ::~GG2111132(){ note_dtor("_ZN3aaa9GG2111132E", this);} // tgen
aaa::GG2111132 ::GG2111132(){ note_ctor("_ZN3aaa9GG2111132E", this);} // tgen
}
static void Test__ZN3aaa9GG2111132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111132E, buf);
    ::aaa::GG2111132 *dp, &lv = *(dp=new (buf) ::aaa::GG2111132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111132E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2111132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2111132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2111132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111132E);
    dp->::aaa::GG2111132::~GG2111132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111132E(Test__ZN3aaa9GG2111132E, "_ZN3aaa9GG2111132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111132C1Ev();
extern void _ZN3aaa9GG2111132D1Ev();
Name_Map name_map__ZN3aaa9GG2111132E[] = {
  NSPAIR(_ZN3aaa9GG2111132C1Ev),
  NSPAIR(_ZN3aaa9GG2111132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2111132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111132E[];
extern void _ZN3aaa9GG21111323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21111323barEv,_ZThn20_N3aaa9GG21111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21111323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111323barEv,_ZThn20_N3aaa9GG21111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111132E[];
Class_Descriptor cd__ZN3aaa9GG2111132E = {  "_ZN3aaa9GG2111132E", // class name
  bases__ZN3aaa9GG2111132E, 6,
  &(vtc__ZN3aaa9GG2111132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111133  : ::aaa::EE211 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21111333fooEv
  virtual void  bar(); // _ZN3aaa9GG21111333barEv
  ~GG2111133(); // tgen
  GG2111133(); // tgen
};
//SIG(1 _ZN3aaa9GG2111133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21111333fooEv");}
void  aaa::GG2111133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21111333barEv");}
aaa::GG2111133 ::~GG2111133(){ note_dtor("_ZN3aaa9GG2111133E", this);} // tgen
aaa::GG2111133 ::GG2111133(){ note_ctor("_ZN3aaa9GG2111133E", this);} // tgen
}
static void Test__ZN3aaa9GG2111133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111133E, buf);
    ::aaa::GG2111133 *dp, &lv = *(dp=new (buf) ::aaa::GG2111133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111133E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2111133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2111133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2111133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111133E);
    dp->::aaa::GG2111133::~GG2111133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111133E(Test__ZN3aaa9GG2111133E, "_ZN3aaa9GG2111133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111133C1Ev();
extern void _ZN3aaa9GG2111133D1Ev();
Name_Map name_map__ZN3aaa9GG2111133E[] = {
  NSPAIR(_ZN3aaa9GG2111133C1Ev),
  NSPAIR(_ZN3aaa9GG2111133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2111133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111133E[];
extern void _ZN3aaa9GG21111333barEv();
extern void _ZN3aaa9GG21111333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21111333fooEv,_ZThn8_N3aaa9GG21111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21111333fooEv,_ZThn20_N3aaa9GG21111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21111333barEv,_ZThn20_N3aaa9GG21111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21111333fooEv,_ZThn28_N3aaa9GG21111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21111333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21111333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21111333fooEv,_ZThn8_N3aaa9GG21111333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111333fooEv,_ZThn20_N3aaa9GG21111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21111333barEv,_ZThn20_N3aaa9GG21111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21111333fooEv,_ZThn28_N3aaa9GG21111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111133E[];
Class_Descriptor cd__ZN3aaa9GG2111133E = {  "_ZN3aaa9GG2111133E", // class name
  bases__ZN3aaa9GG2111133E, 6,
  &(vtc__ZN3aaa9GG2111133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111211  : ::aaa::EE211 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21112113fooEv
  ~GG2111211(); // tgen
  GG2111211(); // tgen
};
//SIG(1 _ZN3aaa9GG2111211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21112113fooEv");}
aaa::GG2111211 ::~GG2111211(){ note_dtor("_ZN3aaa9GG2111211E", this);} // tgen
aaa::GG2111211 ::GG2111211(){ note_ctor("_ZN3aaa9GG2111211E", this);} // tgen
}
static void Test__ZN3aaa9GG2111211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111211E, buf);
    ::aaa::GG2111211 *dp, &lv = *(dp=new (buf) ::aaa::GG2111211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111211E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2111211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2111211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2111211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111211E);
    dp->::aaa::GG2111211::~GG2111211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111211E(Test__ZN3aaa9GG2111211E, "_ZN3aaa9GG2111211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111211C1Ev();
extern void _ZN3aaa9GG2111211D1Ev();
Name_Map name_map__ZN3aaa9GG2111211E[] = {
  NSPAIR(_ZN3aaa9GG2111211C1Ev),
  NSPAIR(_ZN3aaa9GG2111211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2111211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21112113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21112113fooEv,_ZThn8_N3aaa9GG21112113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21112113fooEv,_ZThn20_N3aaa9GG21112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21112113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21112113fooEv,_ZThn8_N3aaa9GG21112113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112113fooEv,_ZThn20_N3aaa9GG21112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111211E[];
Class_Descriptor cd__ZN3aaa9GG2111211E = {  "_ZN3aaa9GG2111211E", // class name
  bases__ZN3aaa9GG2111211E, 6,
  &(vtc__ZN3aaa9GG2111211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111212  : ::aaa::EE211 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21112123barEv
  ~GG2111212(); // tgen
  GG2111212(); // tgen
};
//SIG(1 _ZN3aaa9GG2111212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21112123barEv");}
aaa::GG2111212 ::~GG2111212(){ note_dtor("_ZN3aaa9GG2111212E", this);} // tgen
aaa::GG2111212 ::GG2111212(){ note_ctor("_ZN3aaa9GG2111212E", this);} // tgen
}
static void Test__ZN3aaa9GG2111212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111212E, buf);
    ::aaa::GG2111212 *dp, &lv = *(dp=new (buf) ::aaa::GG2111212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111212E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2111212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2111212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2111212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111212E);
    dp->::aaa::GG2111212::~GG2111212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111212E(Test__ZN3aaa9GG2111212E, "_ZN3aaa9GG2111212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111212C1Ev();
extern void _ZN3aaa9GG2111212D1Ev();
Name_Map name_map__ZN3aaa9GG2111212E[] = {
  NSPAIR(_ZN3aaa9GG2111212C1Ev),
  NSPAIR(_ZN3aaa9GG2111212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2111212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111212E[];
extern void _ZN3aaa9GG21112123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21112123barEv,_ZThn28_N3aaa9GG21112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21112123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21112123barEv,_ZThn28_N3aaa9GG21112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111212E[];
Class_Descriptor cd__ZN3aaa9GG2111212E = {  "_ZN3aaa9GG2111212E", // class name
  bases__ZN3aaa9GG2111212E, 6,
  &(vtc__ZN3aaa9GG2111212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111213  : ::aaa::EE211 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21112133fooEv
  virtual void  bar(); // _ZN3aaa9GG21112133barEv
  ~GG2111213(); // tgen
  GG2111213(); // tgen
};
//SIG(1 _ZN3aaa9GG2111213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21112133fooEv");}
void  aaa::GG2111213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21112133barEv");}
aaa::GG2111213 ::~GG2111213(){ note_dtor("_ZN3aaa9GG2111213E", this);} // tgen
aaa::GG2111213 ::GG2111213(){ note_ctor("_ZN3aaa9GG2111213E", this);} // tgen
}
static void Test__ZN3aaa9GG2111213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111213E, buf);
    ::aaa::GG2111213 *dp, &lv = *(dp=new (buf) ::aaa::GG2111213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111213E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2111213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2111213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2111213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111213E);
    dp->::aaa::GG2111213::~GG2111213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111213E(Test__ZN3aaa9GG2111213E, "_ZN3aaa9GG2111213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111213C1Ev();
extern void _ZN3aaa9GG2111213D1Ev();
Name_Map name_map__ZN3aaa9GG2111213E[] = {
  NSPAIR(_ZN3aaa9GG2111213C1Ev),
  NSPAIR(_ZN3aaa9GG2111213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2111213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111213E[];
extern void _ZN3aaa9GG21112133barEv();
extern void _ZN3aaa9GG21112133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21112133fooEv,_ZThn8_N3aaa9GG21112133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21112133fooEv,_ZThn20_N3aaa9GG21112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21112133barEv,_ZThn28_N3aaa9GG21112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21112133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21112133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21112133fooEv,_ZThn8_N3aaa9GG21112133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112133fooEv,_ZThn20_N3aaa9GG21112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21112133barEv,_ZThn28_N3aaa9GG21112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111213E[];
Class_Descriptor cd__ZN3aaa9GG2111213E = {  "_ZN3aaa9GG2111213E", // class name
  bases__ZN3aaa9GG2111213E, 6,
  &(vtc__ZN3aaa9GG2111213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111221  : ::aaa::EE211 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21112213fooEv
  ~GG2111221(); // tgen
  GG2111221(); // tgen
};
//SIG(1 _ZN3aaa9GG2111221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21112213fooEv");}
aaa::GG2111221 ::~GG2111221(){ note_dtor("_ZN3aaa9GG2111221E", this);} // tgen
aaa::GG2111221 ::GG2111221(){ note_ctor("_ZN3aaa9GG2111221E", this);} // tgen
}
static void Test__ZN3aaa9GG2111221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111221E, buf);
    ::aaa::GG2111221 *dp, &lv = *(dp=new (buf) ::aaa::GG2111221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111221E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2111221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2111221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2111221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111221E);
    dp->::aaa::GG2111221::~GG2111221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111221E(Test__ZN3aaa9GG2111221E, "_ZN3aaa9GG2111221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111221C1Ev();
extern void _ZN3aaa9GG2111221D1Ev();
Name_Map name_map__ZN3aaa9GG2111221E[] = {
  NSPAIR(_ZN3aaa9GG2111221C1Ev),
  NSPAIR(_ZN3aaa9GG2111221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2111221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21112213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21112213fooEv,_ZThn8_N3aaa9GG21112213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21112213fooEv,_ZThn20_N3aaa9GG21112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21112213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21112213fooEv,_ZThn8_N3aaa9GG21112213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112213fooEv,_ZThn20_N3aaa9GG21112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111221E[];
Class_Descriptor cd__ZN3aaa9GG2111221E = {  "_ZN3aaa9GG2111221E", // class name
  bases__ZN3aaa9GG2111221E, 6,
  &(vtc__ZN3aaa9GG2111221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111222  : ::aaa::EE211 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21112223barEv
  ~GG2111222(); // tgen
  GG2111222(); // tgen
};
//SIG(1 _ZN3aaa9GG2111222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21112223barEv");}
aaa::GG2111222 ::~GG2111222(){ note_dtor("_ZN3aaa9GG2111222E", this);} // tgen
aaa::GG2111222 ::GG2111222(){ note_ctor("_ZN3aaa9GG2111222E", this);} // tgen
}
static void Test__ZN3aaa9GG2111222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111222E, buf);
    ::aaa::GG2111222 *dp, &lv = *(dp=new (buf) ::aaa::GG2111222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111222E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2111222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2111222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2111222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111222E);
    dp->::aaa::GG2111222::~GG2111222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111222E(Test__ZN3aaa9GG2111222E, "_ZN3aaa9GG2111222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111222C1Ev();
extern void _ZN3aaa9GG2111222D1Ev();
Name_Map name_map__ZN3aaa9GG2111222E[] = {
  NSPAIR(_ZN3aaa9GG2111222C1Ev),
  NSPAIR(_ZN3aaa9GG2111222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2111222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111222E[];
extern void _ZN3aaa9GG21112223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21112223barEv,_ZThn20_N3aaa9GG21112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21112223barEv,_ZThn28_N3aaa9GG21112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21112223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112223barEv,_ZThn20_N3aaa9GG21112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21112223barEv,_ZThn28_N3aaa9GG21112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111222E[];
Class_Descriptor cd__ZN3aaa9GG2111222E = {  "_ZN3aaa9GG2111222E", // class name
  bases__ZN3aaa9GG2111222E, 6,
  &(vtc__ZN3aaa9GG2111222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111223  : ::aaa::EE211 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21112233fooEv
  virtual void  bar(); // _ZN3aaa9GG21112233barEv
  ~GG2111223(); // tgen
  GG2111223(); // tgen
};
//SIG(1 _ZN3aaa9GG2111223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21112233fooEv");}
void  aaa::GG2111223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21112233barEv");}
aaa::GG2111223 ::~GG2111223(){ note_dtor("_ZN3aaa9GG2111223E", this);} // tgen
aaa::GG2111223 ::GG2111223(){ note_ctor("_ZN3aaa9GG2111223E", this);} // tgen
}
static void Test__ZN3aaa9GG2111223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111223E, buf);
    ::aaa::GG2111223 *dp, &lv = *(dp=new (buf) ::aaa::GG2111223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111223E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2111223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2111223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2111223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111223E);
    dp->::aaa::GG2111223::~GG2111223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111223E(Test__ZN3aaa9GG2111223E, "_ZN3aaa9GG2111223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111223C1Ev();
extern void _ZN3aaa9GG2111223D1Ev();
Name_Map name_map__ZN3aaa9GG2111223E[] = {
  NSPAIR(_ZN3aaa9GG2111223C1Ev),
  NSPAIR(_ZN3aaa9GG2111223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2111223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111223E[];
extern void _ZN3aaa9GG21112233barEv();
extern void _ZN3aaa9GG21112233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21112233fooEv,_ZThn8_N3aaa9GG21112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21112233fooEv,_ZThn20_N3aaa9GG21112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21112233barEv,_ZThn20_N3aaa9GG21112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21112233barEv,_ZThn28_N3aaa9GG21112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21112233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21112233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21112233fooEv,_ZThn8_N3aaa9GG21112233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112233fooEv,_ZThn20_N3aaa9GG21112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112233barEv,_ZThn20_N3aaa9GG21112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21112233barEv,_ZThn28_N3aaa9GG21112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111223E[];
Class_Descriptor cd__ZN3aaa9GG2111223E = {  "_ZN3aaa9GG2111223E", // class name
  bases__ZN3aaa9GG2111223E, 6,
  &(vtc__ZN3aaa9GG2111223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111231  : ::aaa::EE211 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21112313fooEv
  ~GG2111231(); // tgen
  GG2111231(); // tgen
};
//SIG(1 _ZN3aaa9GG2111231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21112313fooEv");}
aaa::GG2111231 ::~GG2111231(){ note_dtor("_ZN3aaa9GG2111231E", this);} // tgen
aaa::GG2111231 ::GG2111231(){ note_ctor("_ZN3aaa9GG2111231E", this);} // tgen
}
static void Test__ZN3aaa9GG2111231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111231E, buf);
    ::aaa::GG2111231 *dp, &lv = *(dp=new (buf) ::aaa::GG2111231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111231E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2111231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2111231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2111231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111231E);
    dp->::aaa::GG2111231::~GG2111231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111231E(Test__ZN3aaa9GG2111231E, "_ZN3aaa9GG2111231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111231C1Ev();
extern void _ZN3aaa9GG2111231D1Ev();
Name_Map name_map__ZN3aaa9GG2111231E[] = {
  NSPAIR(_ZN3aaa9GG2111231C1Ev),
  NSPAIR(_ZN3aaa9GG2111231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2111231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21112313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21112313fooEv,_ZThn8_N3aaa9GG21112313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21112313fooEv,_ZThn20_N3aaa9GG21112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21112313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21112313fooEv,_ZThn8_N3aaa9GG21112313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112313fooEv,_ZThn20_N3aaa9GG21112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111231E[];
Class_Descriptor cd__ZN3aaa9GG2111231E = {  "_ZN3aaa9GG2111231E", // class name
  bases__ZN3aaa9GG2111231E, 6,
  &(vtc__ZN3aaa9GG2111231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111232  : ::aaa::EE211 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21112323barEv
  ~GG2111232(); // tgen
  GG2111232(); // tgen
};
//SIG(1 _ZN3aaa9GG2111232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21112323barEv");}
aaa::GG2111232 ::~GG2111232(){ note_dtor("_ZN3aaa9GG2111232E", this);} // tgen
aaa::GG2111232 ::GG2111232(){ note_ctor("_ZN3aaa9GG2111232E", this);} // tgen
}
static void Test__ZN3aaa9GG2111232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111232E, buf);
    ::aaa::GG2111232 *dp, &lv = *(dp=new (buf) ::aaa::GG2111232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111232E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2111232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2111232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2111232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111232E);
    dp->::aaa::GG2111232::~GG2111232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111232E(Test__ZN3aaa9GG2111232E, "_ZN3aaa9GG2111232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111232C1Ev();
extern void _ZN3aaa9GG2111232D1Ev();
Name_Map name_map__ZN3aaa9GG2111232E[] = {
  NSPAIR(_ZN3aaa9GG2111232C1Ev),
  NSPAIR(_ZN3aaa9GG2111232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2111232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111232E[];
extern void _ZN3aaa9GG21112323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21112323barEv,_ZThn20_N3aaa9GG21112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21112323barEv,_ZThn28_N3aaa9GG21112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21112323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112323barEv,_ZThn20_N3aaa9GG21112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21112323barEv,_ZThn28_N3aaa9GG21112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111232E[];
Class_Descriptor cd__ZN3aaa9GG2111232E = {  "_ZN3aaa9GG2111232E", // class name
  bases__ZN3aaa9GG2111232E, 6,
  &(vtc__ZN3aaa9GG2111232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111233  : ::aaa::EE211 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21112333fooEv
  virtual void  bar(); // _ZN3aaa9GG21112333barEv
  ~GG2111233(); // tgen
  GG2111233(); // tgen
};
//SIG(1 _ZN3aaa9GG2111233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21112333fooEv");}
void  aaa::GG2111233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21112333barEv");}
aaa::GG2111233 ::~GG2111233(){ note_dtor("_ZN3aaa9GG2111233E", this);} // tgen
aaa::GG2111233 ::GG2111233(){ note_ctor("_ZN3aaa9GG2111233E", this);} // tgen
}
static void Test__ZN3aaa9GG2111233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111233E, buf);
    ::aaa::GG2111233 *dp, &lv = *(dp=new (buf) ::aaa::GG2111233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111233E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2111233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2111233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2111233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111233E);
    dp->::aaa::GG2111233::~GG2111233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111233E(Test__ZN3aaa9GG2111233E, "_ZN3aaa9GG2111233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111233C1Ev();
extern void _ZN3aaa9GG2111233D1Ev();
Name_Map name_map__ZN3aaa9GG2111233E[] = {
  NSPAIR(_ZN3aaa9GG2111233C1Ev),
  NSPAIR(_ZN3aaa9GG2111233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2111233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111233E[];
extern void _ZN3aaa9GG21112333barEv();
extern void _ZN3aaa9GG21112333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21112333fooEv,_ZThn8_N3aaa9GG21112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21112333fooEv,_ZThn20_N3aaa9GG21112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21112333barEv,_ZThn20_N3aaa9GG21112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21112333barEv,_ZThn28_N3aaa9GG21112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21112333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21112333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21112333fooEv,_ZThn8_N3aaa9GG21112333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112333fooEv,_ZThn20_N3aaa9GG21112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21112333barEv,_ZThn20_N3aaa9GG21112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21112333barEv,_ZThn28_N3aaa9GG21112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111233E[];
Class_Descriptor cd__ZN3aaa9GG2111233E = {  "_ZN3aaa9GG2111233E", // class name
  bases__ZN3aaa9GG2111233E, 6,
  &(vtc__ZN3aaa9GG2111233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111311  : ::aaa::EE211 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21113113fooEv
  ~GG2111311(); // tgen
  GG2111311(); // tgen
};
//SIG(1 _ZN3aaa9GG2111311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21113113fooEv");}
aaa::GG2111311 ::~GG2111311(){ note_dtor("_ZN3aaa9GG2111311E", this);} // tgen
aaa::GG2111311 ::GG2111311(){ note_ctor("_ZN3aaa9GG2111311E", this);} // tgen
}
static void Test__ZN3aaa9GG2111311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111311E, buf);
    ::aaa::GG2111311 *dp, &lv = *(dp=new (buf) ::aaa::GG2111311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111311E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2111311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2111311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2111311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111311E);
    dp->::aaa::GG2111311::~GG2111311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111311E(Test__ZN3aaa9GG2111311E, "_ZN3aaa9GG2111311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111311C1Ev();
extern void _ZN3aaa9GG2111311D1Ev();
Name_Map name_map__ZN3aaa9GG2111311E[] = {
  NSPAIR(_ZN3aaa9GG2111311C1Ev),
  NSPAIR(_ZN3aaa9GG2111311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2111311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21113113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21113113fooEv,_ZThn8_N3aaa9GG21113113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21113113fooEv,_ZThn20_N3aaa9GG21113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113113fooEv,_ZThn28_N3aaa9GG21113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21113113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21113113fooEv,_ZThn8_N3aaa9GG21113113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113113fooEv,_ZThn20_N3aaa9GG21113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113113fooEv,_ZThn28_N3aaa9GG21113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111311E[];
Class_Descriptor cd__ZN3aaa9GG2111311E = {  "_ZN3aaa9GG2111311E", // class name
  bases__ZN3aaa9GG2111311E, 6,
  &(vtc__ZN3aaa9GG2111311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111312  : ::aaa::EE211 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21113123barEv
  ~GG2111312(); // tgen
  GG2111312(); // tgen
};
//SIG(1 _ZN3aaa9GG2111312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21113123barEv");}
aaa::GG2111312 ::~GG2111312(){ note_dtor("_ZN3aaa9GG2111312E", this);} // tgen
aaa::GG2111312 ::GG2111312(){ note_ctor("_ZN3aaa9GG2111312E", this);} // tgen
}
static void Test__ZN3aaa9GG2111312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111312E, buf);
    ::aaa::GG2111312 *dp, &lv = *(dp=new (buf) ::aaa::GG2111312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111312E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2111312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2111312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2111312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111312E);
    dp->::aaa::GG2111312::~GG2111312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111312E(Test__ZN3aaa9GG2111312E, "_ZN3aaa9GG2111312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111312C1Ev();
extern void _ZN3aaa9GG2111312D1Ev();
Name_Map name_map__ZN3aaa9GG2111312E[] = {
  NSPAIR(_ZN3aaa9GG2111312C1Ev),
  NSPAIR(_ZN3aaa9GG2111312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2111312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111312E[];
extern void _ZN3aaa9GG21113123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113123barEv,_ZThn28_N3aaa9GG21113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21113123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113123barEv,_ZThn28_N3aaa9GG21113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111312E[];
Class_Descriptor cd__ZN3aaa9GG2111312E = {  "_ZN3aaa9GG2111312E", // class name
  bases__ZN3aaa9GG2111312E, 6,
  &(vtc__ZN3aaa9GG2111312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111313  : ::aaa::EE211 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21113133fooEv
  virtual void  bar(); // _ZN3aaa9GG21113133barEv
  ~GG2111313(); // tgen
  GG2111313(); // tgen
};
//SIG(1 _ZN3aaa9GG2111313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21113133fooEv");}
void  aaa::GG2111313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21113133barEv");}
aaa::GG2111313 ::~GG2111313(){ note_dtor("_ZN3aaa9GG2111313E", this);} // tgen
aaa::GG2111313 ::GG2111313(){ note_ctor("_ZN3aaa9GG2111313E", this);} // tgen
}
static void Test__ZN3aaa9GG2111313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111313E, buf);
    ::aaa::GG2111313 *dp, &lv = *(dp=new (buf) ::aaa::GG2111313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111313E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2111313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2111313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2111313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111313E);
    dp->::aaa::GG2111313::~GG2111313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111313E(Test__ZN3aaa9GG2111313E, "_ZN3aaa9GG2111313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111313C1Ev();
extern void _ZN3aaa9GG2111313D1Ev();
Name_Map name_map__ZN3aaa9GG2111313E[] = {
  NSPAIR(_ZN3aaa9GG2111313C1Ev),
  NSPAIR(_ZN3aaa9GG2111313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2111313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111313E[];
extern void _ZN3aaa9GG21113133barEv();
extern void _ZN3aaa9GG21113133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21113133fooEv,_ZThn8_N3aaa9GG21113133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21113133fooEv,_ZThn20_N3aaa9GG21113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113133fooEv,_ZThn28_N3aaa9GG21113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113133barEv,_ZThn28_N3aaa9GG21113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21113133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21113133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21113133fooEv,_ZThn8_N3aaa9GG21113133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113133fooEv,_ZThn20_N3aaa9GG21113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113133fooEv,_ZThn28_N3aaa9GG21113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113133barEv,_ZThn28_N3aaa9GG21113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111313E[];
Class_Descriptor cd__ZN3aaa9GG2111313E = {  "_ZN3aaa9GG2111313E", // class name
  bases__ZN3aaa9GG2111313E, 6,
  &(vtc__ZN3aaa9GG2111313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111321  : ::aaa::EE211 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21113213fooEv
  ~GG2111321(); // tgen
  GG2111321(); // tgen
};
//SIG(1 _ZN3aaa9GG2111321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21113213fooEv");}
aaa::GG2111321 ::~GG2111321(){ note_dtor("_ZN3aaa9GG2111321E", this);} // tgen
aaa::GG2111321 ::GG2111321(){ note_ctor("_ZN3aaa9GG2111321E", this);} // tgen
}
static void Test__ZN3aaa9GG2111321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111321E, buf);
    ::aaa::GG2111321 *dp, &lv = *(dp=new (buf) ::aaa::GG2111321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111321E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2111321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2111321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2111321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111321E);
    dp->::aaa::GG2111321::~GG2111321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111321E(Test__ZN3aaa9GG2111321E, "_ZN3aaa9GG2111321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111321C1Ev();
extern void _ZN3aaa9GG2111321D1Ev();
Name_Map name_map__ZN3aaa9GG2111321E[] = {
  NSPAIR(_ZN3aaa9GG2111321C1Ev),
  NSPAIR(_ZN3aaa9GG2111321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2111321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21113213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21113213fooEv,_ZThn8_N3aaa9GG21113213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21113213fooEv,_ZThn20_N3aaa9GG21113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21113213fooEv,_ZThn28_N3aaa9GG21113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21113213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21113213fooEv,_ZThn8_N3aaa9GG21113213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113213fooEv,_ZThn20_N3aaa9GG21113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113213fooEv,_ZThn28_N3aaa9GG21113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111321E[];
Class_Descriptor cd__ZN3aaa9GG2111321E = {  "_ZN3aaa9GG2111321E", // class name
  bases__ZN3aaa9GG2111321E, 6,
  &(vtc__ZN3aaa9GG2111321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111322  : ::aaa::EE211 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21113223barEv
  ~GG2111322(); // tgen
  GG2111322(); // tgen
};
//SIG(1 _ZN3aaa9GG2111322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21113223barEv");}
aaa::GG2111322 ::~GG2111322(){ note_dtor("_ZN3aaa9GG2111322E", this);} // tgen
aaa::GG2111322 ::GG2111322(){ note_ctor("_ZN3aaa9GG2111322E", this);} // tgen
}
static void Test__ZN3aaa9GG2111322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111322E, buf);
    ::aaa::GG2111322 *dp, &lv = *(dp=new (buf) ::aaa::GG2111322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111322E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2111322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2111322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2111322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111322E);
    dp->::aaa::GG2111322::~GG2111322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111322E(Test__ZN3aaa9GG2111322E, "_ZN3aaa9GG2111322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111322C1Ev();
extern void _ZN3aaa9GG2111322D1Ev();
Name_Map name_map__ZN3aaa9GG2111322E[] = {
  NSPAIR(_ZN3aaa9GG2111322C1Ev),
  NSPAIR(_ZN3aaa9GG2111322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2111322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111322E[];
extern void _ZN3aaa9GG21113223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21113223barEv,_ZThn20_N3aaa9GG21113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21113223barEv,_ZThn28_N3aaa9GG21113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21113223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113223barEv,_ZThn20_N3aaa9GG21113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113223barEv,_ZThn28_N3aaa9GG21113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111322E[];
Class_Descriptor cd__ZN3aaa9GG2111322E = {  "_ZN3aaa9GG2111322E", // class name
  bases__ZN3aaa9GG2111322E, 6,
  &(vtc__ZN3aaa9GG2111322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111323  : ::aaa::EE211 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21113233fooEv
  virtual void  bar(); // _ZN3aaa9GG21113233barEv
  ~GG2111323(); // tgen
  GG2111323(); // tgen
};
//SIG(1 _ZN3aaa9GG2111323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21113233fooEv");}
void  aaa::GG2111323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21113233barEv");}
aaa::GG2111323 ::~GG2111323(){ note_dtor("_ZN3aaa9GG2111323E", this);} // tgen
aaa::GG2111323 ::GG2111323(){ note_ctor("_ZN3aaa9GG2111323E", this);} // tgen
}
static void Test__ZN3aaa9GG2111323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111323E, buf);
    ::aaa::GG2111323 *dp, &lv = *(dp=new (buf) ::aaa::GG2111323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111323E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2111323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2111323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2111323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111323E);
    dp->::aaa::GG2111323::~GG2111323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111323E(Test__ZN3aaa9GG2111323E, "_ZN3aaa9GG2111323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111323C1Ev();
extern void _ZN3aaa9GG2111323D1Ev();
Name_Map name_map__ZN3aaa9GG2111323E[] = {
  NSPAIR(_ZN3aaa9GG2111323C1Ev),
  NSPAIR(_ZN3aaa9GG2111323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2111323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111323E[];
extern void _ZN3aaa9GG21113233barEv();
extern void _ZN3aaa9GG21113233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21113233fooEv,_ZThn8_N3aaa9GG21113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21113233fooEv,_ZThn20_N3aaa9GG21113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21113233barEv,_ZThn20_N3aaa9GG21113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113233fooEv,_ZThn28_N3aaa9GG21113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113233barEv,_ZThn28_N3aaa9GG21113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21113233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21113233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21113233fooEv,_ZThn8_N3aaa9GG21113233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113233fooEv,_ZThn20_N3aaa9GG21113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113233barEv,_ZThn20_N3aaa9GG21113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113233fooEv,_ZThn28_N3aaa9GG21113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113233barEv,_ZThn28_N3aaa9GG21113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111323E[];
Class_Descriptor cd__ZN3aaa9GG2111323E = {  "_ZN3aaa9GG2111323E", // class name
  bases__ZN3aaa9GG2111323E, 6,
  &(vtc__ZN3aaa9GG2111323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111331  : ::aaa::EE211 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21113313fooEv
  ~GG2111331(); // tgen
  GG2111331(); // tgen
};
//SIG(1 _ZN3aaa9GG2111331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21113313fooEv");}
aaa::GG2111331 ::~GG2111331(){ note_dtor("_ZN3aaa9GG2111331E", this);} // tgen
aaa::GG2111331 ::GG2111331(){ note_ctor("_ZN3aaa9GG2111331E", this);} // tgen
}
static void Test__ZN3aaa9GG2111331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111331E, buf);
    ::aaa::GG2111331 *dp, &lv = *(dp=new (buf) ::aaa::GG2111331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111331E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2111331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2111331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2111331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111331E);
    dp->::aaa::GG2111331::~GG2111331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111331E(Test__ZN3aaa9GG2111331E, "_ZN3aaa9GG2111331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111331C1Ev();
extern void _ZN3aaa9GG2111331D1Ev();
Name_Map name_map__ZN3aaa9GG2111331E[] = {
  NSPAIR(_ZN3aaa9GG2111331C1Ev),
  NSPAIR(_ZN3aaa9GG2111331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2111331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21113313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21113313fooEv,_ZThn8_N3aaa9GG21113313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21113313fooEv,_ZThn20_N3aaa9GG21113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21113313fooEv,_ZThn28_N3aaa9GG21113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21113313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21113313fooEv,_ZThn8_N3aaa9GG21113313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113313fooEv,_ZThn20_N3aaa9GG21113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113313fooEv,_ZThn28_N3aaa9GG21113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111331E[];
Class_Descriptor cd__ZN3aaa9GG2111331E = {  "_ZN3aaa9GG2111331E", // class name
  bases__ZN3aaa9GG2111331E, 6,
  &(vtc__ZN3aaa9GG2111331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111332  : ::aaa::EE211 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21113323barEv
  ~GG2111332(); // tgen
  GG2111332(); // tgen
};
//SIG(1 _ZN3aaa9GG2111332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2111332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21113323barEv");}
aaa::GG2111332 ::~GG2111332(){ note_dtor("_ZN3aaa9GG2111332E", this);} // tgen
aaa::GG2111332 ::GG2111332(){ note_ctor("_ZN3aaa9GG2111332E", this);} // tgen
}
static void Test__ZN3aaa9GG2111332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111332E, buf);
    ::aaa::GG2111332 *dp, &lv = *(dp=new (buf) ::aaa::GG2111332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111332E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2111332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2111332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2111332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111332E);
    dp->::aaa::GG2111332::~GG2111332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111332E(Test__ZN3aaa9GG2111332E, "_ZN3aaa9GG2111332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111332C1Ev();
extern void _ZN3aaa9GG2111332D1Ev();
Name_Map name_map__ZN3aaa9GG2111332E[] = {
  NSPAIR(_ZN3aaa9GG2111332C1Ev),
  NSPAIR(_ZN3aaa9GG2111332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2111332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111332E[];
extern void _ZN3aaa9GG21113323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21113323barEv,_ZThn20_N3aaa9GG21113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113323barEv,_ZThn28_N3aaa9GG21113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21113323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113323barEv,_ZThn20_N3aaa9GG21113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113323barEv,_ZThn28_N3aaa9GG21113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111332E[];
Class_Descriptor cd__ZN3aaa9GG2111332E = {  "_ZN3aaa9GG2111332E", // class name
  bases__ZN3aaa9GG2111332E, 6,
  &(vtc__ZN3aaa9GG2111332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2111333  : ::aaa::EE211 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21113333fooEv
  virtual void  bar(); // _ZN3aaa9GG21113333barEv
  ~GG2111333(); // tgen
  GG2111333(); // tgen
};
//SIG(1 _ZN3aaa9GG2111333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2111333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21113333fooEv");}
void  aaa::GG2111333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21113333barEv");}
aaa::GG2111333 ::~GG2111333(){ note_dtor("_ZN3aaa9GG2111333E", this);} // tgen
aaa::GG2111333 ::GG2111333(){ note_ctor("_ZN3aaa9GG2111333E", this);} // tgen
}
static void Test__ZN3aaa9GG2111333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2111333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2111333E, buf);
    ::aaa::GG2111333 *dp, &lv = *(dp=new (buf) ::aaa::GG2111333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2111333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2111333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2111333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2111333E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2111333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2111333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2111333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2111333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2111333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2111333E);
    dp->::aaa::GG2111333::~GG2111333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2111333E(Test__ZN3aaa9GG2111333E, "_ZN3aaa9GG2111333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2111333C1Ev();
extern void _ZN3aaa9GG2111333D1Ev();
Name_Map name_map__ZN3aaa9GG2111333E[] = {
  NSPAIR(_ZN3aaa9GG2111333C1Ev),
  NSPAIR(_ZN3aaa9GG2111333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2111333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2111333E[];
extern void _ZN3aaa9GG21113333barEv();
extern void _ZN3aaa9GG21113333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21113333fooEv,_ZThn8_N3aaa9GG21113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21113333fooEv,_ZThn20_N3aaa9GG21113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21113333barEv,_ZThn20_N3aaa9GG21113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113333fooEv,_ZThn28_N3aaa9GG21113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21113333barEv,_ZThn28_N3aaa9GG21113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2111333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21113333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21113333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21113333fooEv,_ZThn8_N3aaa9GG21113333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113333fooEv,_ZThn20_N3aaa9GG21113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21113333barEv,_ZThn20_N3aaa9GG21113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113333fooEv,_ZThn28_N3aaa9GG21113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21113333barEv,_ZThn28_N3aaa9GG21113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2111333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2111333E[];
Class_Descriptor cd__ZN3aaa9GG2111333E = {  "_ZN3aaa9GG2111333E", // class name
  bases__ZN3aaa9GG2111333E, 6,
  &(vtc__ZN3aaa9GG2111333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2111333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2111333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112111  : ::aaa::EE211 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21121113fooEv
  ~GG2112111(); // tgen
  GG2112111(); // tgen
};
//SIG(1 _ZN3aaa9GG2112111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21121113fooEv");}
aaa::GG2112111 ::~GG2112111(){ note_dtor("_ZN3aaa9GG2112111E", this);} // tgen
aaa::GG2112111 ::GG2112111(){ note_ctor("_ZN3aaa9GG2112111E", this);} // tgen
}
static void Test__ZN3aaa9GG2112111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112111E, buf);
    ::aaa::GG2112111 *dp, &lv = *(dp=new (buf) ::aaa::GG2112111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112111E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2112111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2112111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2112111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112111E);
    dp->::aaa::GG2112111::~GG2112111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112111E(Test__ZN3aaa9GG2112111E, "_ZN3aaa9GG2112111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112111C1Ev();
extern void _ZN3aaa9GG2112111D1Ev();
Name_Map name_map__ZN3aaa9GG2112111E[] = {
  NSPAIR(_ZN3aaa9GG2112111C1Ev),
  NSPAIR(_ZN3aaa9GG2112111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2112111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21121113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21121113fooEv,_ZThn8_N3aaa9GG21121113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21121113fooEv,_ZThn20_N3aaa9GG21121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21121113fooEv,_ZThn28_N3aaa9GG21121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21121113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21121113fooEv,_ZThn8_N3aaa9GG21121113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121113fooEv,_ZThn20_N3aaa9GG21121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21121113fooEv,_ZThn28_N3aaa9GG21121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112111E[];
Class_Descriptor cd__ZN3aaa9GG2112111E = {  "_ZN3aaa9GG2112111E", // class name
  bases__ZN3aaa9GG2112111E, 6,
  &(vtc__ZN3aaa9GG2112111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112112  : ::aaa::EE211 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21121123barEv
  ~GG2112112(); // tgen
  GG2112112(); // tgen
};
//SIG(1 _ZN3aaa9GG2112112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21121123barEv");}
aaa::GG2112112 ::~GG2112112(){ note_dtor("_ZN3aaa9GG2112112E", this);} // tgen
aaa::GG2112112 ::GG2112112(){ note_ctor("_ZN3aaa9GG2112112E", this);} // tgen
}
static void Test__ZN3aaa9GG2112112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112112E, buf);
    ::aaa::GG2112112 *dp, &lv = *(dp=new (buf) ::aaa::GG2112112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112112E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2112112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2112112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2112112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112112E);
    dp->::aaa::GG2112112::~GG2112112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112112E(Test__ZN3aaa9GG2112112E, "_ZN3aaa9GG2112112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112112C1Ev();
extern void _ZN3aaa9GG2112112D1Ev();
Name_Map name_map__ZN3aaa9GG2112112E[] = {
  NSPAIR(_ZN3aaa9GG2112112C1Ev),
  NSPAIR(_ZN3aaa9GG2112112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2112112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112112E[];
extern void _ZN3aaa9GG21121123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21121123barEv,_ZThn20_N3aaa9GG21121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21121123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121123barEv,_ZThn20_N3aaa9GG21121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112112E[];
Class_Descriptor cd__ZN3aaa9GG2112112E = {  "_ZN3aaa9GG2112112E", // class name
  bases__ZN3aaa9GG2112112E, 6,
  &(vtc__ZN3aaa9GG2112112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112113  : ::aaa::EE211 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21121133fooEv
  virtual void  bar(); // _ZN3aaa9GG21121133barEv
  ~GG2112113(); // tgen
  GG2112113(); // tgen
};
//SIG(1 _ZN3aaa9GG2112113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21121133fooEv");}
void  aaa::GG2112113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21121133barEv");}
aaa::GG2112113 ::~GG2112113(){ note_dtor("_ZN3aaa9GG2112113E", this);} // tgen
aaa::GG2112113 ::GG2112113(){ note_ctor("_ZN3aaa9GG2112113E", this);} // tgen
}
static void Test__ZN3aaa9GG2112113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112113E, buf);
    ::aaa::GG2112113 *dp, &lv = *(dp=new (buf) ::aaa::GG2112113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112113E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2112113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2112113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2112113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112113E);
    dp->::aaa::GG2112113::~GG2112113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112113E(Test__ZN3aaa9GG2112113E, "_ZN3aaa9GG2112113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112113C1Ev();
extern void _ZN3aaa9GG2112113D1Ev();
Name_Map name_map__ZN3aaa9GG2112113E[] = {
  NSPAIR(_ZN3aaa9GG2112113C1Ev),
  NSPAIR(_ZN3aaa9GG2112113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2112113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112113E[];
extern void _ZN3aaa9GG21121133barEv();
extern void _ZN3aaa9GG21121133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21121133fooEv,_ZThn8_N3aaa9GG21121133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21121133barEv,_ZThn20_N3aaa9GG21121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21121133fooEv,_ZThn20_N3aaa9GG21121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21121133fooEv,_ZThn28_N3aaa9GG21121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21121133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21121133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21121133fooEv,_ZThn8_N3aaa9GG21121133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121133barEv,_ZThn20_N3aaa9GG21121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121133fooEv,_ZThn20_N3aaa9GG21121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21121133fooEv,_ZThn28_N3aaa9GG21121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112113E[];
Class_Descriptor cd__ZN3aaa9GG2112113E = {  "_ZN3aaa9GG2112113E", // class name
  bases__ZN3aaa9GG2112113E, 6,
  &(vtc__ZN3aaa9GG2112113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112121  : ::aaa::EE211 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21121213fooEv
  ~GG2112121(); // tgen
  GG2112121(); // tgen
};
//SIG(1 _ZN3aaa9GG2112121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21121213fooEv");}
aaa::GG2112121 ::~GG2112121(){ note_dtor("_ZN3aaa9GG2112121E", this);} // tgen
aaa::GG2112121 ::GG2112121(){ note_ctor("_ZN3aaa9GG2112121E", this);} // tgen
}
static void Test__ZN3aaa9GG2112121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112121E, buf);
    ::aaa::GG2112121 *dp, &lv = *(dp=new (buf) ::aaa::GG2112121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112121E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2112121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2112121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2112121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112121E);
    dp->::aaa::GG2112121::~GG2112121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112121E(Test__ZN3aaa9GG2112121E, "_ZN3aaa9GG2112121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112121C1Ev();
extern void _ZN3aaa9GG2112121D1Ev();
Name_Map name_map__ZN3aaa9GG2112121E[] = {
  NSPAIR(_ZN3aaa9GG2112121C1Ev),
  NSPAIR(_ZN3aaa9GG2112121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2112121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21121213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21121213fooEv,_ZThn8_N3aaa9GG21121213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21121213fooEv,_ZThn28_N3aaa9GG21121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21121213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21121213fooEv,_ZThn8_N3aaa9GG21121213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21121213fooEv,_ZThn28_N3aaa9GG21121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112121E[];
Class_Descriptor cd__ZN3aaa9GG2112121E = {  "_ZN3aaa9GG2112121E", // class name
  bases__ZN3aaa9GG2112121E, 6,
  &(vtc__ZN3aaa9GG2112121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112122  : ::aaa::EE211 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21121223barEv
  ~GG2112122(); // tgen
  GG2112122(); // tgen
};
//SIG(1 _ZN3aaa9GG2112122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21121223barEv");}
aaa::GG2112122 ::~GG2112122(){ note_dtor("_ZN3aaa9GG2112122E", this);} // tgen
aaa::GG2112122 ::GG2112122(){ note_ctor("_ZN3aaa9GG2112122E", this);} // tgen
}
static void Test__ZN3aaa9GG2112122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112122E, buf);
    ::aaa::GG2112122 *dp, &lv = *(dp=new (buf) ::aaa::GG2112122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112122E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2112122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2112122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2112122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112122E);
    dp->::aaa::GG2112122::~GG2112122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112122E(Test__ZN3aaa9GG2112122E, "_ZN3aaa9GG2112122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112122C1Ev();
extern void _ZN3aaa9GG2112122D1Ev();
Name_Map name_map__ZN3aaa9GG2112122E[] = {
  NSPAIR(_ZN3aaa9GG2112122C1Ev),
  NSPAIR(_ZN3aaa9GG2112122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2112122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112122E[];
extern void _ZN3aaa9GG21121223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21121223barEv,_ZThn20_N3aaa9GG21121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21121223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121223barEv,_ZThn20_N3aaa9GG21121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112122E[];
Class_Descriptor cd__ZN3aaa9GG2112122E = {  "_ZN3aaa9GG2112122E", // class name
  bases__ZN3aaa9GG2112122E, 6,
  &(vtc__ZN3aaa9GG2112122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112123  : ::aaa::EE211 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21121233fooEv
  virtual void  bar(); // _ZN3aaa9GG21121233barEv
  ~GG2112123(); // tgen
  GG2112123(); // tgen
};
//SIG(1 _ZN3aaa9GG2112123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21121233fooEv");}
void  aaa::GG2112123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21121233barEv");}
aaa::GG2112123 ::~GG2112123(){ note_dtor("_ZN3aaa9GG2112123E", this);} // tgen
aaa::GG2112123 ::GG2112123(){ note_ctor("_ZN3aaa9GG2112123E", this);} // tgen
}
static void Test__ZN3aaa9GG2112123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112123E, buf);
    ::aaa::GG2112123 *dp, &lv = *(dp=new (buf) ::aaa::GG2112123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112123E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2112123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2112123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2112123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112123E);
    dp->::aaa::GG2112123::~GG2112123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112123E(Test__ZN3aaa9GG2112123E, "_ZN3aaa9GG2112123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112123C1Ev();
extern void _ZN3aaa9GG2112123D1Ev();
Name_Map name_map__ZN3aaa9GG2112123E[] = {
  NSPAIR(_ZN3aaa9GG2112123C1Ev),
  NSPAIR(_ZN3aaa9GG2112123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2112123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112123E[];
extern void _ZN3aaa9GG21121233barEv();
extern void _ZN3aaa9GG21121233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21121233fooEv,_ZThn8_N3aaa9GG21121233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21121233barEv,_ZThn20_N3aaa9GG21121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21121233fooEv,_ZThn28_N3aaa9GG21121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21121233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21121233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21121233fooEv,_ZThn8_N3aaa9GG21121233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121233barEv,_ZThn20_N3aaa9GG21121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21121233fooEv,_ZThn28_N3aaa9GG21121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112123E[];
Class_Descriptor cd__ZN3aaa9GG2112123E = {  "_ZN3aaa9GG2112123E", // class name
  bases__ZN3aaa9GG2112123E, 6,
  &(vtc__ZN3aaa9GG2112123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112131  : ::aaa::EE211 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21121313fooEv
  ~GG2112131(); // tgen
  GG2112131(); // tgen
};
//SIG(1 _ZN3aaa9GG2112131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21121313fooEv");}
aaa::GG2112131 ::~GG2112131(){ note_dtor("_ZN3aaa9GG2112131E", this);} // tgen
aaa::GG2112131 ::GG2112131(){ note_ctor("_ZN3aaa9GG2112131E", this);} // tgen
}
static void Test__ZN3aaa9GG2112131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112131E, buf);
    ::aaa::GG2112131 *dp, &lv = *(dp=new (buf) ::aaa::GG2112131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112131E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2112131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2112131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2112131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112131E);
    dp->::aaa::GG2112131::~GG2112131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112131E(Test__ZN3aaa9GG2112131E, "_ZN3aaa9GG2112131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112131C1Ev();
extern void _ZN3aaa9GG2112131D1Ev();
Name_Map name_map__ZN3aaa9GG2112131E[] = {
  NSPAIR(_ZN3aaa9GG2112131C1Ev),
  NSPAIR(_ZN3aaa9GG2112131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2112131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21121313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21121313fooEv,_ZThn8_N3aaa9GG21121313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21121313fooEv,_ZThn20_N3aaa9GG21121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21121313fooEv,_ZThn28_N3aaa9GG21121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21121313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21121313fooEv,_ZThn8_N3aaa9GG21121313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121313fooEv,_ZThn20_N3aaa9GG21121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21121313fooEv,_ZThn28_N3aaa9GG21121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112131E[];
Class_Descriptor cd__ZN3aaa9GG2112131E = {  "_ZN3aaa9GG2112131E", // class name
  bases__ZN3aaa9GG2112131E, 6,
  &(vtc__ZN3aaa9GG2112131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112132  : ::aaa::EE211 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21121323barEv
  ~GG2112132(); // tgen
  GG2112132(); // tgen
};
//SIG(1 _ZN3aaa9GG2112132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21121323barEv");}
aaa::GG2112132 ::~GG2112132(){ note_dtor("_ZN3aaa9GG2112132E", this);} // tgen
aaa::GG2112132 ::GG2112132(){ note_ctor("_ZN3aaa9GG2112132E", this);} // tgen
}
static void Test__ZN3aaa9GG2112132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112132E, buf);
    ::aaa::GG2112132 *dp, &lv = *(dp=new (buf) ::aaa::GG2112132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112132E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2112132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2112132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2112132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112132E);
    dp->::aaa::GG2112132::~GG2112132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112132E(Test__ZN3aaa9GG2112132E, "_ZN3aaa9GG2112132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112132C1Ev();
extern void _ZN3aaa9GG2112132D1Ev();
Name_Map name_map__ZN3aaa9GG2112132E[] = {
  NSPAIR(_ZN3aaa9GG2112132C1Ev),
  NSPAIR(_ZN3aaa9GG2112132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2112132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112132E[];
extern void _ZN3aaa9GG21121323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21121323barEv,_ZThn20_N3aaa9GG21121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21121323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121323barEv,_ZThn20_N3aaa9GG21121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112132E[];
Class_Descriptor cd__ZN3aaa9GG2112132E = {  "_ZN3aaa9GG2112132E", // class name
  bases__ZN3aaa9GG2112132E, 6,
  &(vtc__ZN3aaa9GG2112132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112133  : ::aaa::EE211 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21121333fooEv
  virtual void  bar(); // _ZN3aaa9GG21121333barEv
  ~GG2112133(); // tgen
  GG2112133(); // tgen
};
//SIG(1 _ZN3aaa9GG2112133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21121333fooEv");}
void  aaa::GG2112133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21121333barEv");}
aaa::GG2112133 ::~GG2112133(){ note_dtor("_ZN3aaa9GG2112133E", this);} // tgen
aaa::GG2112133 ::GG2112133(){ note_ctor("_ZN3aaa9GG2112133E", this);} // tgen
}
static void Test__ZN3aaa9GG2112133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112133E, buf);
    ::aaa::GG2112133 *dp, &lv = *(dp=new (buf) ::aaa::GG2112133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112133E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2112133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2112133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2112133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112133E);
    dp->::aaa::GG2112133::~GG2112133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112133E(Test__ZN3aaa9GG2112133E, "_ZN3aaa9GG2112133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112133C1Ev();
extern void _ZN3aaa9GG2112133D1Ev();
Name_Map name_map__ZN3aaa9GG2112133E[] = {
  NSPAIR(_ZN3aaa9GG2112133C1Ev),
  NSPAIR(_ZN3aaa9GG2112133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2112133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112133E[];
extern void _ZN3aaa9GG21121333barEv();
extern void _ZN3aaa9GG21121333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21121333fooEv,_ZThn8_N3aaa9GG21121333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21121333barEv,_ZThn20_N3aaa9GG21121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21121333fooEv,_ZThn20_N3aaa9GG21121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21121333fooEv,_ZThn28_N3aaa9GG21121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21121333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21121333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21121333fooEv,_ZThn8_N3aaa9GG21121333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121333barEv,_ZThn20_N3aaa9GG21121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21121333fooEv,_ZThn20_N3aaa9GG21121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21121333fooEv,_ZThn28_N3aaa9GG21121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112133E[];
Class_Descriptor cd__ZN3aaa9GG2112133E = {  "_ZN3aaa9GG2112133E", // class name
  bases__ZN3aaa9GG2112133E, 6,
  &(vtc__ZN3aaa9GG2112133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112211  : ::aaa::EE211 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21122113fooEv
  ~GG2112211(); // tgen
  GG2112211(); // tgen
};
//SIG(1 _ZN3aaa9GG2112211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21122113fooEv");}
aaa::GG2112211 ::~GG2112211(){ note_dtor("_ZN3aaa9GG2112211E", this);} // tgen
aaa::GG2112211 ::GG2112211(){ note_ctor("_ZN3aaa9GG2112211E", this);} // tgen
}
static void Test__ZN3aaa9GG2112211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112211E, buf);
    ::aaa::GG2112211 *dp, &lv = *(dp=new (buf) ::aaa::GG2112211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112211E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2112211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2112211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2112211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112211E);
    dp->::aaa::GG2112211::~GG2112211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112211E(Test__ZN3aaa9GG2112211E, "_ZN3aaa9GG2112211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112211C1Ev();
extern void _ZN3aaa9GG2112211D1Ev();
Name_Map name_map__ZN3aaa9GG2112211E[] = {
  NSPAIR(_ZN3aaa9GG2112211C1Ev),
  NSPAIR(_ZN3aaa9GG2112211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2112211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21122113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21122113fooEv,_ZThn8_N3aaa9GG21122113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21122113fooEv,_ZThn20_N3aaa9GG21122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21122113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21122113fooEv,_ZThn8_N3aaa9GG21122113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122113fooEv,_ZThn20_N3aaa9GG21122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112211E[];
Class_Descriptor cd__ZN3aaa9GG2112211E = {  "_ZN3aaa9GG2112211E", // class name
  bases__ZN3aaa9GG2112211E, 6,
  &(vtc__ZN3aaa9GG2112211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112212  : ::aaa::EE211 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21122123barEv
  ~GG2112212(); // tgen
  GG2112212(); // tgen
};
//SIG(1 _ZN3aaa9GG2112212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21122123barEv");}
aaa::GG2112212 ::~GG2112212(){ note_dtor("_ZN3aaa9GG2112212E", this);} // tgen
aaa::GG2112212 ::GG2112212(){ note_ctor("_ZN3aaa9GG2112212E", this);} // tgen
}
static void Test__ZN3aaa9GG2112212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112212E, buf);
    ::aaa::GG2112212 *dp, &lv = *(dp=new (buf) ::aaa::GG2112212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112212E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2112212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2112212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2112212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112212E);
    dp->::aaa::GG2112212::~GG2112212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112212E(Test__ZN3aaa9GG2112212E, "_ZN3aaa9GG2112212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112212C1Ev();
extern void _ZN3aaa9GG2112212D1Ev();
Name_Map name_map__ZN3aaa9GG2112212E[] = {
  NSPAIR(_ZN3aaa9GG2112212C1Ev),
  NSPAIR(_ZN3aaa9GG2112212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2112212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112212E[];
extern void _ZN3aaa9GG21122123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21122123barEv,_ZThn20_N3aaa9GG21122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21122123barEv,_ZThn28_N3aaa9GG21122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21122123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122123barEv,_ZThn20_N3aaa9GG21122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21122123barEv,_ZThn28_N3aaa9GG21122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112212E[];
Class_Descriptor cd__ZN3aaa9GG2112212E = {  "_ZN3aaa9GG2112212E", // class name
  bases__ZN3aaa9GG2112212E, 6,
  &(vtc__ZN3aaa9GG2112212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112213  : ::aaa::EE211 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21122133fooEv
  virtual void  bar(); // _ZN3aaa9GG21122133barEv
  ~GG2112213(); // tgen
  GG2112213(); // tgen
};
//SIG(1 _ZN3aaa9GG2112213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21122133fooEv");}
void  aaa::GG2112213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21122133barEv");}
aaa::GG2112213 ::~GG2112213(){ note_dtor("_ZN3aaa9GG2112213E", this);} // tgen
aaa::GG2112213 ::GG2112213(){ note_ctor("_ZN3aaa9GG2112213E", this);} // tgen
}
static void Test__ZN3aaa9GG2112213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112213E, buf);
    ::aaa::GG2112213 *dp, &lv = *(dp=new (buf) ::aaa::GG2112213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112213E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2112213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2112213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2112213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112213E);
    dp->::aaa::GG2112213::~GG2112213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112213E(Test__ZN3aaa9GG2112213E, "_ZN3aaa9GG2112213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112213C1Ev();
extern void _ZN3aaa9GG2112213D1Ev();
Name_Map name_map__ZN3aaa9GG2112213E[] = {
  NSPAIR(_ZN3aaa9GG2112213C1Ev),
  NSPAIR(_ZN3aaa9GG2112213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2112213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112213E[];
extern void _ZN3aaa9GG21122133barEv();
extern void _ZN3aaa9GG21122133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21122133fooEv,_ZThn8_N3aaa9GG21122133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21122133barEv,_ZThn20_N3aaa9GG21122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21122133fooEv,_ZThn20_N3aaa9GG21122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21122133barEv,_ZThn28_N3aaa9GG21122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21122133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21122133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21122133fooEv,_ZThn8_N3aaa9GG21122133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122133barEv,_ZThn20_N3aaa9GG21122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122133fooEv,_ZThn20_N3aaa9GG21122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21122133barEv,_ZThn28_N3aaa9GG21122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112213E[];
Class_Descriptor cd__ZN3aaa9GG2112213E = {  "_ZN3aaa9GG2112213E", // class name
  bases__ZN3aaa9GG2112213E, 6,
  &(vtc__ZN3aaa9GG2112213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112221  : ::aaa::EE211 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21122213fooEv
  ~GG2112221(); // tgen
  GG2112221(); // tgen
};
//SIG(1 _ZN3aaa9GG2112221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21122213fooEv");}
aaa::GG2112221 ::~GG2112221(){ note_dtor("_ZN3aaa9GG2112221E", this);} // tgen
aaa::GG2112221 ::GG2112221(){ note_ctor("_ZN3aaa9GG2112221E", this);} // tgen
}
static void Test__ZN3aaa9GG2112221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112221E, buf);
    ::aaa::GG2112221 *dp, &lv = *(dp=new (buf) ::aaa::GG2112221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112221E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2112221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2112221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2112221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112221E);
    dp->::aaa::GG2112221::~GG2112221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112221E(Test__ZN3aaa9GG2112221E, "_ZN3aaa9GG2112221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112221C1Ev();
extern void _ZN3aaa9GG2112221D1Ev();
Name_Map name_map__ZN3aaa9GG2112221E[] = {
  NSPAIR(_ZN3aaa9GG2112221C1Ev),
  NSPAIR(_ZN3aaa9GG2112221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2112221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21122213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21122213fooEv,_ZThn8_N3aaa9GG21122213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21122213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21122213fooEv,_ZThn8_N3aaa9GG21122213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112221E[];
Class_Descriptor cd__ZN3aaa9GG2112221E = {  "_ZN3aaa9GG2112221E", // class name
  bases__ZN3aaa9GG2112221E, 6,
  &(vtc__ZN3aaa9GG2112221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112222  : ::aaa::EE211 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21122223barEv
  ~GG2112222(); // tgen
  GG2112222(); // tgen
};
//SIG(1 _ZN3aaa9GG2112222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21122223barEv");}
aaa::GG2112222 ::~GG2112222(){ note_dtor("_ZN3aaa9GG2112222E", this);} // tgen
aaa::GG2112222 ::GG2112222(){ note_ctor("_ZN3aaa9GG2112222E", this);} // tgen
}
static void Test__ZN3aaa9GG2112222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112222E, buf);
    ::aaa::GG2112222 *dp, &lv = *(dp=new (buf) ::aaa::GG2112222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112222E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2112222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2112222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2112222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112222E);
    dp->::aaa::GG2112222::~GG2112222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112222E(Test__ZN3aaa9GG2112222E, "_ZN3aaa9GG2112222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112222C1Ev();
extern void _ZN3aaa9GG2112222D1Ev();
Name_Map name_map__ZN3aaa9GG2112222E[] = {
  NSPAIR(_ZN3aaa9GG2112222C1Ev),
  NSPAIR(_ZN3aaa9GG2112222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2112222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112222E[];
extern void _ZN3aaa9GG21122223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21122223barEv,_ZThn20_N3aaa9GG21122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21122223barEv,_ZThn28_N3aaa9GG21122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21122223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122223barEv,_ZThn20_N3aaa9GG21122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21122223barEv,_ZThn28_N3aaa9GG21122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112222E[];
Class_Descriptor cd__ZN3aaa9GG2112222E = {  "_ZN3aaa9GG2112222E", // class name
  bases__ZN3aaa9GG2112222E, 6,
  &(vtc__ZN3aaa9GG2112222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112223  : ::aaa::EE211 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21122233fooEv
  virtual void  bar(); // _ZN3aaa9GG21122233barEv
  ~GG2112223(); // tgen
  GG2112223(); // tgen
};
//SIG(1 _ZN3aaa9GG2112223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21122233fooEv");}
void  aaa::GG2112223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21122233barEv");}
aaa::GG2112223 ::~GG2112223(){ note_dtor("_ZN3aaa9GG2112223E", this);} // tgen
aaa::GG2112223 ::GG2112223(){ note_ctor("_ZN3aaa9GG2112223E", this);} // tgen
}
static void Test__ZN3aaa9GG2112223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112223E, buf);
    ::aaa::GG2112223 *dp, &lv = *(dp=new (buf) ::aaa::GG2112223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112223E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2112223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2112223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2112223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112223E);
    dp->::aaa::GG2112223::~GG2112223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112223E(Test__ZN3aaa9GG2112223E, "_ZN3aaa9GG2112223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112223C1Ev();
extern void _ZN3aaa9GG2112223D1Ev();
Name_Map name_map__ZN3aaa9GG2112223E[] = {
  NSPAIR(_ZN3aaa9GG2112223C1Ev),
  NSPAIR(_ZN3aaa9GG2112223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2112223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112223E[];
extern void _ZN3aaa9GG21122233barEv();
extern void _ZN3aaa9GG21122233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21122233fooEv,_ZThn8_N3aaa9GG21122233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21122233barEv,_ZThn20_N3aaa9GG21122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21122233barEv,_ZThn28_N3aaa9GG21122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21122233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21122233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21122233fooEv,_ZThn8_N3aaa9GG21122233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122233barEv,_ZThn20_N3aaa9GG21122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21122233barEv,_ZThn28_N3aaa9GG21122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112223E[];
Class_Descriptor cd__ZN3aaa9GG2112223E = {  "_ZN3aaa9GG2112223E", // class name
  bases__ZN3aaa9GG2112223E, 6,
  &(vtc__ZN3aaa9GG2112223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112231  : ::aaa::EE211 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21122313fooEv
  ~GG2112231(); // tgen
  GG2112231(); // tgen
};
//SIG(1 _ZN3aaa9GG2112231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21122313fooEv");}
aaa::GG2112231 ::~GG2112231(){ note_dtor("_ZN3aaa9GG2112231E", this);} // tgen
aaa::GG2112231 ::GG2112231(){ note_ctor("_ZN3aaa9GG2112231E", this);} // tgen
}
static void Test__ZN3aaa9GG2112231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112231E, buf);
    ::aaa::GG2112231 *dp, &lv = *(dp=new (buf) ::aaa::GG2112231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112231E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2112231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2112231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2112231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112231E);
    dp->::aaa::GG2112231::~GG2112231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112231E(Test__ZN3aaa9GG2112231E, "_ZN3aaa9GG2112231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112231C1Ev();
extern void _ZN3aaa9GG2112231D1Ev();
Name_Map name_map__ZN3aaa9GG2112231E[] = {
  NSPAIR(_ZN3aaa9GG2112231C1Ev),
  NSPAIR(_ZN3aaa9GG2112231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2112231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21122313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21122313fooEv,_ZThn8_N3aaa9GG21122313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21122313fooEv,_ZThn20_N3aaa9GG21122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21122313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21122313fooEv,_ZThn8_N3aaa9GG21122313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122313fooEv,_ZThn20_N3aaa9GG21122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112231E[];
Class_Descriptor cd__ZN3aaa9GG2112231E = {  "_ZN3aaa9GG2112231E", // class name
  bases__ZN3aaa9GG2112231E, 6,
  &(vtc__ZN3aaa9GG2112231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112232  : ::aaa::EE211 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21122323barEv
  ~GG2112232(); // tgen
  GG2112232(); // tgen
};
//SIG(1 _ZN3aaa9GG2112232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21122323barEv");}
aaa::GG2112232 ::~GG2112232(){ note_dtor("_ZN3aaa9GG2112232E", this);} // tgen
aaa::GG2112232 ::GG2112232(){ note_ctor("_ZN3aaa9GG2112232E", this);} // tgen
}
static void Test__ZN3aaa9GG2112232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112232E, buf);
    ::aaa::GG2112232 *dp, &lv = *(dp=new (buf) ::aaa::GG2112232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112232E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2112232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2112232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2112232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112232E);
    dp->::aaa::GG2112232::~GG2112232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112232E(Test__ZN3aaa9GG2112232E, "_ZN3aaa9GG2112232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112232C1Ev();
extern void _ZN3aaa9GG2112232D1Ev();
Name_Map name_map__ZN3aaa9GG2112232E[] = {
  NSPAIR(_ZN3aaa9GG2112232C1Ev),
  NSPAIR(_ZN3aaa9GG2112232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2112232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112232E[];
extern void _ZN3aaa9GG21122323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21122323barEv,_ZThn20_N3aaa9GG21122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21122323barEv,_ZThn28_N3aaa9GG21122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21122323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122323barEv,_ZThn20_N3aaa9GG21122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21122323barEv,_ZThn28_N3aaa9GG21122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112232E[];
Class_Descriptor cd__ZN3aaa9GG2112232E = {  "_ZN3aaa9GG2112232E", // class name
  bases__ZN3aaa9GG2112232E, 6,
  &(vtc__ZN3aaa9GG2112232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112233  : ::aaa::EE211 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21122333fooEv
  virtual void  bar(); // _ZN3aaa9GG21122333barEv
  ~GG2112233(); // tgen
  GG2112233(); // tgen
};
//SIG(1 _ZN3aaa9GG2112233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21122333fooEv");}
void  aaa::GG2112233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21122333barEv");}
aaa::GG2112233 ::~GG2112233(){ note_dtor("_ZN3aaa9GG2112233E", this);} // tgen
aaa::GG2112233 ::GG2112233(){ note_ctor("_ZN3aaa9GG2112233E", this);} // tgen
}
static void Test__ZN3aaa9GG2112233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112233E, buf);
    ::aaa::GG2112233 *dp, &lv = *(dp=new (buf) ::aaa::GG2112233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112233E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2112233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2112233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2112233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112233E);
    dp->::aaa::GG2112233::~GG2112233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112233E(Test__ZN3aaa9GG2112233E, "_ZN3aaa9GG2112233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112233C1Ev();
extern void _ZN3aaa9GG2112233D1Ev();
Name_Map name_map__ZN3aaa9GG2112233E[] = {
  NSPAIR(_ZN3aaa9GG2112233C1Ev),
  NSPAIR(_ZN3aaa9GG2112233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2112233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112233E[];
extern void _ZN3aaa9GG21122333barEv();
extern void _ZN3aaa9GG21122333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21122333fooEv,_ZThn8_N3aaa9GG21122333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21122333barEv,_ZThn20_N3aaa9GG21122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21122333fooEv,_ZThn20_N3aaa9GG21122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21122333barEv,_ZThn28_N3aaa9GG21122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21122333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21122333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21122333fooEv,_ZThn8_N3aaa9GG21122333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122333barEv,_ZThn20_N3aaa9GG21122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21122333fooEv,_ZThn20_N3aaa9GG21122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21122333barEv,_ZThn28_N3aaa9GG21122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112233E[];
Class_Descriptor cd__ZN3aaa9GG2112233E = {  "_ZN3aaa9GG2112233E", // class name
  bases__ZN3aaa9GG2112233E, 6,
  &(vtc__ZN3aaa9GG2112233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112311  : ::aaa::EE211 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21123113fooEv
  ~GG2112311(); // tgen
  GG2112311(); // tgen
};
//SIG(1 _ZN3aaa9GG2112311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21123113fooEv");}
aaa::GG2112311 ::~GG2112311(){ note_dtor("_ZN3aaa9GG2112311E", this);} // tgen
aaa::GG2112311 ::GG2112311(){ note_ctor("_ZN3aaa9GG2112311E", this);} // tgen
}
static void Test__ZN3aaa9GG2112311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112311E, buf);
    ::aaa::GG2112311 *dp, &lv = *(dp=new (buf) ::aaa::GG2112311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112311E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2112311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2112311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2112311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112311E);
    dp->::aaa::GG2112311::~GG2112311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112311E(Test__ZN3aaa9GG2112311E, "_ZN3aaa9GG2112311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112311C1Ev();
extern void _ZN3aaa9GG2112311D1Ev();
Name_Map name_map__ZN3aaa9GG2112311E[] = {
  NSPAIR(_ZN3aaa9GG2112311C1Ev),
  NSPAIR(_ZN3aaa9GG2112311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2112311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21123113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21123113fooEv,_ZThn8_N3aaa9GG21123113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21123113fooEv,_ZThn20_N3aaa9GG21123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123113fooEv,_ZThn28_N3aaa9GG21123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21123113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21123113fooEv,_ZThn8_N3aaa9GG21123113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123113fooEv,_ZThn20_N3aaa9GG21123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123113fooEv,_ZThn28_N3aaa9GG21123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112311E[];
Class_Descriptor cd__ZN3aaa9GG2112311E = {  "_ZN3aaa9GG2112311E", // class name
  bases__ZN3aaa9GG2112311E, 6,
  &(vtc__ZN3aaa9GG2112311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112312  : ::aaa::EE211 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21123123barEv
  ~GG2112312(); // tgen
  GG2112312(); // tgen
};
//SIG(1 _ZN3aaa9GG2112312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21123123barEv");}
aaa::GG2112312 ::~GG2112312(){ note_dtor("_ZN3aaa9GG2112312E", this);} // tgen
aaa::GG2112312 ::GG2112312(){ note_ctor("_ZN3aaa9GG2112312E", this);} // tgen
}
static void Test__ZN3aaa9GG2112312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112312E, buf);
    ::aaa::GG2112312 *dp, &lv = *(dp=new (buf) ::aaa::GG2112312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112312E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2112312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2112312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2112312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112312E);
    dp->::aaa::GG2112312::~GG2112312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112312E(Test__ZN3aaa9GG2112312E, "_ZN3aaa9GG2112312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112312C1Ev();
extern void _ZN3aaa9GG2112312D1Ev();
Name_Map name_map__ZN3aaa9GG2112312E[] = {
  NSPAIR(_ZN3aaa9GG2112312C1Ev),
  NSPAIR(_ZN3aaa9GG2112312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2112312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112312E[];
extern void _ZN3aaa9GG21123123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21123123barEv,_ZThn20_N3aaa9GG21123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123123barEv,_ZThn28_N3aaa9GG21123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21123123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123123barEv,_ZThn20_N3aaa9GG21123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123123barEv,_ZThn28_N3aaa9GG21123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112312E[];
Class_Descriptor cd__ZN3aaa9GG2112312E = {  "_ZN3aaa9GG2112312E", // class name
  bases__ZN3aaa9GG2112312E, 6,
  &(vtc__ZN3aaa9GG2112312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112313  : ::aaa::EE211 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21123133fooEv
  virtual void  bar(); // _ZN3aaa9GG21123133barEv
  ~GG2112313(); // tgen
  GG2112313(); // tgen
};
//SIG(1 _ZN3aaa9GG2112313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21123133fooEv");}
void  aaa::GG2112313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21123133barEv");}
aaa::GG2112313 ::~GG2112313(){ note_dtor("_ZN3aaa9GG2112313E", this);} // tgen
aaa::GG2112313 ::GG2112313(){ note_ctor("_ZN3aaa9GG2112313E", this);} // tgen
}
static void Test__ZN3aaa9GG2112313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112313E, buf);
    ::aaa::GG2112313 *dp, &lv = *(dp=new (buf) ::aaa::GG2112313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112313E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2112313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2112313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2112313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112313E);
    dp->::aaa::GG2112313::~GG2112313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112313E(Test__ZN3aaa9GG2112313E, "_ZN3aaa9GG2112313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112313C1Ev();
extern void _ZN3aaa9GG2112313D1Ev();
Name_Map name_map__ZN3aaa9GG2112313E[] = {
  NSPAIR(_ZN3aaa9GG2112313C1Ev),
  NSPAIR(_ZN3aaa9GG2112313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2112313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112313E[];
extern void _ZN3aaa9GG21123133barEv();
extern void _ZN3aaa9GG21123133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21123133fooEv,_ZThn8_N3aaa9GG21123133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21123133barEv,_ZThn20_N3aaa9GG21123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21123133fooEv,_ZThn20_N3aaa9GG21123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123133fooEv,_ZThn28_N3aaa9GG21123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123133barEv,_ZThn28_N3aaa9GG21123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21123133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21123133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21123133fooEv,_ZThn8_N3aaa9GG21123133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123133barEv,_ZThn20_N3aaa9GG21123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123133fooEv,_ZThn20_N3aaa9GG21123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123133fooEv,_ZThn28_N3aaa9GG21123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123133barEv,_ZThn28_N3aaa9GG21123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112313E[];
Class_Descriptor cd__ZN3aaa9GG2112313E = {  "_ZN3aaa9GG2112313E", // class name
  bases__ZN3aaa9GG2112313E, 6,
  &(vtc__ZN3aaa9GG2112313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112321  : ::aaa::EE211 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21123213fooEv
  ~GG2112321(); // tgen
  GG2112321(); // tgen
};
//SIG(1 _ZN3aaa9GG2112321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21123213fooEv");}
aaa::GG2112321 ::~GG2112321(){ note_dtor("_ZN3aaa9GG2112321E", this);} // tgen
aaa::GG2112321 ::GG2112321(){ note_ctor("_ZN3aaa9GG2112321E", this);} // tgen
}
static void Test__ZN3aaa9GG2112321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112321E, buf);
    ::aaa::GG2112321 *dp, &lv = *(dp=new (buf) ::aaa::GG2112321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112321E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2112321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2112321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2112321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112321E);
    dp->::aaa::GG2112321::~GG2112321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112321E(Test__ZN3aaa9GG2112321E, "_ZN3aaa9GG2112321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112321C1Ev();
extern void _ZN3aaa9GG2112321D1Ev();
Name_Map name_map__ZN3aaa9GG2112321E[] = {
  NSPAIR(_ZN3aaa9GG2112321C1Ev),
  NSPAIR(_ZN3aaa9GG2112321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2112321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21123213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21123213fooEv,_ZThn8_N3aaa9GG21123213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21123213fooEv,_ZThn28_N3aaa9GG21123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21123213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21123213fooEv,_ZThn8_N3aaa9GG21123213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123213fooEv,_ZThn28_N3aaa9GG21123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112321E[];
Class_Descriptor cd__ZN3aaa9GG2112321E = {  "_ZN3aaa9GG2112321E", // class name
  bases__ZN3aaa9GG2112321E, 6,
  &(vtc__ZN3aaa9GG2112321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112322  : ::aaa::EE211 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21123223barEv
  ~GG2112322(); // tgen
  GG2112322(); // tgen
};
//SIG(1 _ZN3aaa9GG2112322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21123223barEv");}
aaa::GG2112322 ::~GG2112322(){ note_dtor("_ZN3aaa9GG2112322E", this);} // tgen
aaa::GG2112322 ::GG2112322(){ note_ctor("_ZN3aaa9GG2112322E", this);} // tgen
}
static void Test__ZN3aaa9GG2112322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112322E, buf);
    ::aaa::GG2112322 *dp, &lv = *(dp=new (buf) ::aaa::GG2112322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112322E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2112322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2112322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2112322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112322E);
    dp->::aaa::GG2112322::~GG2112322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112322E(Test__ZN3aaa9GG2112322E, "_ZN3aaa9GG2112322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112322C1Ev();
extern void _ZN3aaa9GG2112322D1Ev();
Name_Map name_map__ZN3aaa9GG2112322E[] = {
  NSPAIR(_ZN3aaa9GG2112322C1Ev),
  NSPAIR(_ZN3aaa9GG2112322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2112322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112322E[];
extern void _ZN3aaa9GG21123223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21123223barEv,_ZThn20_N3aaa9GG21123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21123223barEv,_ZThn28_N3aaa9GG21123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21123223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123223barEv,_ZThn20_N3aaa9GG21123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123223barEv,_ZThn28_N3aaa9GG21123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112322E[];
Class_Descriptor cd__ZN3aaa9GG2112322E = {  "_ZN3aaa9GG2112322E", // class name
  bases__ZN3aaa9GG2112322E, 6,
  &(vtc__ZN3aaa9GG2112322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112323  : ::aaa::EE211 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21123233fooEv
  virtual void  bar(); // _ZN3aaa9GG21123233barEv
  ~GG2112323(); // tgen
  GG2112323(); // tgen
};
//SIG(1 _ZN3aaa9GG2112323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21123233fooEv");}
void  aaa::GG2112323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21123233barEv");}
aaa::GG2112323 ::~GG2112323(){ note_dtor("_ZN3aaa9GG2112323E", this);} // tgen
aaa::GG2112323 ::GG2112323(){ note_ctor("_ZN3aaa9GG2112323E", this);} // tgen
}
static void Test__ZN3aaa9GG2112323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112323E, buf);
    ::aaa::GG2112323 *dp, &lv = *(dp=new (buf) ::aaa::GG2112323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112323E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2112323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2112323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2112323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112323E);
    dp->::aaa::GG2112323::~GG2112323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112323E(Test__ZN3aaa9GG2112323E, "_ZN3aaa9GG2112323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112323C1Ev();
extern void _ZN3aaa9GG2112323D1Ev();
Name_Map name_map__ZN3aaa9GG2112323E[] = {
  NSPAIR(_ZN3aaa9GG2112323C1Ev),
  NSPAIR(_ZN3aaa9GG2112323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2112323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112323E[];
extern void _ZN3aaa9GG21123233barEv();
extern void _ZN3aaa9GG21123233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21123233fooEv,_ZThn8_N3aaa9GG21123233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21123233barEv,_ZThn20_N3aaa9GG21123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123233fooEv,_ZThn28_N3aaa9GG21123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123233barEv,_ZThn28_N3aaa9GG21123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21123233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21123233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21123233fooEv,_ZThn8_N3aaa9GG21123233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123233barEv,_ZThn20_N3aaa9GG21123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123233fooEv,_ZThn28_N3aaa9GG21123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123233barEv,_ZThn28_N3aaa9GG21123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112323E[];
Class_Descriptor cd__ZN3aaa9GG2112323E = {  "_ZN3aaa9GG2112323E", // class name
  bases__ZN3aaa9GG2112323E, 6,
  &(vtc__ZN3aaa9GG2112323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112331  : ::aaa::EE211 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21123313fooEv
  ~GG2112331(); // tgen
  GG2112331(); // tgen
};
//SIG(1 _ZN3aaa9GG2112331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21123313fooEv");}
aaa::GG2112331 ::~GG2112331(){ note_dtor("_ZN3aaa9GG2112331E", this);} // tgen
aaa::GG2112331 ::GG2112331(){ note_ctor("_ZN3aaa9GG2112331E", this);} // tgen
}
static void Test__ZN3aaa9GG2112331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112331E, buf);
    ::aaa::GG2112331 *dp, &lv = *(dp=new (buf) ::aaa::GG2112331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112331E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2112331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2112331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2112331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112331E);
    dp->::aaa::GG2112331::~GG2112331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112331E(Test__ZN3aaa9GG2112331E, "_ZN3aaa9GG2112331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112331C1Ev();
extern void _ZN3aaa9GG2112331D1Ev();
Name_Map name_map__ZN3aaa9GG2112331E[] = {
  NSPAIR(_ZN3aaa9GG2112331C1Ev),
  NSPAIR(_ZN3aaa9GG2112331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2112331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21123313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21123313fooEv,_ZThn8_N3aaa9GG21123313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21123313fooEv,_ZThn20_N3aaa9GG21123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123313fooEv,_ZThn28_N3aaa9GG21123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21123313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21123313fooEv,_ZThn8_N3aaa9GG21123313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123313fooEv,_ZThn20_N3aaa9GG21123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123313fooEv,_ZThn28_N3aaa9GG21123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112331E[];
Class_Descriptor cd__ZN3aaa9GG2112331E = {  "_ZN3aaa9GG2112331E", // class name
  bases__ZN3aaa9GG2112331E, 6,
  &(vtc__ZN3aaa9GG2112331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112332  : ::aaa::EE211 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21123323barEv
  ~GG2112332(); // tgen
  GG2112332(); // tgen
};
//SIG(1 _ZN3aaa9GG2112332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2112332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21123323barEv");}
aaa::GG2112332 ::~GG2112332(){ note_dtor("_ZN3aaa9GG2112332E", this);} // tgen
aaa::GG2112332 ::GG2112332(){ note_ctor("_ZN3aaa9GG2112332E", this);} // tgen
}
static void Test__ZN3aaa9GG2112332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112332E, buf);
    ::aaa::GG2112332 *dp, &lv = *(dp=new (buf) ::aaa::GG2112332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112332E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2112332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2112332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2112332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112332E);
    dp->::aaa::GG2112332::~GG2112332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112332E(Test__ZN3aaa9GG2112332E, "_ZN3aaa9GG2112332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112332C1Ev();
extern void _ZN3aaa9GG2112332D1Ev();
Name_Map name_map__ZN3aaa9GG2112332E[] = {
  NSPAIR(_ZN3aaa9GG2112332C1Ev),
  NSPAIR(_ZN3aaa9GG2112332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2112332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112332E[];
extern void _ZN3aaa9GG21123323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21123323barEv,_ZThn20_N3aaa9GG21123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123323barEv,_ZThn28_N3aaa9GG21123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21123323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123323barEv,_ZThn20_N3aaa9GG21123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123323barEv,_ZThn28_N3aaa9GG21123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112332E[];
Class_Descriptor cd__ZN3aaa9GG2112332E = {  "_ZN3aaa9GG2112332E", // class name
  bases__ZN3aaa9GG2112332E, 6,
  &(vtc__ZN3aaa9GG2112332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2112333  : ::aaa::EE211 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21123333fooEv
  virtual void  bar(); // _ZN3aaa9GG21123333barEv
  ~GG2112333(); // tgen
  GG2112333(); // tgen
};
//SIG(1 _ZN3aaa9GG2112333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2112333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21123333fooEv");}
void  aaa::GG2112333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21123333barEv");}
aaa::GG2112333 ::~GG2112333(){ note_dtor("_ZN3aaa9GG2112333E", this);} // tgen
aaa::GG2112333 ::GG2112333(){ note_ctor("_ZN3aaa9GG2112333E", this);} // tgen
}
static void Test__ZN3aaa9GG2112333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2112333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2112333E, buf);
    ::aaa::GG2112333 *dp, &lv = *(dp=new (buf) ::aaa::GG2112333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2112333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2112333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2112333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2112333E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2112333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2112333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2112333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2112333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2112333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2112333E);
    dp->::aaa::GG2112333::~GG2112333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2112333E(Test__ZN3aaa9GG2112333E, "_ZN3aaa9GG2112333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2112333C1Ev();
extern void _ZN3aaa9GG2112333D1Ev();
Name_Map name_map__ZN3aaa9GG2112333E[] = {
  NSPAIR(_ZN3aaa9GG2112333C1Ev),
  NSPAIR(_ZN3aaa9GG2112333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2112333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2112333E[];
extern void _ZN3aaa9GG21123333barEv();
extern void _ZN3aaa9GG21123333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21123333fooEv,_ZThn8_N3aaa9GG21123333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21123333barEv,_ZThn20_N3aaa9GG21123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21123333fooEv,_ZThn20_N3aaa9GG21123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123333fooEv,_ZThn28_N3aaa9GG21123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21123333barEv,_ZThn28_N3aaa9GG21123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2112333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21123333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21123333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21123333fooEv,_ZThn8_N3aaa9GG21123333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123333barEv,_ZThn20_N3aaa9GG21123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21123333fooEv,_ZThn20_N3aaa9GG21123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123333fooEv,_ZThn28_N3aaa9GG21123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21123333barEv,_ZThn28_N3aaa9GG21123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2112333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2112333E[];
Class_Descriptor cd__ZN3aaa9GG2112333E = {  "_ZN3aaa9GG2112333E", // class name
  bases__ZN3aaa9GG2112333E, 6,
  &(vtc__ZN3aaa9GG2112333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2112333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2112333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2113111  : ::aaa::EE211 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21131113fooEv
  ~GG2113111(); // tgen
  GG2113111(); // tgen
};
//SIG(1 _ZN3aaa9GG2113111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21131113fooEv");}
aaa::GG2113111 ::~GG2113111(){ note_dtor("_ZN3aaa9GG2113111E", this);} // tgen
aaa::GG2113111 ::GG2113111(){ note_ctor("_ZN3aaa9GG2113111E", this);} // tgen
}
static void Test__ZN3aaa9GG2113111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113111E, buf);
    ::aaa::GG2113111 *dp, &lv = *(dp=new (buf) ::aaa::GG2113111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113111E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2113111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2113111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2113111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113111E);
    dp->::aaa::GG2113111::~GG2113111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113111E(Test__ZN3aaa9GG2113111E, "_ZN3aaa9GG2113111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113111C1Ev();
extern void _ZN3aaa9GG2113111D1Ev();
Name_Map name_map__ZN3aaa9GG2113111E[] = {
  NSPAIR(_ZN3aaa9GG2113111C1Ev),
  NSPAIR(_ZN3aaa9GG2113111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2113111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21131113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21131113fooEv,_ZThn8_N3aaa9GG21131113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131113fooEv,_ZThn20_N3aaa9GG21131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21131113fooEv,_ZThn28_N3aaa9GG21131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21131113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21131113fooEv,_ZThn8_N3aaa9GG21131113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131113fooEv,_ZThn20_N3aaa9GG21131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21131113fooEv,_ZThn28_N3aaa9GG21131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113111E[];
Class_Descriptor cd__ZN3aaa9GG2113111E = {  "_ZN3aaa9GG2113111E", // class name
  bases__ZN3aaa9GG2113111E, 6,
  &(vtc__ZN3aaa9GG2113111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2113112  : ::aaa::EE211 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21131123barEv
  ~GG2113112(); // tgen
  GG2113112(); // tgen
};
//SIG(1 _ZN3aaa9GG2113112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21131123barEv");}
aaa::GG2113112 ::~GG2113112(){ note_dtor("_ZN3aaa9GG2113112E", this);} // tgen
aaa::GG2113112 ::GG2113112(){ note_ctor("_ZN3aaa9GG2113112E", this);} // tgen
}
static void Test__ZN3aaa9GG2113112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113112E, buf);
    ::aaa::GG2113112 *dp, &lv = *(dp=new (buf) ::aaa::GG2113112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113112E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2113112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2113112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2113112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113112E);
    dp->::aaa::GG2113112::~GG2113112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113112E(Test__ZN3aaa9GG2113112E, "_ZN3aaa9GG2113112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113112C1Ev();
extern void _ZN3aaa9GG2113112D1Ev();
Name_Map name_map__ZN3aaa9GG2113112E[] = {
  NSPAIR(_ZN3aaa9GG2113112C1Ev),
  NSPAIR(_ZN3aaa9GG2113112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2113112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113112E[];
extern void _ZN3aaa9GG21131123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21131123barEv,_ZThn20_N3aaa9GG21131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21131123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131123barEv,_ZThn20_N3aaa9GG21131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113112E[];
Class_Descriptor cd__ZN3aaa9GG2113112E = {  "_ZN3aaa9GG2113112E", // class name
  bases__ZN3aaa9GG2113112E, 6,
  &(vtc__ZN3aaa9GG2113112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2113113  : ::aaa::EE211 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21131133fooEv
  virtual void  bar(); // _ZN3aaa9GG21131133barEv
  ~GG2113113(); // tgen
  GG2113113(); // tgen
};
//SIG(1 _ZN3aaa9GG2113113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21131133fooEv");}
void  aaa::GG2113113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21131133barEv");}
aaa::GG2113113 ::~GG2113113(){ note_dtor("_ZN3aaa9GG2113113E", this);} // tgen
aaa::GG2113113 ::GG2113113(){ note_ctor("_ZN3aaa9GG2113113E", this);} // tgen
}
static void Test__ZN3aaa9GG2113113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113113E, buf);
    ::aaa::GG2113113 *dp, &lv = *(dp=new (buf) ::aaa::GG2113113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113113E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2113113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2113113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2113113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113113E);
    dp->::aaa::GG2113113::~GG2113113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113113E(Test__ZN3aaa9GG2113113E, "_ZN3aaa9GG2113113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113113C1Ev();
extern void _ZN3aaa9GG2113113D1Ev();
Name_Map name_map__ZN3aaa9GG2113113E[] = {
  NSPAIR(_ZN3aaa9GG2113113C1Ev),
  NSPAIR(_ZN3aaa9GG2113113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2113113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113113E[];
extern void _ZN3aaa9GG21131133barEv();
extern void _ZN3aaa9GG21131133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21131133fooEv,_ZThn8_N3aaa9GG21131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131133fooEv,_ZThn20_N3aaa9GG21131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131133barEv,_ZThn20_N3aaa9GG21131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21131133fooEv,_ZThn28_N3aaa9GG21131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21131133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21131133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21131133fooEv,_ZThn8_N3aaa9GG21131133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131133fooEv,_ZThn20_N3aaa9GG21131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131133barEv,_ZThn20_N3aaa9GG21131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21131133fooEv,_ZThn28_N3aaa9GG21131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113113E[];
Class_Descriptor cd__ZN3aaa9GG2113113E = {  "_ZN3aaa9GG2113113E", // class name
  bases__ZN3aaa9GG2113113E, 6,
  &(vtc__ZN3aaa9GG2113113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

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

#ifdef __cplusplus
namespace aaa { 
struct  GG2113121  : ::aaa::EE211 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21131213fooEv
  ~GG2113121(); // tgen
  GG2113121(); // tgen
};
//SIG(1 _ZN3aaa9GG2113121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21131213fooEv");}
aaa::GG2113121 ::~GG2113121(){ note_dtor("_ZN3aaa9GG2113121E", this);} // tgen
aaa::GG2113121 ::GG2113121(){ note_ctor("_ZN3aaa9GG2113121E", this);} // tgen
}
static void Test__ZN3aaa9GG2113121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113121E, buf);
    ::aaa::GG2113121 *dp, &lv = *(dp=new (buf) ::aaa::GG2113121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113121E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2113121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2113121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2113121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113121E);
    dp->::aaa::GG2113121::~GG2113121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113121E(Test__ZN3aaa9GG2113121E, "_ZN3aaa9GG2113121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113121C1Ev();
extern void _ZN3aaa9GG2113121D1Ev();
Name_Map name_map__ZN3aaa9GG2113121E[] = {
  NSPAIR(_ZN3aaa9GG2113121C1Ev),
  NSPAIR(_ZN3aaa9GG2113121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2113121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21131213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21131213fooEv,_ZThn8_N3aaa9GG21131213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131213fooEv,_ZThn20_N3aaa9GG21131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21131213fooEv,_ZThn28_N3aaa9GG21131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21131213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21131213fooEv,_ZThn8_N3aaa9GG21131213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131213fooEv,_ZThn20_N3aaa9GG21131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21131213fooEv,_ZThn28_N3aaa9GG21131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113121E[];
Class_Descriptor cd__ZN3aaa9GG2113121E = {  "_ZN3aaa9GG2113121E", // class name
  bases__ZN3aaa9GG2113121E, 6,
  &(vtc__ZN3aaa9GG2113121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113122  : ::aaa::EE211 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21131223barEv
  ~GG2113122(); // tgen
  GG2113122(); // tgen
};
//SIG(1 _ZN3aaa9GG2113122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21131223barEv");}
aaa::GG2113122 ::~GG2113122(){ note_dtor("_ZN3aaa9GG2113122E", this);} // tgen
aaa::GG2113122 ::GG2113122(){ note_ctor("_ZN3aaa9GG2113122E", this);} // tgen
}
static void Test__ZN3aaa9GG2113122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113122E, buf);
    ::aaa::GG2113122 *dp, &lv = *(dp=new (buf) ::aaa::GG2113122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113122E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2113122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2113122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2113122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113122E);
    dp->::aaa::GG2113122::~GG2113122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113122E(Test__ZN3aaa9GG2113122E, "_ZN3aaa9GG2113122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113122C1Ev();
extern void _ZN3aaa9GG2113122D1Ev();
Name_Map name_map__ZN3aaa9GG2113122E[] = {
  NSPAIR(_ZN3aaa9GG2113122C1Ev),
  NSPAIR(_ZN3aaa9GG2113122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2113122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113122E[];
extern void _ZN3aaa9GG21131223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21131223barEv,_ZThn20_N3aaa9GG21131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21131223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131223barEv,_ZThn20_N3aaa9GG21131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113122E[];
Class_Descriptor cd__ZN3aaa9GG2113122E = {  "_ZN3aaa9GG2113122E", // class name
  bases__ZN3aaa9GG2113122E, 6,
  &(vtc__ZN3aaa9GG2113122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113123  : ::aaa::EE211 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21131233fooEv
  virtual void  bar(); // _ZN3aaa9GG21131233barEv
  ~GG2113123(); // tgen
  GG2113123(); // tgen
};
//SIG(1 _ZN3aaa9GG2113123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21131233fooEv");}
void  aaa::GG2113123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21131233barEv");}
aaa::GG2113123 ::~GG2113123(){ note_dtor("_ZN3aaa9GG2113123E", this);} // tgen
aaa::GG2113123 ::GG2113123(){ note_ctor("_ZN3aaa9GG2113123E", this);} // tgen
}
static void Test__ZN3aaa9GG2113123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113123E, buf);
    ::aaa::GG2113123 *dp, &lv = *(dp=new (buf) ::aaa::GG2113123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113123E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2113123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2113123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2113123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113123E);
    dp->::aaa::GG2113123::~GG2113123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113123E(Test__ZN3aaa9GG2113123E, "_ZN3aaa9GG2113123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113123C1Ev();
extern void _ZN3aaa9GG2113123D1Ev();
Name_Map name_map__ZN3aaa9GG2113123E[] = {
  NSPAIR(_ZN3aaa9GG2113123C1Ev),
  NSPAIR(_ZN3aaa9GG2113123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2113123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113123E[];
extern void _ZN3aaa9GG21131233barEv();
extern void _ZN3aaa9GG21131233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21131233fooEv,_ZThn8_N3aaa9GG21131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131233fooEv,_ZThn20_N3aaa9GG21131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131233barEv,_ZThn20_N3aaa9GG21131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21131233fooEv,_ZThn28_N3aaa9GG21131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21131233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21131233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21131233fooEv,_ZThn8_N3aaa9GG21131233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131233fooEv,_ZThn20_N3aaa9GG21131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131233barEv,_ZThn20_N3aaa9GG21131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21131233fooEv,_ZThn28_N3aaa9GG21131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113123E[];
Class_Descriptor cd__ZN3aaa9GG2113123E = {  "_ZN3aaa9GG2113123E", // class name
  bases__ZN3aaa9GG2113123E, 6,
  &(vtc__ZN3aaa9GG2113123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113131  : ::aaa::EE211 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21131313fooEv
  ~GG2113131(); // tgen
  GG2113131(); // tgen
};
//SIG(1 _ZN3aaa9GG2113131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21131313fooEv");}
aaa::GG2113131 ::~GG2113131(){ note_dtor("_ZN3aaa9GG2113131E", this);} // tgen
aaa::GG2113131 ::GG2113131(){ note_ctor("_ZN3aaa9GG2113131E", this);} // tgen
}
static void Test__ZN3aaa9GG2113131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113131E, buf);
    ::aaa::GG2113131 *dp, &lv = *(dp=new (buf) ::aaa::GG2113131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113131E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2113131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2113131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2113131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113131E);
    dp->::aaa::GG2113131::~GG2113131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113131E(Test__ZN3aaa9GG2113131E, "_ZN3aaa9GG2113131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113131C1Ev();
extern void _ZN3aaa9GG2113131D1Ev();
Name_Map name_map__ZN3aaa9GG2113131E[] = {
  NSPAIR(_ZN3aaa9GG2113131C1Ev),
  NSPAIR(_ZN3aaa9GG2113131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2113131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21131313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21131313fooEv,_ZThn8_N3aaa9GG21131313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131313fooEv,_ZThn20_N3aaa9GG21131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21131313fooEv,_ZThn28_N3aaa9GG21131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21131313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21131313fooEv,_ZThn8_N3aaa9GG21131313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131313fooEv,_ZThn20_N3aaa9GG21131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21131313fooEv,_ZThn28_N3aaa9GG21131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113131E[];
Class_Descriptor cd__ZN3aaa9GG2113131E = {  "_ZN3aaa9GG2113131E", // class name
  bases__ZN3aaa9GG2113131E, 6,
  &(vtc__ZN3aaa9GG2113131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113132  : ::aaa::EE211 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21131323barEv
  ~GG2113132(); // tgen
  GG2113132(); // tgen
};
//SIG(1 _ZN3aaa9GG2113132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21131323barEv");}
aaa::GG2113132 ::~GG2113132(){ note_dtor("_ZN3aaa9GG2113132E", this);} // tgen
aaa::GG2113132 ::GG2113132(){ note_ctor("_ZN3aaa9GG2113132E", this);} // tgen
}
static void Test__ZN3aaa9GG2113132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113132E, buf);
    ::aaa::GG2113132 *dp, &lv = *(dp=new (buf) ::aaa::GG2113132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113132E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2113132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2113132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2113132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113132E);
    dp->::aaa::GG2113132::~GG2113132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113132E(Test__ZN3aaa9GG2113132E, "_ZN3aaa9GG2113132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113132C1Ev();
extern void _ZN3aaa9GG2113132D1Ev();
Name_Map name_map__ZN3aaa9GG2113132E[] = {
  NSPAIR(_ZN3aaa9GG2113132C1Ev),
  NSPAIR(_ZN3aaa9GG2113132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2113132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113132E[];
extern void _ZN3aaa9GG21131323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21131323barEv,_ZThn20_N3aaa9GG21131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21131323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131323barEv,_ZThn20_N3aaa9GG21131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113132E[];
Class_Descriptor cd__ZN3aaa9GG2113132E = {  "_ZN3aaa9GG2113132E", // class name
  bases__ZN3aaa9GG2113132E, 6,
  &(vtc__ZN3aaa9GG2113132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113133  : ::aaa::EE211 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21131333fooEv
  virtual void  bar(); // _ZN3aaa9GG21131333barEv
  ~GG2113133(); // tgen
  GG2113133(); // tgen
};
//SIG(1 _ZN3aaa9GG2113133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21131333fooEv");}
void  aaa::GG2113133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21131333barEv");}
aaa::GG2113133 ::~GG2113133(){ note_dtor("_ZN3aaa9GG2113133E", this);} // tgen
aaa::GG2113133 ::GG2113133(){ note_ctor("_ZN3aaa9GG2113133E", this);} // tgen
}
static void Test__ZN3aaa9GG2113133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113133E, buf);
    ::aaa::GG2113133 *dp, &lv = *(dp=new (buf) ::aaa::GG2113133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113133E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2113133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2113133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2113133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113133E);
    dp->::aaa::GG2113133::~GG2113133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113133E(Test__ZN3aaa9GG2113133E, "_ZN3aaa9GG2113133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113133C1Ev();
extern void _ZN3aaa9GG2113133D1Ev();
Name_Map name_map__ZN3aaa9GG2113133E[] = {
  NSPAIR(_ZN3aaa9GG2113133C1Ev),
  NSPAIR(_ZN3aaa9GG2113133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2113133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113133E[];
extern void _ZN3aaa9GG21131333barEv();
extern void _ZN3aaa9GG21131333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21131333fooEv,_ZThn8_N3aaa9GG21131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131333fooEv,_ZThn20_N3aaa9GG21131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21131333barEv,_ZThn20_N3aaa9GG21131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21131333fooEv,_ZThn28_N3aaa9GG21131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21131333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21131333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21131333fooEv,_ZThn8_N3aaa9GG21131333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131333fooEv,_ZThn20_N3aaa9GG21131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21131333barEv,_ZThn20_N3aaa9GG21131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21131333fooEv,_ZThn28_N3aaa9GG21131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113133E[];
Class_Descriptor cd__ZN3aaa9GG2113133E = {  "_ZN3aaa9GG2113133E", // class name
  bases__ZN3aaa9GG2113133E, 6,
  &(vtc__ZN3aaa9GG2113133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113211  : ::aaa::EE211 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21132113fooEv
  ~GG2113211(); // tgen
  GG2113211(); // tgen
};
//SIG(1 _ZN3aaa9GG2113211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21132113fooEv");}
aaa::GG2113211 ::~GG2113211(){ note_dtor("_ZN3aaa9GG2113211E", this);} // tgen
aaa::GG2113211 ::GG2113211(){ note_ctor("_ZN3aaa9GG2113211E", this);} // tgen
}
static void Test__ZN3aaa9GG2113211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113211E, buf);
    ::aaa::GG2113211 *dp, &lv = *(dp=new (buf) ::aaa::GG2113211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113211E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2113211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2113211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2113211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113211E);
    dp->::aaa::GG2113211::~GG2113211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113211E(Test__ZN3aaa9GG2113211E, "_ZN3aaa9GG2113211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113211C1Ev();
extern void _ZN3aaa9GG2113211D1Ev();
Name_Map name_map__ZN3aaa9GG2113211E[] = {
  NSPAIR(_ZN3aaa9GG2113211C1Ev),
  NSPAIR(_ZN3aaa9GG2113211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2113211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21132113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21132113fooEv,_ZThn8_N3aaa9GG21132113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132113fooEv,_ZThn20_N3aaa9GG21132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21132113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21132113fooEv,_ZThn8_N3aaa9GG21132113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132113fooEv,_ZThn20_N3aaa9GG21132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113211E[];
Class_Descriptor cd__ZN3aaa9GG2113211E = {  "_ZN3aaa9GG2113211E", // class name
  bases__ZN3aaa9GG2113211E, 6,
  &(vtc__ZN3aaa9GG2113211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113212  : ::aaa::EE211 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21132123barEv
  ~GG2113212(); // tgen
  GG2113212(); // tgen
};
//SIG(1 _ZN3aaa9GG2113212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21132123barEv");}
aaa::GG2113212 ::~GG2113212(){ note_dtor("_ZN3aaa9GG2113212E", this);} // tgen
aaa::GG2113212 ::GG2113212(){ note_ctor("_ZN3aaa9GG2113212E", this);} // tgen
}
static void Test__ZN3aaa9GG2113212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113212E, buf);
    ::aaa::GG2113212 *dp, &lv = *(dp=new (buf) ::aaa::GG2113212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113212E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2113212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2113212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2113212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113212E);
    dp->::aaa::GG2113212::~GG2113212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113212E(Test__ZN3aaa9GG2113212E, "_ZN3aaa9GG2113212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113212C1Ev();
extern void _ZN3aaa9GG2113212D1Ev();
Name_Map name_map__ZN3aaa9GG2113212E[] = {
  NSPAIR(_ZN3aaa9GG2113212C1Ev),
  NSPAIR(_ZN3aaa9GG2113212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2113212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113212E[];
extern void _ZN3aaa9GG21132123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21132123barEv,_ZThn20_N3aaa9GG21132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21132123barEv,_ZThn28_N3aaa9GG21132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21132123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132123barEv,_ZThn20_N3aaa9GG21132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21132123barEv,_ZThn28_N3aaa9GG21132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113212E[];
Class_Descriptor cd__ZN3aaa9GG2113212E = {  "_ZN3aaa9GG2113212E", // class name
  bases__ZN3aaa9GG2113212E, 6,
  &(vtc__ZN3aaa9GG2113212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113213  : ::aaa::EE211 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21132133fooEv
  virtual void  bar(); // _ZN3aaa9GG21132133barEv
  ~GG2113213(); // tgen
  GG2113213(); // tgen
};
//SIG(1 _ZN3aaa9GG2113213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21132133fooEv");}
void  aaa::GG2113213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21132133barEv");}
aaa::GG2113213 ::~GG2113213(){ note_dtor("_ZN3aaa9GG2113213E", this);} // tgen
aaa::GG2113213 ::GG2113213(){ note_ctor("_ZN3aaa9GG2113213E", this);} // tgen
}
static void Test__ZN3aaa9GG2113213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113213E, buf);
    ::aaa::GG2113213 *dp, &lv = *(dp=new (buf) ::aaa::GG2113213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113213E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2113213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2113213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2113213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113213E);
    dp->::aaa::GG2113213::~GG2113213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113213E(Test__ZN3aaa9GG2113213E, "_ZN3aaa9GG2113213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113213C1Ev();
extern void _ZN3aaa9GG2113213D1Ev();
Name_Map name_map__ZN3aaa9GG2113213E[] = {
  NSPAIR(_ZN3aaa9GG2113213C1Ev),
  NSPAIR(_ZN3aaa9GG2113213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2113213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113213E[];
extern void _ZN3aaa9GG21132133barEv();
extern void _ZN3aaa9GG21132133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21132133fooEv,_ZThn8_N3aaa9GG21132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132133fooEv,_ZThn20_N3aaa9GG21132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132133barEv,_ZThn20_N3aaa9GG21132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21132133barEv,_ZThn28_N3aaa9GG21132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21132133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21132133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21132133fooEv,_ZThn8_N3aaa9GG21132133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132133fooEv,_ZThn20_N3aaa9GG21132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132133barEv,_ZThn20_N3aaa9GG21132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21132133barEv,_ZThn28_N3aaa9GG21132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113213E[];
Class_Descriptor cd__ZN3aaa9GG2113213E = {  "_ZN3aaa9GG2113213E", // class name
  bases__ZN3aaa9GG2113213E, 6,
  &(vtc__ZN3aaa9GG2113213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113221  : ::aaa::EE211 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21132213fooEv
  ~GG2113221(); // tgen
  GG2113221(); // tgen
};
//SIG(1 _ZN3aaa9GG2113221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21132213fooEv");}
aaa::GG2113221 ::~GG2113221(){ note_dtor("_ZN3aaa9GG2113221E", this);} // tgen
aaa::GG2113221 ::GG2113221(){ note_ctor("_ZN3aaa9GG2113221E", this);} // tgen
}
static void Test__ZN3aaa9GG2113221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113221E, buf);
    ::aaa::GG2113221 *dp, &lv = *(dp=new (buf) ::aaa::GG2113221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113221E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2113221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2113221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2113221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113221E);
    dp->::aaa::GG2113221::~GG2113221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113221E(Test__ZN3aaa9GG2113221E, "_ZN3aaa9GG2113221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113221C1Ev();
extern void _ZN3aaa9GG2113221D1Ev();
Name_Map name_map__ZN3aaa9GG2113221E[] = {
  NSPAIR(_ZN3aaa9GG2113221C1Ev),
  NSPAIR(_ZN3aaa9GG2113221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2113221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21132213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21132213fooEv,_ZThn8_N3aaa9GG21132213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132213fooEv,_ZThn20_N3aaa9GG21132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21132213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21132213fooEv,_ZThn8_N3aaa9GG21132213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132213fooEv,_ZThn20_N3aaa9GG21132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113221E[];
Class_Descriptor cd__ZN3aaa9GG2113221E = {  "_ZN3aaa9GG2113221E", // class name
  bases__ZN3aaa9GG2113221E, 6,
  &(vtc__ZN3aaa9GG2113221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113222  : ::aaa::EE211 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21132223barEv
  ~GG2113222(); // tgen
  GG2113222(); // tgen
};
//SIG(1 _ZN3aaa9GG2113222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21132223barEv");}
aaa::GG2113222 ::~GG2113222(){ note_dtor("_ZN3aaa9GG2113222E", this);} // tgen
aaa::GG2113222 ::GG2113222(){ note_ctor("_ZN3aaa9GG2113222E", this);} // tgen
}
static void Test__ZN3aaa9GG2113222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113222E, buf);
    ::aaa::GG2113222 *dp, &lv = *(dp=new (buf) ::aaa::GG2113222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113222E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2113222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2113222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2113222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113222E);
    dp->::aaa::GG2113222::~GG2113222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113222E(Test__ZN3aaa9GG2113222E, "_ZN3aaa9GG2113222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113222C1Ev();
extern void _ZN3aaa9GG2113222D1Ev();
Name_Map name_map__ZN3aaa9GG2113222E[] = {
  NSPAIR(_ZN3aaa9GG2113222C1Ev),
  NSPAIR(_ZN3aaa9GG2113222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2113222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113222E[];
extern void _ZN3aaa9GG21132223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21132223barEv,_ZThn20_N3aaa9GG21132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21132223barEv,_ZThn28_N3aaa9GG21132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21132223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132223barEv,_ZThn20_N3aaa9GG21132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21132223barEv,_ZThn28_N3aaa9GG21132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113222E[];
Class_Descriptor cd__ZN3aaa9GG2113222E = {  "_ZN3aaa9GG2113222E", // class name
  bases__ZN3aaa9GG2113222E, 6,
  &(vtc__ZN3aaa9GG2113222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113223  : ::aaa::EE211 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21132233fooEv
  virtual void  bar(); // _ZN3aaa9GG21132233barEv
  ~GG2113223(); // tgen
  GG2113223(); // tgen
};
//SIG(1 _ZN3aaa9GG2113223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21132233fooEv");}
void  aaa::GG2113223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21132233barEv");}
aaa::GG2113223 ::~GG2113223(){ note_dtor("_ZN3aaa9GG2113223E", this);} // tgen
aaa::GG2113223 ::GG2113223(){ note_ctor("_ZN3aaa9GG2113223E", this);} // tgen
}
static void Test__ZN3aaa9GG2113223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113223E, buf);
    ::aaa::GG2113223 *dp, &lv = *(dp=new (buf) ::aaa::GG2113223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113223E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2113223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2113223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2113223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113223E);
    dp->::aaa::GG2113223::~GG2113223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113223E(Test__ZN3aaa9GG2113223E, "_ZN3aaa9GG2113223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113223C1Ev();
extern void _ZN3aaa9GG2113223D1Ev();
Name_Map name_map__ZN3aaa9GG2113223E[] = {
  NSPAIR(_ZN3aaa9GG2113223C1Ev),
  NSPAIR(_ZN3aaa9GG2113223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2113223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113223E[];
extern void _ZN3aaa9GG21132233barEv();
extern void _ZN3aaa9GG21132233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21132233fooEv,_ZThn8_N3aaa9GG21132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132233fooEv,_ZThn20_N3aaa9GG21132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132233barEv,_ZThn20_N3aaa9GG21132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21132233barEv,_ZThn28_N3aaa9GG21132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21132233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21132233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21132233fooEv,_ZThn8_N3aaa9GG21132233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132233fooEv,_ZThn20_N3aaa9GG21132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132233barEv,_ZThn20_N3aaa9GG21132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21132233barEv,_ZThn28_N3aaa9GG21132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113223E[];
Class_Descriptor cd__ZN3aaa9GG2113223E = {  "_ZN3aaa9GG2113223E", // class name
  bases__ZN3aaa9GG2113223E, 6,
  &(vtc__ZN3aaa9GG2113223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113231  : ::aaa::EE211 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21132313fooEv
  ~GG2113231(); // tgen
  GG2113231(); // tgen
};
//SIG(1 _ZN3aaa9GG2113231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21132313fooEv");}
aaa::GG2113231 ::~GG2113231(){ note_dtor("_ZN3aaa9GG2113231E", this);} // tgen
aaa::GG2113231 ::GG2113231(){ note_ctor("_ZN3aaa9GG2113231E", this);} // tgen
}
static void Test__ZN3aaa9GG2113231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113231E, buf);
    ::aaa::GG2113231 *dp, &lv = *(dp=new (buf) ::aaa::GG2113231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113231E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2113231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2113231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2113231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113231E);
    dp->::aaa::GG2113231::~GG2113231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113231E(Test__ZN3aaa9GG2113231E, "_ZN3aaa9GG2113231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113231C1Ev();
extern void _ZN3aaa9GG2113231D1Ev();
Name_Map name_map__ZN3aaa9GG2113231E[] = {
  NSPAIR(_ZN3aaa9GG2113231C1Ev),
  NSPAIR(_ZN3aaa9GG2113231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2113231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21132313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21132313fooEv,_ZThn8_N3aaa9GG21132313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132313fooEv,_ZThn20_N3aaa9GG21132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21132313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21132313fooEv,_ZThn8_N3aaa9GG21132313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132313fooEv,_ZThn20_N3aaa9GG21132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113231E[];
Class_Descriptor cd__ZN3aaa9GG2113231E = {  "_ZN3aaa9GG2113231E", // class name
  bases__ZN3aaa9GG2113231E, 6,
  &(vtc__ZN3aaa9GG2113231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113232  : ::aaa::EE211 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21132323barEv
  ~GG2113232(); // tgen
  GG2113232(); // tgen
};
//SIG(1 _ZN3aaa9GG2113232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21132323barEv");}
aaa::GG2113232 ::~GG2113232(){ note_dtor("_ZN3aaa9GG2113232E", this);} // tgen
aaa::GG2113232 ::GG2113232(){ note_ctor("_ZN3aaa9GG2113232E", this);} // tgen
}
static void Test__ZN3aaa9GG2113232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113232E, buf);
    ::aaa::GG2113232 *dp, &lv = *(dp=new (buf) ::aaa::GG2113232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113232E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2113232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2113232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2113232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113232E);
    dp->::aaa::GG2113232::~GG2113232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113232E(Test__ZN3aaa9GG2113232E, "_ZN3aaa9GG2113232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113232C1Ev();
extern void _ZN3aaa9GG2113232D1Ev();
Name_Map name_map__ZN3aaa9GG2113232E[] = {
  NSPAIR(_ZN3aaa9GG2113232C1Ev),
  NSPAIR(_ZN3aaa9GG2113232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2113232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113232E[];
extern void _ZN3aaa9GG21132323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21132323barEv,_ZThn20_N3aaa9GG21132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21132323barEv,_ZThn28_N3aaa9GG21132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21132323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132323barEv,_ZThn20_N3aaa9GG21132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21132323barEv,_ZThn28_N3aaa9GG21132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113232E[];
Class_Descriptor cd__ZN3aaa9GG2113232E = {  "_ZN3aaa9GG2113232E", // class name
  bases__ZN3aaa9GG2113232E, 6,
  &(vtc__ZN3aaa9GG2113232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113233  : ::aaa::EE211 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21132333fooEv
  virtual void  bar(); // _ZN3aaa9GG21132333barEv
  ~GG2113233(); // tgen
  GG2113233(); // tgen
};
//SIG(1 _ZN3aaa9GG2113233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21132333fooEv");}
void  aaa::GG2113233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21132333barEv");}
aaa::GG2113233 ::~GG2113233(){ note_dtor("_ZN3aaa9GG2113233E", this);} // tgen
aaa::GG2113233 ::GG2113233(){ note_ctor("_ZN3aaa9GG2113233E", this);} // tgen
}
static void Test__ZN3aaa9GG2113233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113233E, buf);
    ::aaa::GG2113233 *dp, &lv = *(dp=new (buf) ::aaa::GG2113233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113233E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2113233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2113233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2113233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113233E);
    dp->::aaa::GG2113233::~GG2113233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113233E(Test__ZN3aaa9GG2113233E, "_ZN3aaa9GG2113233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113233C1Ev();
extern void _ZN3aaa9GG2113233D1Ev();
Name_Map name_map__ZN3aaa9GG2113233E[] = {
  NSPAIR(_ZN3aaa9GG2113233C1Ev),
  NSPAIR(_ZN3aaa9GG2113233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2113233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113233E[];
extern void _ZN3aaa9GG21132333barEv();
extern void _ZN3aaa9GG21132333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21132333fooEv,_ZThn8_N3aaa9GG21132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132333fooEv,_ZThn20_N3aaa9GG21132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21132333barEv,_ZThn20_N3aaa9GG21132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21132333barEv,_ZThn28_N3aaa9GG21132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21132333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21132333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21132333fooEv,_ZThn8_N3aaa9GG21132333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132333fooEv,_ZThn20_N3aaa9GG21132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21132333barEv,_ZThn20_N3aaa9GG21132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21132333barEv,_ZThn28_N3aaa9GG21132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113233E[];
Class_Descriptor cd__ZN3aaa9GG2113233E = {  "_ZN3aaa9GG2113233E", // class name
  bases__ZN3aaa9GG2113233E, 6,
  &(vtc__ZN3aaa9GG2113233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113311  : ::aaa::EE211 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21133113fooEv
  ~GG2113311(); // tgen
  GG2113311(); // tgen
};
//SIG(1 _ZN3aaa9GG2113311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21133113fooEv");}
aaa::GG2113311 ::~GG2113311(){ note_dtor("_ZN3aaa9GG2113311E", this);} // tgen
aaa::GG2113311 ::GG2113311(){ note_ctor("_ZN3aaa9GG2113311E", this);} // tgen
}
static void Test__ZN3aaa9GG2113311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113311E, buf);
    ::aaa::GG2113311 *dp, &lv = *(dp=new (buf) ::aaa::GG2113311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113311E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2113311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2113311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2113311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113311E);
    dp->::aaa::GG2113311::~GG2113311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113311E(Test__ZN3aaa9GG2113311E, "_ZN3aaa9GG2113311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113311C1Ev();
extern void _ZN3aaa9GG2113311D1Ev();
Name_Map name_map__ZN3aaa9GG2113311E[] = {
  NSPAIR(_ZN3aaa9GG2113311C1Ev),
  NSPAIR(_ZN3aaa9GG2113311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2113311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21133113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21133113fooEv,_ZThn8_N3aaa9GG21133113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133113fooEv,_ZThn20_N3aaa9GG21133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21133113fooEv,_ZThn28_N3aaa9GG21133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21133113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21133113fooEv,_ZThn8_N3aaa9GG21133113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133113fooEv,_ZThn20_N3aaa9GG21133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133113fooEv,_ZThn28_N3aaa9GG21133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113311E[];
Class_Descriptor cd__ZN3aaa9GG2113311E = {  "_ZN3aaa9GG2113311E", // class name
  bases__ZN3aaa9GG2113311E, 6,
  &(vtc__ZN3aaa9GG2113311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113312  : ::aaa::EE211 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21133123barEv
  ~GG2113312(); // tgen
  GG2113312(); // tgen
};
//SIG(1 _ZN3aaa9GG2113312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21133123barEv");}
aaa::GG2113312 ::~GG2113312(){ note_dtor("_ZN3aaa9GG2113312E", this);} // tgen
aaa::GG2113312 ::GG2113312(){ note_ctor("_ZN3aaa9GG2113312E", this);} // tgen
}
static void Test__ZN3aaa9GG2113312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113312E, buf);
    ::aaa::GG2113312 *dp, &lv = *(dp=new (buf) ::aaa::GG2113312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113312E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2113312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2113312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2113312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113312E);
    dp->::aaa::GG2113312::~GG2113312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113312E(Test__ZN3aaa9GG2113312E, "_ZN3aaa9GG2113312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113312C1Ev();
extern void _ZN3aaa9GG2113312D1Ev();
Name_Map name_map__ZN3aaa9GG2113312E[] = {
  NSPAIR(_ZN3aaa9GG2113312C1Ev),
  NSPAIR(_ZN3aaa9GG2113312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2113312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113312E[];
extern void _ZN3aaa9GG21133123barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21133123barEv,_ZThn20_N3aaa9GG21133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21133123barEv,_ZThn28_N3aaa9GG21133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21133123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133123barEv,_ZThn20_N3aaa9GG21133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133123barEv,_ZThn28_N3aaa9GG21133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113312E[];
Class_Descriptor cd__ZN3aaa9GG2113312E = {  "_ZN3aaa9GG2113312E", // class name
  bases__ZN3aaa9GG2113312E, 6,
  &(vtc__ZN3aaa9GG2113312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113313  : ::aaa::EE211 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21133133fooEv
  virtual void  bar(); // _ZN3aaa9GG21133133barEv
  ~GG2113313(); // tgen
  GG2113313(); // tgen
};
//SIG(1 _ZN3aaa9GG2113313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21133133fooEv");}
void  aaa::GG2113313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21133133barEv");}
aaa::GG2113313 ::~GG2113313(){ note_dtor("_ZN3aaa9GG2113313E", this);} // tgen
aaa::GG2113313 ::GG2113313(){ note_ctor("_ZN3aaa9GG2113313E", this);} // tgen
}
static void Test__ZN3aaa9GG2113313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113313E, buf);
    ::aaa::GG2113313 *dp, &lv = *(dp=new (buf) ::aaa::GG2113313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113313E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2113313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2113313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2113313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113313E);
    dp->::aaa::GG2113313::~GG2113313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113313E(Test__ZN3aaa9GG2113313E, "_ZN3aaa9GG2113313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113313C1Ev();
extern void _ZN3aaa9GG2113313D1Ev();
Name_Map name_map__ZN3aaa9GG2113313E[] = {
  NSPAIR(_ZN3aaa9GG2113313C1Ev),
  NSPAIR(_ZN3aaa9GG2113313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2113313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113313E[];
extern void _ZN3aaa9GG21133133barEv();
extern void _ZN3aaa9GG21133133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21133133fooEv,_ZThn8_N3aaa9GG21133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133133fooEv,_ZThn20_N3aaa9GG21133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133133barEv,_ZThn20_N3aaa9GG21133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21133133fooEv,_ZThn28_N3aaa9GG21133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21133133barEv,_ZThn28_N3aaa9GG21133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21133133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21133133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21133133fooEv,_ZThn8_N3aaa9GG21133133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133133fooEv,_ZThn20_N3aaa9GG21133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133133barEv,_ZThn20_N3aaa9GG21133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133133fooEv,_ZThn28_N3aaa9GG21133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133133barEv,_ZThn28_N3aaa9GG21133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113313E[];
Class_Descriptor cd__ZN3aaa9GG2113313E = {  "_ZN3aaa9GG2113313E", // class name
  bases__ZN3aaa9GG2113313E, 6,
  &(vtc__ZN3aaa9GG2113313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113321  : ::aaa::EE211 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21133213fooEv
  ~GG2113321(); // tgen
  GG2113321(); // tgen
};
//SIG(1 _ZN3aaa9GG2113321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21133213fooEv");}
aaa::GG2113321 ::~GG2113321(){ note_dtor("_ZN3aaa9GG2113321E", this);} // tgen
aaa::GG2113321 ::GG2113321(){ note_ctor("_ZN3aaa9GG2113321E", this);} // tgen
}
static void Test__ZN3aaa9GG2113321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113321E, buf);
    ::aaa::GG2113321 *dp, &lv = *(dp=new (buf) ::aaa::GG2113321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113321E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2113321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2113321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2113321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113321E);
    dp->::aaa::GG2113321::~GG2113321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113321E(Test__ZN3aaa9GG2113321E, "_ZN3aaa9GG2113321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113321C1Ev();
extern void _ZN3aaa9GG2113321D1Ev();
Name_Map name_map__ZN3aaa9GG2113321E[] = {
  NSPAIR(_ZN3aaa9GG2113321C1Ev),
  NSPAIR(_ZN3aaa9GG2113321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2113321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21133213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21133213fooEv,_ZThn8_N3aaa9GG21133213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133213fooEv,_ZThn20_N3aaa9GG21133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21133213fooEv,_ZThn28_N3aaa9GG21133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21133213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21133213fooEv,_ZThn8_N3aaa9GG21133213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133213fooEv,_ZThn20_N3aaa9GG21133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133213fooEv,_ZThn28_N3aaa9GG21133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113321E[];
Class_Descriptor cd__ZN3aaa9GG2113321E = {  "_ZN3aaa9GG2113321E", // class name
  bases__ZN3aaa9GG2113321E, 6,
  &(vtc__ZN3aaa9GG2113321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113322  : ::aaa::EE211 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21133223barEv
  ~GG2113322(); // tgen
  GG2113322(); // tgen
};
//SIG(1 _ZN3aaa9GG2113322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21133223barEv");}
aaa::GG2113322 ::~GG2113322(){ note_dtor("_ZN3aaa9GG2113322E", this);} // tgen
aaa::GG2113322 ::GG2113322(){ note_ctor("_ZN3aaa9GG2113322E", this);} // tgen
}
static void Test__ZN3aaa9GG2113322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113322E, buf);
    ::aaa::GG2113322 *dp, &lv = *(dp=new (buf) ::aaa::GG2113322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113322E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2113322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2113322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2113322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113322E);
    dp->::aaa::GG2113322::~GG2113322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113322E(Test__ZN3aaa9GG2113322E, "_ZN3aaa9GG2113322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113322C1Ev();
extern void _ZN3aaa9GG2113322D1Ev();
Name_Map name_map__ZN3aaa9GG2113322E[] = {
  NSPAIR(_ZN3aaa9GG2113322C1Ev),
  NSPAIR(_ZN3aaa9GG2113322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2113322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113322E[];
extern void _ZN3aaa9GG21133223barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21133223barEv,_ZThn20_N3aaa9GG21133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21133223barEv,_ZThn28_N3aaa9GG21133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21133223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133223barEv,_ZThn20_N3aaa9GG21133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133223barEv,_ZThn28_N3aaa9GG21133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113322E[];
Class_Descriptor cd__ZN3aaa9GG2113322E = {  "_ZN3aaa9GG2113322E", // class name
  bases__ZN3aaa9GG2113322E, 6,
  &(vtc__ZN3aaa9GG2113322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113323  : ::aaa::EE211 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21133233fooEv
  virtual void  bar(); // _ZN3aaa9GG21133233barEv
  ~GG2113323(); // tgen
  GG2113323(); // tgen
};
//SIG(1 _ZN3aaa9GG2113323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21133233fooEv");}
void  aaa::GG2113323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21133233barEv");}
aaa::GG2113323 ::~GG2113323(){ note_dtor("_ZN3aaa9GG2113323E", this);} // tgen
aaa::GG2113323 ::GG2113323(){ note_ctor("_ZN3aaa9GG2113323E", this);} // tgen
}
static void Test__ZN3aaa9GG2113323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113323E, buf);
    ::aaa::GG2113323 *dp, &lv = *(dp=new (buf) ::aaa::GG2113323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113323E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2113323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2113323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2113323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113323E);
    dp->::aaa::GG2113323::~GG2113323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113323E(Test__ZN3aaa9GG2113323E, "_ZN3aaa9GG2113323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113323C1Ev();
extern void _ZN3aaa9GG2113323D1Ev();
Name_Map name_map__ZN3aaa9GG2113323E[] = {
  NSPAIR(_ZN3aaa9GG2113323C1Ev),
  NSPAIR(_ZN3aaa9GG2113323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2113323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113323E[];
extern void _ZN3aaa9GG21133233barEv();
extern void _ZN3aaa9GG21133233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21133233fooEv,_ZThn8_N3aaa9GG21133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133233fooEv,_ZThn20_N3aaa9GG21133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133233barEv,_ZThn20_N3aaa9GG21133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21133233fooEv,_ZThn28_N3aaa9GG21133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21133233barEv,_ZThn28_N3aaa9GG21133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21133233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21133233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21133233fooEv,_ZThn8_N3aaa9GG21133233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133233fooEv,_ZThn20_N3aaa9GG21133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133233barEv,_ZThn20_N3aaa9GG21133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133233fooEv,_ZThn28_N3aaa9GG21133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133233barEv,_ZThn28_N3aaa9GG21133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113323E[];
Class_Descriptor cd__ZN3aaa9GG2113323E = {  "_ZN3aaa9GG2113323E", // class name
  bases__ZN3aaa9GG2113323E, 6,
  &(vtc__ZN3aaa9GG2113323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113331  : ::aaa::EE211 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21133313fooEv
  ~GG2113331(); // tgen
  GG2113331(); // tgen
};
//SIG(1 _ZN3aaa9GG2113331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21133313fooEv");}
aaa::GG2113331 ::~GG2113331(){ note_dtor("_ZN3aaa9GG2113331E", this);} // tgen
aaa::GG2113331 ::GG2113331(){ note_ctor("_ZN3aaa9GG2113331E", this);} // tgen
}
static void Test__ZN3aaa9GG2113331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113331E, buf);
    ::aaa::GG2113331 *dp, &lv = *(dp=new (buf) ::aaa::GG2113331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113331E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2113331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2113331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2113331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113331E);
    dp->::aaa::GG2113331::~GG2113331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113331E(Test__ZN3aaa9GG2113331E, "_ZN3aaa9GG2113331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113331C1Ev();
extern void _ZN3aaa9GG2113331D1Ev();
Name_Map name_map__ZN3aaa9GG2113331E[] = {
  NSPAIR(_ZN3aaa9GG2113331C1Ev),
  NSPAIR(_ZN3aaa9GG2113331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2113331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG21133313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21133313fooEv,_ZThn8_N3aaa9GG21133313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133313fooEv,_ZThn20_N3aaa9GG21133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21133313fooEv,_ZThn28_N3aaa9GG21133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21133313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21133313fooEv,_ZThn8_N3aaa9GG21133313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133313fooEv,_ZThn20_N3aaa9GG21133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133313fooEv,_ZThn28_N3aaa9GG21133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113331E[];
Class_Descriptor cd__ZN3aaa9GG2113331E = {  "_ZN3aaa9GG2113331E", // class name
  bases__ZN3aaa9GG2113331E, 6,
  &(vtc__ZN3aaa9GG2113331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113332  : ::aaa::EE211 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21133323barEv
  ~GG2113332(); // tgen
  GG2113332(); // tgen
};
//SIG(1 _ZN3aaa9GG2113332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2113332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21133323barEv");}
aaa::GG2113332 ::~GG2113332(){ note_dtor("_ZN3aaa9GG2113332E", this);} // tgen
aaa::GG2113332 ::GG2113332(){ note_ctor("_ZN3aaa9GG2113332E", this);} // tgen
}
static void Test__ZN3aaa9GG2113332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113332E, buf);
    ::aaa::GG2113332 *dp, &lv = *(dp=new (buf) ::aaa::GG2113332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113332E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2113332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2113332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2113332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113332E);
    dp->::aaa::GG2113332::~GG2113332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113332E(Test__ZN3aaa9GG2113332E, "_ZN3aaa9GG2113332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113332C1Ev();
extern void _ZN3aaa9GG2113332D1Ev();
Name_Map name_map__ZN3aaa9GG2113332E[] = {
  NSPAIR(_ZN3aaa9GG2113332C1Ev),
  NSPAIR(_ZN3aaa9GG2113332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2113332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113332E[];
extern void _ZN3aaa9GG21133323barEv();
extern void _ZN3aaa5EE2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21133323barEv,_ZThn20_N3aaa9GG21133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21133323barEv,_ZThn28_N3aaa9GG21133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21133323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2113fooEv,_ZThn8_N3aaa5EE2113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133323barEv,_ZThn20_N3aaa9GG21133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133323barEv,_ZThn28_N3aaa9GG21133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113332E[];
Class_Descriptor cd__ZN3aaa9GG2113332E = {  "_ZN3aaa9GG2113332E", // class name
  bases__ZN3aaa9GG2113332E, 6,
  &(vtc__ZN3aaa9GG2113332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2113333  : ::aaa::EE211 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21133333fooEv
  virtual void  bar(); // _ZN3aaa9GG21133333barEv
  ~GG2113333(); // tgen
  GG2113333(); // tgen
};
//SIG(1 _ZN3aaa9GG2113333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2113333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21133333fooEv");}
void  aaa::GG2113333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21133333barEv");}
aaa::GG2113333 ::~GG2113333(){ note_dtor("_ZN3aaa9GG2113333E", this);} // tgen
aaa::GG2113333 ::GG2113333(){ note_ctor("_ZN3aaa9GG2113333E", this);} // tgen
}
static void Test__ZN3aaa9GG2113333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2113333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2113333E, buf);
    ::aaa::GG2113333 *dp, &lv = *(dp=new (buf) ::aaa::GG2113333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2113333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2113333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE211*), 0, "_ZN3aaa9GG2113333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE211*), ABISELECT(16,8), "_ZN3aaa9GG2113333E");
    check_base_class_offset(lv, (::aaa::EE211*), 0, "_ZN3aaa9GG2113333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2113333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2113333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2113333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2113333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2113333E);
    dp->::aaa::GG2113333::~GG2113333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2113333E(Test__ZN3aaa9GG2113333E, "_ZN3aaa9GG2113333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2113333C1Ev();
extern void _ZN3aaa9GG2113333D1Ev();
Name_Map name_map__ZN3aaa9GG2113333E[] = {
  NSPAIR(_ZN3aaa9GG2113333C1Ev),
  NSPAIR(_ZN3aaa9GG2113333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE211E;
extern VTBL_ENTRY _ZTIN3aaa5EE211E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE211E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2113333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE211E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2113333E[];
extern void _ZN3aaa9GG21133333barEv();
extern void _ZN3aaa9GG21133333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21133333fooEv,_ZThn8_N3aaa9GG21133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133333fooEv,_ZThn20_N3aaa9GG21133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21133333barEv,_ZThn20_N3aaa9GG21133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21133333fooEv,_ZThn28_N3aaa9GG21133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21133333barEv,_ZThn28_N3aaa9GG21133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2113333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21133333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21133333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21133333fooEv,_ZThn8_N3aaa9GG21133333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133333fooEv,_ZThn20_N3aaa9GG21133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21133333barEv,_ZThn20_N3aaa9GG21133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133333fooEv,_ZThn28_N3aaa9GG21133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21133333barEv,_ZThn28_N3aaa9GG21133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2113333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2113333E[];
Class_Descriptor cd__ZN3aaa9GG2113333E = {  "_ZN3aaa9GG2113333E", // class name
  bases__ZN3aaa9GG2113333E, 6,
  &(vtc__ZN3aaa9GG2113333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2113333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2113333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121111  : ::aaa::EE212 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21211113fooEv
  ~GG2121111(); // tgen
  GG2121111(); // tgen
};
//SIG(1 _ZN3aaa9GG2121111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21211113fooEv");}
aaa::GG2121111 ::~GG2121111(){ note_dtor("_ZN3aaa9GG2121111E", this);} // tgen
aaa::GG2121111 ::GG2121111(){ note_ctor("_ZN3aaa9GG2121111E", this);} // tgen
}
static void Test__ZN3aaa9GG2121111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121111E, buf);
    ::aaa::GG2121111 *dp, &lv = *(dp=new (buf) ::aaa::GG2121111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121111E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2121111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2121111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2121111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121111E);
    dp->::aaa::GG2121111::~GG2121111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121111E(Test__ZN3aaa9GG2121111E, "_ZN3aaa9GG2121111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121111C1Ev();
extern void _ZN3aaa9GG2121111D1Ev();
Name_Map name_map__ZN3aaa9GG2121111E[] = {
  NSPAIR(_ZN3aaa9GG2121111C1Ev),
  NSPAIR(_ZN3aaa9GG2121111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2121111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121111E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21211113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21211113fooEv,_ZThn8_N3aaa9GG21211113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21211113fooEv,_ZThn20_N3aaa9GG21211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21211113fooEv,_ZThn28_N3aaa9GG21211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21211113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21211113fooEv,_ZThn8_N3aaa9GG21211113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211113fooEv,_ZThn20_N3aaa9GG21211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21211113fooEv,_ZThn28_N3aaa9GG21211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121111E[];
Class_Descriptor cd__ZN3aaa9GG2121111E = {  "_ZN3aaa9GG2121111E", // class name
  bases__ZN3aaa9GG2121111E, 6,
  &(vtc__ZN3aaa9GG2121111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121112  : ::aaa::EE212 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21211123barEv
  ~GG2121112(); // tgen
  GG2121112(); // tgen
};
//SIG(1 _ZN3aaa9GG2121112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21211123barEv");}
aaa::GG2121112 ::~GG2121112(){ note_dtor("_ZN3aaa9GG2121112E", this);} // tgen
aaa::GG2121112 ::GG2121112(){ note_ctor("_ZN3aaa9GG2121112E", this);} // tgen
}
static void Test__ZN3aaa9GG2121112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121112E, buf);
    ::aaa::GG2121112 *dp, &lv = *(dp=new (buf) ::aaa::GG2121112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121112E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2121112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2121112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2121112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121112E);
    dp->::aaa::GG2121112::~GG2121112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121112E(Test__ZN3aaa9GG2121112E, "_ZN3aaa9GG2121112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121112C1Ev();
extern void _ZN3aaa9GG2121112D1Ev();
Name_Map name_map__ZN3aaa9GG2121112E[] = {
  NSPAIR(_ZN3aaa9GG2121112C1Ev),
  NSPAIR(_ZN3aaa9GG2121112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2121112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121112E[];
extern void _ZN3aaa9GG21211123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121112E[];
Class_Descriptor cd__ZN3aaa9GG2121112E = {  "_ZN3aaa9GG2121112E", // class name
  bases__ZN3aaa9GG2121112E, 6,
  &(vtc__ZN3aaa9GG2121112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121112E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121113  : ::aaa::EE212 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21211133fooEv
  virtual void  bar(); // _ZN3aaa9GG21211133barEv
  ~GG2121113(); // tgen
  GG2121113(); // tgen
};
//SIG(1 _ZN3aaa9GG2121113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21211133fooEv");}
void  aaa::GG2121113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21211133barEv");}
aaa::GG2121113 ::~GG2121113(){ note_dtor("_ZN3aaa9GG2121113E", this);} // tgen
aaa::GG2121113 ::GG2121113(){ note_ctor("_ZN3aaa9GG2121113E", this);} // tgen
}
static void Test__ZN3aaa9GG2121113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121113E, buf);
    ::aaa::GG2121113 *dp, &lv = *(dp=new (buf) ::aaa::GG2121113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121113E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2121113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2121113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2121113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121113E);
    dp->::aaa::GG2121113::~GG2121113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121113E(Test__ZN3aaa9GG2121113E, "_ZN3aaa9GG2121113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121113C1Ev();
extern void _ZN3aaa9GG2121113D1Ev();
Name_Map name_map__ZN3aaa9GG2121113E[] = {
  NSPAIR(_ZN3aaa9GG2121113C1Ev),
  NSPAIR(_ZN3aaa9GG2121113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2121113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121113E[];
extern void _ZN3aaa9GG21211133barEv();
extern void _ZN3aaa9GG21211133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21211133fooEv,_ZThn8_N3aaa9GG21211133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21211133fooEv,_ZThn20_N3aaa9GG21211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21211133fooEv,_ZThn28_N3aaa9GG21211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21211133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21211133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21211133fooEv,_ZThn8_N3aaa9GG21211133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211133fooEv,_ZThn20_N3aaa9GG21211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21211133fooEv,_ZThn28_N3aaa9GG21211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121113E[];
Class_Descriptor cd__ZN3aaa9GG2121113E = {  "_ZN3aaa9GG2121113E", // class name
  bases__ZN3aaa9GG2121113E, 6,
  &(vtc__ZN3aaa9GG2121113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121121  : ::aaa::EE212 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21211213fooEv
  ~GG2121121(); // tgen
  GG2121121(); // tgen
};
//SIG(1 _ZN3aaa9GG2121121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21211213fooEv");}
aaa::GG2121121 ::~GG2121121(){ note_dtor("_ZN3aaa9GG2121121E", this);} // tgen
aaa::GG2121121 ::GG2121121(){ note_ctor("_ZN3aaa9GG2121121E", this);} // tgen
}
static void Test__ZN3aaa9GG2121121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121121E, buf);
    ::aaa::GG2121121 *dp, &lv = *(dp=new (buf) ::aaa::GG2121121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121121E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2121121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2121121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2121121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121121E);
    dp->::aaa::GG2121121::~GG2121121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121121E(Test__ZN3aaa9GG2121121E, "_ZN3aaa9GG2121121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121121C1Ev();
extern void _ZN3aaa9GG2121121D1Ev();
Name_Map name_map__ZN3aaa9GG2121121E[] = {
  NSPAIR(_ZN3aaa9GG2121121C1Ev),
  NSPAIR(_ZN3aaa9GG2121121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2121121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121121E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21211213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21211213fooEv,_ZThn8_N3aaa9GG21211213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21211213fooEv,_ZThn20_N3aaa9GG21211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21211213fooEv,_ZThn28_N3aaa9GG21211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21211213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21211213fooEv,_ZThn8_N3aaa9GG21211213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211213fooEv,_ZThn20_N3aaa9GG21211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21211213fooEv,_ZThn28_N3aaa9GG21211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121121E[];
Class_Descriptor cd__ZN3aaa9GG2121121E = {  "_ZN3aaa9GG2121121E", // class name
  bases__ZN3aaa9GG2121121E, 6,
  &(vtc__ZN3aaa9GG2121121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121122  : ::aaa::EE212 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21211223barEv
  ~GG2121122(); // tgen
  GG2121122(); // tgen
};
//SIG(1 _ZN3aaa9GG2121122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21211223barEv");}
aaa::GG2121122 ::~GG2121122(){ note_dtor("_ZN3aaa9GG2121122E", this);} // tgen
aaa::GG2121122 ::GG2121122(){ note_ctor("_ZN3aaa9GG2121122E", this);} // tgen
}
static void Test__ZN3aaa9GG2121122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121122E, buf);
    ::aaa::GG2121122 *dp, &lv = *(dp=new (buf) ::aaa::GG2121122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121122E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2121122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2121122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2121122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121122E);
    dp->::aaa::GG2121122::~GG2121122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121122E(Test__ZN3aaa9GG2121122E, "_ZN3aaa9GG2121122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121122C1Ev();
extern void _ZN3aaa9GG2121122D1Ev();
Name_Map name_map__ZN3aaa9GG2121122E[] = {
  NSPAIR(_ZN3aaa9GG2121122C1Ev),
  NSPAIR(_ZN3aaa9GG2121122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2121122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121122E[];
extern void _ZN3aaa9GG21211223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21211223barEv,_ZThn20_N3aaa9GG21211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211223barEv,_ZThn20_N3aaa9GG21211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121122E[];
Class_Descriptor cd__ZN3aaa9GG2121122E = {  "_ZN3aaa9GG2121122E", // class name
  bases__ZN3aaa9GG2121122E, 6,
  &(vtc__ZN3aaa9GG2121122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121123  : ::aaa::EE212 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21211233fooEv
  virtual void  bar(); // _ZN3aaa9GG21211233barEv
  ~GG2121123(); // tgen
  GG2121123(); // tgen
};
//SIG(1 _ZN3aaa9GG2121123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21211233fooEv");}
void  aaa::GG2121123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21211233barEv");}
aaa::GG2121123 ::~GG2121123(){ note_dtor("_ZN3aaa9GG2121123E", this);} // tgen
aaa::GG2121123 ::GG2121123(){ note_ctor("_ZN3aaa9GG2121123E", this);} // tgen
}
static void Test__ZN3aaa9GG2121123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121123E, buf);
    ::aaa::GG2121123 *dp, &lv = *(dp=new (buf) ::aaa::GG2121123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121123E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2121123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2121123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2121123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121123E);
    dp->::aaa::GG2121123::~GG2121123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121123E(Test__ZN3aaa9GG2121123E, "_ZN3aaa9GG2121123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121123C1Ev();
extern void _ZN3aaa9GG2121123D1Ev();
Name_Map name_map__ZN3aaa9GG2121123E[] = {
  NSPAIR(_ZN3aaa9GG2121123C1Ev),
  NSPAIR(_ZN3aaa9GG2121123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2121123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121123E[];
extern void _ZN3aaa9GG21211233barEv();
extern void _ZN3aaa9GG21211233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21211233fooEv,_ZThn8_N3aaa9GG21211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21211233fooEv,_ZThn20_N3aaa9GG21211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21211233barEv,_ZThn20_N3aaa9GG21211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21211233fooEv,_ZThn28_N3aaa9GG21211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21211233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21211233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21211233fooEv,_ZThn8_N3aaa9GG21211233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211233fooEv,_ZThn20_N3aaa9GG21211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211233barEv,_ZThn20_N3aaa9GG21211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21211233fooEv,_ZThn28_N3aaa9GG21211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121123E[];
Class_Descriptor cd__ZN3aaa9GG2121123E = {  "_ZN3aaa9GG2121123E", // class name
  bases__ZN3aaa9GG2121123E, 6,
  &(vtc__ZN3aaa9GG2121123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121131  : ::aaa::EE212 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21211313fooEv
  ~GG2121131(); // tgen
  GG2121131(); // tgen
};
//SIG(1 _ZN3aaa9GG2121131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21211313fooEv");}
aaa::GG2121131 ::~GG2121131(){ note_dtor("_ZN3aaa9GG2121131E", this);} // tgen
aaa::GG2121131 ::GG2121131(){ note_ctor("_ZN3aaa9GG2121131E", this);} // tgen
}
static void Test__ZN3aaa9GG2121131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121131E, buf);
    ::aaa::GG2121131 *dp, &lv = *(dp=new (buf) ::aaa::GG2121131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121131E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2121131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2121131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2121131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121131E);
    dp->::aaa::GG2121131::~GG2121131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121131E(Test__ZN3aaa9GG2121131E, "_ZN3aaa9GG2121131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121131C1Ev();
extern void _ZN3aaa9GG2121131D1Ev();
Name_Map name_map__ZN3aaa9GG2121131E[] = {
  NSPAIR(_ZN3aaa9GG2121131C1Ev),
  NSPAIR(_ZN3aaa9GG2121131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2121131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121131E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21211313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21211313fooEv,_ZThn8_N3aaa9GG21211313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21211313fooEv,_ZThn20_N3aaa9GG21211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21211313fooEv,_ZThn28_N3aaa9GG21211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21211313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21211313fooEv,_ZThn8_N3aaa9GG21211313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211313fooEv,_ZThn20_N3aaa9GG21211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21211313fooEv,_ZThn28_N3aaa9GG21211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121131E[];
Class_Descriptor cd__ZN3aaa9GG2121131E = {  "_ZN3aaa9GG2121131E", // class name
  bases__ZN3aaa9GG2121131E, 6,
  &(vtc__ZN3aaa9GG2121131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121132  : ::aaa::EE212 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21211323barEv
  ~GG2121132(); // tgen
  GG2121132(); // tgen
};
//SIG(1 _ZN3aaa9GG2121132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21211323barEv");}
aaa::GG2121132 ::~GG2121132(){ note_dtor("_ZN3aaa9GG2121132E", this);} // tgen
aaa::GG2121132 ::GG2121132(){ note_ctor("_ZN3aaa9GG2121132E", this);} // tgen
}
static void Test__ZN3aaa9GG2121132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121132E, buf);
    ::aaa::GG2121132 *dp, &lv = *(dp=new (buf) ::aaa::GG2121132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121132E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2121132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2121132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2121132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121132E);
    dp->::aaa::GG2121132::~GG2121132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121132E(Test__ZN3aaa9GG2121132E, "_ZN3aaa9GG2121132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121132C1Ev();
extern void _ZN3aaa9GG2121132D1Ev();
Name_Map name_map__ZN3aaa9GG2121132E[] = {
  NSPAIR(_ZN3aaa9GG2121132C1Ev),
  NSPAIR(_ZN3aaa9GG2121132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2121132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121132E[];
extern void _ZN3aaa9GG21211323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21211323barEv,_ZThn20_N3aaa9GG21211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211323barEv,_ZThn20_N3aaa9GG21211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121132E[];
Class_Descriptor cd__ZN3aaa9GG2121132E = {  "_ZN3aaa9GG2121132E", // class name
  bases__ZN3aaa9GG2121132E, 6,
  &(vtc__ZN3aaa9GG2121132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121132E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121133  : ::aaa::EE212 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21211333fooEv
  virtual void  bar(); // _ZN3aaa9GG21211333barEv
  ~GG2121133(); // tgen
  GG2121133(); // tgen
};
//SIG(1 _ZN3aaa9GG2121133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21211333fooEv");}
void  aaa::GG2121133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21211333barEv");}
aaa::GG2121133 ::~GG2121133(){ note_dtor("_ZN3aaa9GG2121133E", this);} // tgen
aaa::GG2121133 ::GG2121133(){ note_ctor("_ZN3aaa9GG2121133E", this);} // tgen
}
static void Test__ZN3aaa9GG2121133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121133E, buf);
    ::aaa::GG2121133 *dp, &lv = *(dp=new (buf) ::aaa::GG2121133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121133E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2121133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2121133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2121133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121133E);
    dp->::aaa::GG2121133::~GG2121133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121133E(Test__ZN3aaa9GG2121133E, "_ZN3aaa9GG2121133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121133C1Ev();
extern void _ZN3aaa9GG2121133D1Ev();
Name_Map name_map__ZN3aaa9GG2121133E[] = {
  NSPAIR(_ZN3aaa9GG2121133C1Ev),
  NSPAIR(_ZN3aaa9GG2121133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2121133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121133E[];
extern void _ZN3aaa9GG21211333barEv();
extern void _ZN3aaa9GG21211333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21211333fooEv,_ZThn8_N3aaa9GG21211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21211333fooEv,_ZThn20_N3aaa9GG21211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21211333barEv,_ZThn20_N3aaa9GG21211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21211333fooEv,_ZThn28_N3aaa9GG21211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21211333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21211333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21211333fooEv,_ZThn8_N3aaa9GG21211333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211333fooEv,_ZThn20_N3aaa9GG21211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21211333barEv,_ZThn20_N3aaa9GG21211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21211333fooEv,_ZThn28_N3aaa9GG21211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121133E[];
Class_Descriptor cd__ZN3aaa9GG2121133E = {  "_ZN3aaa9GG2121133E", // class name
  bases__ZN3aaa9GG2121133E, 6,
  &(vtc__ZN3aaa9GG2121133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121211  : ::aaa::EE212 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21212113fooEv
  ~GG2121211(); // tgen
  GG2121211(); // tgen
};
//SIG(1 _ZN3aaa9GG2121211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21212113fooEv");}
aaa::GG2121211 ::~GG2121211(){ note_dtor("_ZN3aaa9GG2121211E", this);} // tgen
aaa::GG2121211 ::GG2121211(){ note_ctor("_ZN3aaa9GG2121211E", this);} // tgen
}
static void Test__ZN3aaa9GG2121211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121211E, buf);
    ::aaa::GG2121211 *dp, &lv = *(dp=new (buf) ::aaa::GG2121211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121211E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2121211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2121211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2121211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121211E);
    dp->::aaa::GG2121211::~GG2121211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121211E(Test__ZN3aaa9GG2121211E, "_ZN3aaa9GG2121211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121211C1Ev();
extern void _ZN3aaa9GG2121211D1Ev();
Name_Map name_map__ZN3aaa9GG2121211E[] = {
  NSPAIR(_ZN3aaa9GG2121211C1Ev),
  NSPAIR(_ZN3aaa9GG2121211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2121211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121211E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21212113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21212113fooEv,_ZThn8_N3aaa9GG21212113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21212113fooEv,_ZThn20_N3aaa9GG21212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21212113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21212113fooEv,_ZThn8_N3aaa9GG21212113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212113fooEv,_ZThn20_N3aaa9GG21212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121211E[];
Class_Descriptor cd__ZN3aaa9GG2121211E = {  "_ZN3aaa9GG2121211E", // class name
  bases__ZN3aaa9GG2121211E, 6,
  &(vtc__ZN3aaa9GG2121211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121212  : ::aaa::EE212 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21212123barEv
  ~GG2121212(); // tgen
  GG2121212(); // tgen
};
//SIG(1 _ZN3aaa9GG2121212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21212123barEv");}
aaa::GG2121212 ::~GG2121212(){ note_dtor("_ZN3aaa9GG2121212E", this);} // tgen
aaa::GG2121212 ::GG2121212(){ note_ctor("_ZN3aaa9GG2121212E", this);} // tgen
}
static void Test__ZN3aaa9GG2121212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121212E, buf);
    ::aaa::GG2121212 *dp, &lv = *(dp=new (buf) ::aaa::GG2121212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121212E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2121212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2121212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2121212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121212E);
    dp->::aaa::GG2121212::~GG2121212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121212E(Test__ZN3aaa9GG2121212E, "_ZN3aaa9GG2121212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121212C1Ev();
extern void _ZN3aaa9GG2121212D1Ev();
Name_Map name_map__ZN3aaa9GG2121212E[] = {
  NSPAIR(_ZN3aaa9GG2121212C1Ev),
  NSPAIR(_ZN3aaa9GG2121212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2121212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121212E[];
extern void _ZN3aaa9GG21212123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21212123barEv,_ZThn28_N3aaa9GG21212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21212123barEv,_ZThn28_N3aaa9GG21212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121212E[];
Class_Descriptor cd__ZN3aaa9GG2121212E = {  "_ZN3aaa9GG2121212E", // class name
  bases__ZN3aaa9GG2121212E, 6,
  &(vtc__ZN3aaa9GG2121212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121212E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121213  : ::aaa::EE212 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21212133fooEv
  virtual void  bar(); // _ZN3aaa9GG21212133barEv
  ~GG2121213(); // tgen
  GG2121213(); // tgen
};
//SIG(1 _ZN3aaa9GG2121213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21212133fooEv");}
void  aaa::GG2121213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21212133barEv");}
aaa::GG2121213 ::~GG2121213(){ note_dtor("_ZN3aaa9GG2121213E", this);} // tgen
aaa::GG2121213 ::GG2121213(){ note_ctor("_ZN3aaa9GG2121213E", this);} // tgen
}
static void Test__ZN3aaa9GG2121213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121213E, buf);
    ::aaa::GG2121213 *dp, &lv = *(dp=new (buf) ::aaa::GG2121213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121213E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2121213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2121213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2121213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121213E);
    dp->::aaa::GG2121213::~GG2121213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121213E(Test__ZN3aaa9GG2121213E, "_ZN3aaa9GG2121213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121213C1Ev();
extern void _ZN3aaa9GG2121213D1Ev();
Name_Map name_map__ZN3aaa9GG2121213E[] = {
  NSPAIR(_ZN3aaa9GG2121213C1Ev),
  NSPAIR(_ZN3aaa9GG2121213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2121213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121213E[];
extern void _ZN3aaa9GG21212133barEv();
extern void _ZN3aaa9GG21212133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21212133fooEv,_ZThn8_N3aaa9GG21212133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21212133fooEv,_ZThn20_N3aaa9GG21212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21212133barEv,_ZThn28_N3aaa9GG21212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21212133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21212133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21212133fooEv,_ZThn8_N3aaa9GG21212133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212133fooEv,_ZThn20_N3aaa9GG21212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21212133barEv,_ZThn28_N3aaa9GG21212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121213E[];
Class_Descriptor cd__ZN3aaa9GG2121213E = {  "_ZN3aaa9GG2121213E", // class name
  bases__ZN3aaa9GG2121213E, 6,
  &(vtc__ZN3aaa9GG2121213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121221  : ::aaa::EE212 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21212213fooEv
  ~GG2121221(); // tgen
  GG2121221(); // tgen
};
//SIG(1 _ZN3aaa9GG2121221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21212213fooEv");}
aaa::GG2121221 ::~GG2121221(){ note_dtor("_ZN3aaa9GG2121221E", this);} // tgen
aaa::GG2121221 ::GG2121221(){ note_ctor("_ZN3aaa9GG2121221E", this);} // tgen
}
static void Test__ZN3aaa9GG2121221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121221E, buf);
    ::aaa::GG2121221 *dp, &lv = *(dp=new (buf) ::aaa::GG2121221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121221E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2121221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2121221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2121221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121221E);
    dp->::aaa::GG2121221::~GG2121221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121221E(Test__ZN3aaa9GG2121221E, "_ZN3aaa9GG2121221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121221C1Ev();
extern void _ZN3aaa9GG2121221D1Ev();
Name_Map name_map__ZN3aaa9GG2121221E[] = {
  NSPAIR(_ZN3aaa9GG2121221C1Ev),
  NSPAIR(_ZN3aaa9GG2121221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2121221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121221E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21212213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21212213fooEv,_ZThn8_N3aaa9GG21212213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21212213fooEv,_ZThn20_N3aaa9GG21212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21212213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21212213fooEv,_ZThn8_N3aaa9GG21212213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212213fooEv,_ZThn20_N3aaa9GG21212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121221E[];
Class_Descriptor cd__ZN3aaa9GG2121221E = {  "_ZN3aaa9GG2121221E", // class name
  bases__ZN3aaa9GG2121221E, 6,
  &(vtc__ZN3aaa9GG2121221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121222  : ::aaa::EE212 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21212223barEv
  ~GG2121222(); // tgen
  GG2121222(); // tgen
};
//SIG(1 _ZN3aaa9GG2121222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21212223barEv");}
aaa::GG2121222 ::~GG2121222(){ note_dtor("_ZN3aaa9GG2121222E", this);} // tgen
aaa::GG2121222 ::GG2121222(){ note_ctor("_ZN3aaa9GG2121222E", this);} // tgen
}
static void Test__ZN3aaa9GG2121222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121222E, buf);
    ::aaa::GG2121222 *dp, &lv = *(dp=new (buf) ::aaa::GG2121222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121222E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2121222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2121222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2121222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121222E);
    dp->::aaa::GG2121222::~GG2121222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121222E(Test__ZN3aaa9GG2121222E, "_ZN3aaa9GG2121222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121222C1Ev();
extern void _ZN3aaa9GG2121222D1Ev();
Name_Map name_map__ZN3aaa9GG2121222E[] = {
  NSPAIR(_ZN3aaa9GG2121222C1Ev),
  NSPAIR(_ZN3aaa9GG2121222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2121222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121222E[];
extern void _ZN3aaa9GG21212223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21212223barEv,_ZThn20_N3aaa9GG21212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21212223barEv,_ZThn28_N3aaa9GG21212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212223barEv,_ZThn20_N3aaa9GG21212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21212223barEv,_ZThn28_N3aaa9GG21212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121222E[];
Class_Descriptor cd__ZN3aaa9GG2121222E = {  "_ZN3aaa9GG2121222E", // class name
  bases__ZN3aaa9GG2121222E, 6,
  &(vtc__ZN3aaa9GG2121222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121223  : ::aaa::EE212 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21212233fooEv
  virtual void  bar(); // _ZN3aaa9GG21212233barEv
  ~GG2121223(); // tgen
  GG2121223(); // tgen
};
//SIG(1 _ZN3aaa9GG2121223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21212233fooEv");}
void  aaa::GG2121223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21212233barEv");}
aaa::GG2121223 ::~GG2121223(){ note_dtor("_ZN3aaa9GG2121223E", this);} // tgen
aaa::GG2121223 ::GG2121223(){ note_ctor("_ZN3aaa9GG2121223E", this);} // tgen
}
static void Test__ZN3aaa9GG2121223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121223E, buf);
    ::aaa::GG2121223 *dp, &lv = *(dp=new (buf) ::aaa::GG2121223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121223E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2121223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2121223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2121223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121223E);
    dp->::aaa::GG2121223::~GG2121223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121223E(Test__ZN3aaa9GG2121223E, "_ZN3aaa9GG2121223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121223C1Ev();
extern void _ZN3aaa9GG2121223D1Ev();
Name_Map name_map__ZN3aaa9GG2121223E[] = {
  NSPAIR(_ZN3aaa9GG2121223C1Ev),
  NSPAIR(_ZN3aaa9GG2121223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2121223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121223E[];
extern void _ZN3aaa9GG21212233barEv();
extern void _ZN3aaa9GG21212233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21212233fooEv,_ZThn8_N3aaa9GG21212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21212233fooEv,_ZThn20_N3aaa9GG21212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21212233barEv,_ZThn20_N3aaa9GG21212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21212233barEv,_ZThn28_N3aaa9GG21212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21212233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21212233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21212233fooEv,_ZThn8_N3aaa9GG21212233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212233fooEv,_ZThn20_N3aaa9GG21212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212233barEv,_ZThn20_N3aaa9GG21212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21212233barEv,_ZThn28_N3aaa9GG21212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121223E[];
Class_Descriptor cd__ZN3aaa9GG2121223E = {  "_ZN3aaa9GG2121223E", // class name
  bases__ZN3aaa9GG2121223E, 6,
  &(vtc__ZN3aaa9GG2121223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121231  : ::aaa::EE212 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21212313fooEv
  ~GG2121231(); // tgen
  GG2121231(); // tgen
};
//SIG(1 _ZN3aaa9GG2121231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21212313fooEv");}
aaa::GG2121231 ::~GG2121231(){ note_dtor("_ZN3aaa9GG2121231E", this);} // tgen
aaa::GG2121231 ::GG2121231(){ note_ctor("_ZN3aaa9GG2121231E", this);} // tgen
}
static void Test__ZN3aaa9GG2121231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121231E, buf);
    ::aaa::GG2121231 *dp, &lv = *(dp=new (buf) ::aaa::GG2121231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121231E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2121231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2121231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2121231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121231E);
    dp->::aaa::GG2121231::~GG2121231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121231E(Test__ZN3aaa9GG2121231E, "_ZN3aaa9GG2121231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121231C1Ev();
extern void _ZN3aaa9GG2121231D1Ev();
Name_Map name_map__ZN3aaa9GG2121231E[] = {
  NSPAIR(_ZN3aaa9GG2121231C1Ev),
  NSPAIR(_ZN3aaa9GG2121231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2121231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121231E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21212313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21212313fooEv,_ZThn8_N3aaa9GG21212313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21212313fooEv,_ZThn20_N3aaa9GG21212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21212313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21212313fooEv,_ZThn8_N3aaa9GG21212313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212313fooEv,_ZThn20_N3aaa9GG21212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121231E[];
Class_Descriptor cd__ZN3aaa9GG2121231E = {  "_ZN3aaa9GG2121231E", // class name
  bases__ZN3aaa9GG2121231E, 6,
  &(vtc__ZN3aaa9GG2121231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121232  : ::aaa::EE212 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21212323barEv
  ~GG2121232(); // tgen
  GG2121232(); // tgen
};
//SIG(1 _ZN3aaa9GG2121232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21212323barEv");}
aaa::GG2121232 ::~GG2121232(){ note_dtor("_ZN3aaa9GG2121232E", this);} // tgen
aaa::GG2121232 ::GG2121232(){ note_ctor("_ZN3aaa9GG2121232E", this);} // tgen
}
static void Test__ZN3aaa9GG2121232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121232E, buf);
    ::aaa::GG2121232 *dp, &lv = *(dp=new (buf) ::aaa::GG2121232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121232E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2121232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2121232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2121232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121232E);
    dp->::aaa::GG2121232::~GG2121232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121232E(Test__ZN3aaa9GG2121232E, "_ZN3aaa9GG2121232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121232C1Ev();
extern void _ZN3aaa9GG2121232D1Ev();
Name_Map name_map__ZN3aaa9GG2121232E[] = {
  NSPAIR(_ZN3aaa9GG2121232C1Ev),
  NSPAIR(_ZN3aaa9GG2121232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2121232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121232E[];
extern void _ZN3aaa9GG21212323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21212323barEv,_ZThn20_N3aaa9GG21212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21212323barEv,_ZThn28_N3aaa9GG21212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212323barEv,_ZThn20_N3aaa9GG21212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21212323barEv,_ZThn28_N3aaa9GG21212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121232E[];
Class_Descriptor cd__ZN3aaa9GG2121232E = {  "_ZN3aaa9GG2121232E", // class name
  bases__ZN3aaa9GG2121232E, 6,
  &(vtc__ZN3aaa9GG2121232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121232E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121233  : ::aaa::EE212 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21212333fooEv
  virtual void  bar(); // _ZN3aaa9GG21212333barEv
  ~GG2121233(); // tgen
  GG2121233(); // tgen
};
//SIG(1 _ZN3aaa9GG2121233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21212333fooEv");}
void  aaa::GG2121233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21212333barEv");}
aaa::GG2121233 ::~GG2121233(){ note_dtor("_ZN3aaa9GG2121233E", this);} // tgen
aaa::GG2121233 ::GG2121233(){ note_ctor("_ZN3aaa9GG2121233E", this);} // tgen
}
static void Test__ZN3aaa9GG2121233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121233E, buf);
    ::aaa::GG2121233 *dp, &lv = *(dp=new (buf) ::aaa::GG2121233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121233E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2121233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2121233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2121233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121233E);
    dp->::aaa::GG2121233::~GG2121233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121233E(Test__ZN3aaa9GG2121233E, "_ZN3aaa9GG2121233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121233C1Ev();
extern void _ZN3aaa9GG2121233D1Ev();
Name_Map name_map__ZN3aaa9GG2121233E[] = {
  NSPAIR(_ZN3aaa9GG2121233C1Ev),
  NSPAIR(_ZN3aaa9GG2121233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2121233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121233E[];
extern void _ZN3aaa9GG21212333barEv();
extern void _ZN3aaa9GG21212333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21212333fooEv,_ZThn8_N3aaa9GG21212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21212333fooEv,_ZThn20_N3aaa9GG21212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21212333barEv,_ZThn20_N3aaa9GG21212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21212333barEv,_ZThn28_N3aaa9GG21212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21212333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21212333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21212333fooEv,_ZThn8_N3aaa9GG21212333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212333fooEv,_ZThn20_N3aaa9GG21212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21212333barEv,_ZThn20_N3aaa9GG21212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21212333barEv,_ZThn28_N3aaa9GG21212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121233E[];
Class_Descriptor cd__ZN3aaa9GG2121233E = {  "_ZN3aaa9GG2121233E", // class name
  bases__ZN3aaa9GG2121233E, 6,
  &(vtc__ZN3aaa9GG2121233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121311  : ::aaa::EE212 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21213113fooEv
  ~GG2121311(); // tgen
  GG2121311(); // tgen
};
//SIG(1 _ZN3aaa9GG2121311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21213113fooEv");}
aaa::GG2121311 ::~GG2121311(){ note_dtor("_ZN3aaa9GG2121311E", this);} // tgen
aaa::GG2121311 ::GG2121311(){ note_ctor("_ZN3aaa9GG2121311E", this);} // tgen
}
static void Test__ZN3aaa9GG2121311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121311E, buf);
    ::aaa::GG2121311 *dp, &lv = *(dp=new (buf) ::aaa::GG2121311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121311E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2121311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2121311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2121311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121311E);
    dp->::aaa::GG2121311::~GG2121311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121311E(Test__ZN3aaa9GG2121311E, "_ZN3aaa9GG2121311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121311C1Ev();
extern void _ZN3aaa9GG2121311D1Ev();
Name_Map name_map__ZN3aaa9GG2121311E[] = {
  NSPAIR(_ZN3aaa9GG2121311C1Ev),
  NSPAIR(_ZN3aaa9GG2121311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2121311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121311E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21213113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21213113fooEv,_ZThn8_N3aaa9GG21213113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21213113fooEv,_ZThn20_N3aaa9GG21213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213113fooEv,_ZThn28_N3aaa9GG21213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21213113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21213113fooEv,_ZThn8_N3aaa9GG21213113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213113fooEv,_ZThn20_N3aaa9GG21213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213113fooEv,_ZThn28_N3aaa9GG21213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121311E[];
Class_Descriptor cd__ZN3aaa9GG2121311E = {  "_ZN3aaa9GG2121311E", // class name
  bases__ZN3aaa9GG2121311E, 6,
  &(vtc__ZN3aaa9GG2121311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121312  : ::aaa::EE212 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21213123barEv
  ~GG2121312(); // tgen
  GG2121312(); // tgen
};
//SIG(1 _ZN3aaa9GG2121312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21213123barEv");}
aaa::GG2121312 ::~GG2121312(){ note_dtor("_ZN3aaa9GG2121312E", this);} // tgen
aaa::GG2121312 ::GG2121312(){ note_ctor("_ZN3aaa9GG2121312E", this);} // tgen
}
static void Test__ZN3aaa9GG2121312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121312E, buf);
    ::aaa::GG2121312 *dp, &lv = *(dp=new (buf) ::aaa::GG2121312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121312E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2121312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2121312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2121312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121312E);
    dp->::aaa::GG2121312::~GG2121312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121312E(Test__ZN3aaa9GG2121312E, "_ZN3aaa9GG2121312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121312C1Ev();
extern void _ZN3aaa9GG2121312D1Ev();
Name_Map name_map__ZN3aaa9GG2121312E[] = {
  NSPAIR(_ZN3aaa9GG2121312C1Ev),
  NSPAIR(_ZN3aaa9GG2121312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2121312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121312E[];
extern void _ZN3aaa9GG21213123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213123barEv,_ZThn28_N3aaa9GG21213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213123barEv,_ZThn28_N3aaa9GG21213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121312E[];
Class_Descriptor cd__ZN3aaa9GG2121312E = {  "_ZN3aaa9GG2121312E", // class name
  bases__ZN3aaa9GG2121312E, 6,
  &(vtc__ZN3aaa9GG2121312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121312E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121313  : ::aaa::EE212 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21213133fooEv
  virtual void  bar(); // _ZN3aaa9GG21213133barEv
  ~GG2121313(); // tgen
  GG2121313(); // tgen
};
//SIG(1 _ZN3aaa9GG2121313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21213133fooEv");}
void  aaa::GG2121313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21213133barEv");}
aaa::GG2121313 ::~GG2121313(){ note_dtor("_ZN3aaa9GG2121313E", this);} // tgen
aaa::GG2121313 ::GG2121313(){ note_ctor("_ZN3aaa9GG2121313E", this);} // tgen
}
static void Test__ZN3aaa9GG2121313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121313E, buf);
    ::aaa::GG2121313 *dp, &lv = *(dp=new (buf) ::aaa::GG2121313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121313E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2121313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2121313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2121313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121313E);
    dp->::aaa::GG2121313::~GG2121313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121313E(Test__ZN3aaa9GG2121313E, "_ZN3aaa9GG2121313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121313C1Ev();
extern void _ZN3aaa9GG2121313D1Ev();
Name_Map name_map__ZN3aaa9GG2121313E[] = {
  NSPAIR(_ZN3aaa9GG2121313C1Ev),
  NSPAIR(_ZN3aaa9GG2121313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2121313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121313E[];
extern void _ZN3aaa9GG21213133barEv();
extern void _ZN3aaa9GG21213133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21213133fooEv,_ZThn8_N3aaa9GG21213133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21213133fooEv,_ZThn20_N3aaa9GG21213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213133fooEv,_ZThn28_N3aaa9GG21213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213133barEv,_ZThn28_N3aaa9GG21213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21213133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21213133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21213133fooEv,_ZThn8_N3aaa9GG21213133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213133fooEv,_ZThn20_N3aaa9GG21213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213133fooEv,_ZThn28_N3aaa9GG21213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213133barEv,_ZThn28_N3aaa9GG21213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121313E[];
Class_Descriptor cd__ZN3aaa9GG2121313E = {  "_ZN3aaa9GG2121313E", // class name
  bases__ZN3aaa9GG2121313E, 6,
  &(vtc__ZN3aaa9GG2121313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121321  : ::aaa::EE212 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21213213fooEv
  ~GG2121321(); // tgen
  GG2121321(); // tgen
};
//SIG(1 _ZN3aaa9GG2121321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21213213fooEv");}
aaa::GG2121321 ::~GG2121321(){ note_dtor("_ZN3aaa9GG2121321E", this);} // tgen
aaa::GG2121321 ::GG2121321(){ note_ctor("_ZN3aaa9GG2121321E", this);} // tgen
}
static void Test__ZN3aaa9GG2121321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121321E, buf);
    ::aaa::GG2121321 *dp, &lv = *(dp=new (buf) ::aaa::GG2121321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121321E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2121321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2121321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2121321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121321E);
    dp->::aaa::GG2121321::~GG2121321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121321E(Test__ZN3aaa9GG2121321E, "_ZN3aaa9GG2121321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121321C1Ev();
extern void _ZN3aaa9GG2121321D1Ev();
Name_Map name_map__ZN3aaa9GG2121321E[] = {
  NSPAIR(_ZN3aaa9GG2121321C1Ev),
  NSPAIR(_ZN3aaa9GG2121321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2121321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121321E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21213213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21213213fooEv,_ZThn8_N3aaa9GG21213213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21213213fooEv,_ZThn20_N3aaa9GG21213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21213213fooEv,_ZThn28_N3aaa9GG21213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21213213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21213213fooEv,_ZThn8_N3aaa9GG21213213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213213fooEv,_ZThn20_N3aaa9GG21213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213213fooEv,_ZThn28_N3aaa9GG21213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121321E[];
Class_Descriptor cd__ZN3aaa9GG2121321E = {  "_ZN3aaa9GG2121321E", // class name
  bases__ZN3aaa9GG2121321E, 6,
  &(vtc__ZN3aaa9GG2121321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121322  : ::aaa::EE212 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21213223barEv
  ~GG2121322(); // tgen
  GG2121322(); // tgen
};
//SIG(1 _ZN3aaa9GG2121322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21213223barEv");}
aaa::GG2121322 ::~GG2121322(){ note_dtor("_ZN3aaa9GG2121322E", this);} // tgen
aaa::GG2121322 ::GG2121322(){ note_ctor("_ZN3aaa9GG2121322E", this);} // tgen
}
static void Test__ZN3aaa9GG2121322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121322E, buf);
    ::aaa::GG2121322 *dp, &lv = *(dp=new (buf) ::aaa::GG2121322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121322E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2121322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2121322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2121322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121322E);
    dp->::aaa::GG2121322::~GG2121322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121322E(Test__ZN3aaa9GG2121322E, "_ZN3aaa9GG2121322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121322C1Ev();
extern void _ZN3aaa9GG2121322D1Ev();
Name_Map name_map__ZN3aaa9GG2121322E[] = {
  NSPAIR(_ZN3aaa9GG2121322C1Ev),
  NSPAIR(_ZN3aaa9GG2121322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2121322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121322E[];
extern void _ZN3aaa9GG21213223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21213223barEv,_ZThn20_N3aaa9GG21213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21213223barEv,_ZThn28_N3aaa9GG21213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213223barEv,_ZThn20_N3aaa9GG21213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213223barEv,_ZThn28_N3aaa9GG21213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121322E[];
Class_Descriptor cd__ZN3aaa9GG2121322E = {  "_ZN3aaa9GG2121322E", // class name
  bases__ZN3aaa9GG2121322E, 6,
  &(vtc__ZN3aaa9GG2121322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121323  : ::aaa::EE212 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21213233fooEv
  virtual void  bar(); // _ZN3aaa9GG21213233barEv
  ~GG2121323(); // tgen
  GG2121323(); // tgen
};
//SIG(1 _ZN3aaa9GG2121323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21213233fooEv");}
void  aaa::GG2121323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21213233barEv");}
aaa::GG2121323 ::~GG2121323(){ note_dtor("_ZN3aaa9GG2121323E", this);} // tgen
aaa::GG2121323 ::GG2121323(){ note_ctor("_ZN3aaa9GG2121323E", this);} // tgen
}
static void Test__ZN3aaa9GG2121323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121323E, buf);
    ::aaa::GG2121323 *dp, &lv = *(dp=new (buf) ::aaa::GG2121323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121323E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2121323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2121323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2121323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121323E);
    dp->::aaa::GG2121323::~GG2121323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121323E(Test__ZN3aaa9GG2121323E, "_ZN3aaa9GG2121323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121323C1Ev();
extern void _ZN3aaa9GG2121323D1Ev();
Name_Map name_map__ZN3aaa9GG2121323E[] = {
  NSPAIR(_ZN3aaa9GG2121323C1Ev),
  NSPAIR(_ZN3aaa9GG2121323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2121323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121323E[];
extern void _ZN3aaa9GG21213233barEv();
extern void _ZN3aaa9GG21213233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21213233fooEv,_ZThn8_N3aaa9GG21213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21213233fooEv,_ZThn20_N3aaa9GG21213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21213233barEv,_ZThn20_N3aaa9GG21213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213233fooEv,_ZThn28_N3aaa9GG21213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213233barEv,_ZThn28_N3aaa9GG21213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21213233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21213233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21213233fooEv,_ZThn8_N3aaa9GG21213233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213233fooEv,_ZThn20_N3aaa9GG21213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213233barEv,_ZThn20_N3aaa9GG21213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213233fooEv,_ZThn28_N3aaa9GG21213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213233barEv,_ZThn28_N3aaa9GG21213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121323E[];
Class_Descriptor cd__ZN3aaa9GG2121323E = {  "_ZN3aaa9GG2121323E", // class name
  bases__ZN3aaa9GG2121323E, 6,
  &(vtc__ZN3aaa9GG2121323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121331  : ::aaa::EE212 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21213313fooEv
  ~GG2121331(); // tgen
  GG2121331(); // tgen
};
//SIG(1 _ZN3aaa9GG2121331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21213313fooEv");}
aaa::GG2121331 ::~GG2121331(){ note_dtor("_ZN3aaa9GG2121331E", this);} // tgen
aaa::GG2121331 ::GG2121331(){ note_ctor("_ZN3aaa9GG2121331E", this);} // tgen
}
static void Test__ZN3aaa9GG2121331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121331E, buf);
    ::aaa::GG2121331 *dp, &lv = *(dp=new (buf) ::aaa::GG2121331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121331E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2121331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2121331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2121331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121331E);
    dp->::aaa::GG2121331::~GG2121331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121331E(Test__ZN3aaa9GG2121331E, "_ZN3aaa9GG2121331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121331C1Ev();
extern void _ZN3aaa9GG2121331D1Ev();
Name_Map name_map__ZN3aaa9GG2121331E[] = {
  NSPAIR(_ZN3aaa9GG2121331C1Ev),
  NSPAIR(_ZN3aaa9GG2121331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2121331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121331E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21213313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21213313fooEv,_ZThn8_N3aaa9GG21213313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21213313fooEv,_ZThn20_N3aaa9GG21213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21213313fooEv,_ZThn28_N3aaa9GG21213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21213313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21213313fooEv,_ZThn8_N3aaa9GG21213313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213313fooEv,_ZThn20_N3aaa9GG21213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213313fooEv,_ZThn28_N3aaa9GG21213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121331E[];
Class_Descriptor cd__ZN3aaa9GG2121331E = {  "_ZN3aaa9GG2121331E", // class name
  bases__ZN3aaa9GG2121331E, 6,
  &(vtc__ZN3aaa9GG2121331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121332  : ::aaa::EE212 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21213323barEv
  ~GG2121332(); // tgen
  GG2121332(); // tgen
};
//SIG(1 _ZN3aaa9GG2121332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2121332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21213323barEv");}
aaa::GG2121332 ::~GG2121332(){ note_dtor("_ZN3aaa9GG2121332E", this);} // tgen
aaa::GG2121332 ::GG2121332(){ note_ctor("_ZN3aaa9GG2121332E", this);} // tgen
}
static void Test__ZN3aaa9GG2121332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121332E, buf);
    ::aaa::GG2121332 *dp, &lv = *(dp=new (buf) ::aaa::GG2121332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121332E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2121332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2121332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2121332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121332E);
    dp->::aaa::GG2121332::~GG2121332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121332E(Test__ZN3aaa9GG2121332E, "_ZN3aaa9GG2121332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121332C1Ev();
extern void _ZN3aaa9GG2121332D1Ev();
Name_Map name_map__ZN3aaa9GG2121332E[] = {
  NSPAIR(_ZN3aaa9GG2121332C1Ev),
  NSPAIR(_ZN3aaa9GG2121332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2121332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121332E[];
extern void _ZN3aaa9GG21213323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21213323barEv,_ZThn20_N3aaa9GG21213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213323barEv,_ZThn28_N3aaa9GG21213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213323barEv,_ZThn20_N3aaa9GG21213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213323barEv,_ZThn28_N3aaa9GG21213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121332E[];
Class_Descriptor cd__ZN3aaa9GG2121332E = {  "_ZN3aaa9GG2121332E", // class name
  bases__ZN3aaa9GG2121332E, 6,
  &(vtc__ZN3aaa9GG2121332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121332E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2121333  : ::aaa::EE212 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21213333fooEv
  virtual void  bar(); // _ZN3aaa9GG21213333barEv
  ~GG2121333(); // tgen
  GG2121333(); // tgen
};
//SIG(1 _ZN3aaa9GG2121333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2121333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21213333fooEv");}
void  aaa::GG2121333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21213333barEv");}
aaa::GG2121333 ::~GG2121333(){ note_dtor("_ZN3aaa9GG2121333E", this);} // tgen
aaa::GG2121333 ::GG2121333(){ note_ctor("_ZN3aaa9GG2121333E", this);} // tgen
}
static void Test__ZN3aaa9GG2121333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2121333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2121333E, buf);
    ::aaa::GG2121333 *dp, &lv = *(dp=new (buf) ::aaa::GG2121333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2121333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2121333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2121333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2121333E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2121333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2121333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2121333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2121333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2121333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2121333E);
    dp->::aaa::GG2121333::~GG2121333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2121333E(Test__ZN3aaa9GG2121333E, "_ZN3aaa9GG2121333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2121333C1Ev();
extern void _ZN3aaa9GG2121333D1Ev();
Name_Map name_map__ZN3aaa9GG2121333E[] = {
  NSPAIR(_ZN3aaa9GG2121333C1Ev),
  NSPAIR(_ZN3aaa9GG2121333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2121333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2121333E[];
extern void _ZN3aaa9GG21213333barEv();
extern void _ZN3aaa9GG21213333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21213333fooEv,_ZThn8_N3aaa9GG21213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21213333fooEv,_ZThn20_N3aaa9GG21213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21213333barEv,_ZThn20_N3aaa9GG21213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213333fooEv,_ZThn28_N3aaa9GG21213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21213333barEv,_ZThn28_N3aaa9GG21213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2121333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21213333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21213333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21213333fooEv,_ZThn8_N3aaa9GG21213333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213333fooEv,_ZThn20_N3aaa9GG21213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21213333barEv,_ZThn20_N3aaa9GG21213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213333fooEv,_ZThn28_N3aaa9GG21213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21213333barEv,_ZThn28_N3aaa9GG21213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2121333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2121333E[];
Class_Descriptor cd__ZN3aaa9GG2121333E = {  "_ZN3aaa9GG2121333E", // class name
  bases__ZN3aaa9GG2121333E, 6,
  &(vtc__ZN3aaa9GG2121333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2121333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2121333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122111  : ::aaa::EE212 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21221113fooEv
  ~GG2122111(); // tgen
  GG2122111(); // tgen
};
//SIG(1 _ZN3aaa9GG2122111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21221113fooEv");}
aaa::GG2122111 ::~GG2122111(){ note_dtor("_ZN3aaa9GG2122111E", this);} // tgen
aaa::GG2122111 ::GG2122111(){ note_ctor("_ZN3aaa9GG2122111E", this);} // tgen
}
static void Test__ZN3aaa9GG2122111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122111E, buf);
    ::aaa::GG2122111 *dp, &lv = *(dp=new (buf) ::aaa::GG2122111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122111E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2122111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2122111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2122111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122111E);
    dp->::aaa::GG2122111::~GG2122111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122111E(Test__ZN3aaa9GG2122111E, "_ZN3aaa9GG2122111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122111C1Ev();
extern void _ZN3aaa9GG2122111D1Ev();
Name_Map name_map__ZN3aaa9GG2122111E[] = {
  NSPAIR(_ZN3aaa9GG2122111C1Ev),
  NSPAIR(_ZN3aaa9GG2122111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2122111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122111E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21221113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21221113fooEv,_ZThn8_N3aaa9GG21221113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21221113fooEv,_ZThn20_N3aaa9GG21221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21221113fooEv,_ZThn28_N3aaa9GG21221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21221113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21221113fooEv,_ZThn8_N3aaa9GG21221113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221113fooEv,_ZThn20_N3aaa9GG21221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21221113fooEv,_ZThn28_N3aaa9GG21221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122111E[];
Class_Descriptor cd__ZN3aaa9GG2122111E = {  "_ZN3aaa9GG2122111E", // class name
  bases__ZN3aaa9GG2122111E, 6,
  &(vtc__ZN3aaa9GG2122111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122112  : ::aaa::EE212 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21221123barEv
  ~GG2122112(); // tgen
  GG2122112(); // tgen
};
//SIG(1 _ZN3aaa9GG2122112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21221123barEv");}
aaa::GG2122112 ::~GG2122112(){ note_dtor("_ZN3aaa9GG2122112E", this);} // tgen
aaa::GG2122112 ::GG2122112(){ note_ctor("_ZN3aaa9GG2122112E", this);} // tgen
}
static void Test__ZN3aaa9GG2122112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122112E, buf);
    ::aaa::GG2122112 *dp, &lv = *(dp=new (buf) ::aaa::GG2122112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122112E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2122112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2122112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2122112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122112E);
    dp->::aaa::GG2122112::~GG2122112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122112E(Test__ZN3aaa9GG2122112E, "_ZN3aaa9GG2122112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122112C1Ev();
extern void _ZN3aaa9GG2122112D1Ev();
Name_Map name_map__ZN3aaa9GG2122112E[] = {
  NSPAIR(_ZN3aaa9GG2122112C1Ev),
  NSPAIR(_ZN3aaa9GG2122112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2122112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122112E[];
extern void _ZN3aaa9GG21221123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21221123barEv,_ZThn20_N3aaa9GG21221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221123barEv,_ZThn20_N3aaa9GG21221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122112E[];
Class_Descriptor cd__ZN3aaa9GG2122112E = {  "_ZN3aaa9GG2122112E", // class name
  bases__ZN3aaa9GG2122112E, 6,
  &(vtc__ZN3aaa9GG2122112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122113  : ::aaa::EE212 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21221133fooEv
  virtual void  bar(); // _ZN3aaa9GG21221133barEv
  ~GG2122113(); // tgen
  GG2122113(); // tgen
};
//SIG(1 _ZN3aaa9GG2122113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21221133fooEv");}
void  aaa::GG2122113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21221133barEv");}
aaa::GG2122113 ::~GG2122113(){ note_dtor("_ZN3aaa9GG2122113E", this);} // tgen
aaa::GG2122113 ::GG2122113(){ note_ctor("_ZN3aaa9GG2122113E", this);} // tgen
}
static void Test__ZN3aaa9GG2122113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122113E, buf);
    ::aaa::GG2122113 *dp, &lv = *(dp=new (buf) ::aaa::GG2122113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122113E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2122113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2122113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2122113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122113E);
    dp->::aaa::GG2122113::~GG2122113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122113E(Test__ZN3aaa9GG2122113E, "_ZN3aaa9GG2122113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122113C1Ev();
extern void _ZN3aaa9GG2122113D1Ev();
Name_Map name_map__ZN3aaa9GG2122113E[] = {
  NSPAIR(_ZN3aaa9GG2122113C1Ev),
  NSPAIR(_ZN3aaa9GG2122113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2122113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122113E[];
extern void _ZN3aaa9GG21221133barEv();
extern void _ZN3aaa9GG21221133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21221133fooEv,_ZThn8_N3aaa9GG21221133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21221133barEv,_ZThn20_N3aaa9GG21221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21221133fooEv,_ZThn20_N3aaa9GG21221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21221133fooEv,_ZThn28_N3aaa9GG21221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21221133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21221133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21221133fooEv,_ZThn8_N3aaa9GG21221133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221133barEv,_ZThn20_N3aaa9GG21221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221133fooEv,_ZThn20_N3aaa9GG21221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21221133fooEv,_ZThn28_N3aaa9GG21221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122113E[];
Class_Descriptor cd__ZN3aaa9GG2122113E = {  "_ZN3aaa9GG2122113E", // class name
  bases__ZN3aaa9GG2122113E, 6,
  &(vtc__ZN3aaa9GG2122113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122121  : ::aaa::EE212 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21221213fooEv
  ~GG2122121(); // tgen
  GG2122121(); // tgen
};
//SIG(1 _ZN3aaa9GG2122121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21221213fooEv");}
aaa::GG2122121 ::~GG2122121(){ note_dtor("_ZN3aaa9GG2122121E", this);} // tgen
aaa::GG2122121 ::GG2122121(){ note_ctor("_ZN3aaa9GG2122121E", this);} // tgen
}
static void Test__ZN3aaa9GG2122121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122121E, buf);
    ::aaa::GG2122121 *dp, &lv = *(dp=new (buf) ::aaa::GG2122121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122121E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2122121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2122121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2122121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122121E);
    dp->::aaa::GG2122121::~GG2122121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122121E(Test__ZN3aaa9GG2122121E, "_ZN3aaa9GG2122121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122121C1Ev();
extern void _ZN3aaa9GG2122121D1Ev();
Name_Map name_map__ZN3aaa9GG2122121E[] = {
  NSPAIR(_ZN3aaa9GG2122121C1Ev),
  NSPAIR(_ZN3aaa9GG2122121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2122121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122121E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21221213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21221213fooEv,_ZThn8_N3aaa9GG21221213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21221213fooEv,_ZThn28_N3aaa9GG21221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21221213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21221213fooEv,_ZThn8_N3aaa9GG21221213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21221213fooEv,_ZThn28_N3aaa9GG21221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122121E[];
Class_Descriptor cd__ZN3aaa9GG2122121E = {  "_ZN3aaa9GG2122121E", // class name
  bases__ZN3aaa9GG2122121E, 6,
  &(vtc__ZN3aaa9GG2122121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122122  : ::aaa::EE212 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21221223barEv
  ~GG2122122(); // tgen
  GG2122122(); // tgen
};
//SIG(1 _ZN3aaa9GG2122122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21221223barEv");}
aaa::GG2122122 ::~GG2122122(){ note_dtor("_ZN3aaa9GG2122122E", this);} // tgen
aaa::GG2122122 ::GG2122122(){ note_ctor("_ZN3aaa9GG2122122E", this);} // tgen
}
static void Test__ZN3aaa9GG2122122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122122E, buf);
    ::aaa::GG2122122 *dp, &lv = *(dp=new (buf) ::aaa::GG2122122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122122E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2122122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2122122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2122122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122122E);
    dp->::aaa::GG2122122::~GG2122122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122122E(Test__ZN3aaa9GG2122122E, "_ZN3aaa9GG2122122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122122C1Ev();
extern void _ZN3aaa9GG2122122D1Ev();
Name_Map name_map__ZN3aaa9GG2122122E[] = {
  NSPAIR(_ZN3aaa9GG2122122C1Ev),
  NSPAIR(_ZN3aaa9GG2122122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2122122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122122E[];
extern void _ZN3aaa9GG21221223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21221223barEv,_ZThn20_N3aaa9GG21221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221223barEv,_ZThn20_N3aaa9GG21221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122122E[];
Class_Descriptor cd__ZN3aaa9GG2122122E = {  "_ZN3aaa9GG2122122E", // class name
  bases__ZN3aaa9GG2122122E, 6,
  &(vtc__ZN3aaa9GG2122122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122122E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122123  : ::aaa::EE212 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21221233fooEv
  virtual void  bar(); // _ZN3aaa9GG21221233barEv
  ~GG2122123(); // tgen
  GG2122123(); // tgen
};
//SIG(1 _ZN3aaa9GG2122123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21221233fooEv");}
void  aaa::GG2122123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21221233barEv");}
aaa::GG2122123 ::~GG2122123(){ note_dtor("_ZN3aaa9GG2122123E", this);} // tgen
aaa::GG2122123 ::GG2122123(){ note_ctor("_ZN3aaa9GG2122123E", this);} // tgen
}
static void Test__ZN3aaa9GG2122123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122123E, buf);
    ::aaa::GG2122123 *dp, &lv = *(dp=new (buf) ::aaa::GG2122123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122123E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2122123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2122123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2122123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122123E);
    dp->::aaa::GG2122123::~GG2122123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122123E(Test__ZN3aaa9GG2122123E, "_ZN3aaa9GG2122123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122123C1Ev();
extern void _ZN3aaa9GG2122123D1Ev();
Name_Map name_map__ZN3aaa9GG2122123E[] = {
  NSPAIR(_ZN3aaa9GG2122123C1Ev),
  NSPAIR(_ZN3aaa9GG2122123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2122123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122123E[];
extern void _ZN3aaa9GG21221233barEv();
extern void _ZN3aaa9GG21221233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21221233fooEv,_ZThn8_N3aaa9GG21221233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21221233barEv,_ZThn20_N3aaa9GG21221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21221233fooEv,_ZThn28_N3aaa9GG21221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21221233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21221233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21221233fooEv,_ZThn8_N3aaa9GG21221233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221233barEv,_ZThn20_N3aaa9GG21221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21221233fooEv,_ZThn28_N3aaa9GG21221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122123E[];
Class_Descriptor cd__ZN3aaa9GG2122123E = {  "_ZN3aaa9GG2122123E", // class name
  bases__ZN3aaa9GG2122123E, 6,
  &(vtc__ZN3aaa9GG2122123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122131  : ::aaa::EE212 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21221313fooEv
  ~GG2122131(); // tgen
  GG2122131(); // tgen
};
//SIG(1 _ZN3aaa9GG2122131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21221313fooEv");}
aaa::GG2122131 ::~GG2122131(){ note_dtor("_ZN3aaa9GG2122131E", this);} // tgen
aaa::GG2122131 ::GG2122131(){ note_ctor("_ZN3aaa9GG2122131E", this);} // tgen
}
static void Test__ZN3aaa9GG2122131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122131E, buf);
    ::aaa::GG2122131 *dp, &lv = *(dp=new (buf) ::aaa::GG2122131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122131E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2122131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2122131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2122131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122131E);
    dp->::aaa::GG2122131::~GG2122131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122131E(Test__ZN3aaa9GG2122131E, "_ZN3aaa9GG2122131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122131C1Ev();
extern void _ZN3aaa9GG2122131D1Ev();
Name_Map name_map__ZN3aaa9GG2122131E[] = {
  NSPAIR(_ZN3aaa9GG2122131C1Ev),
  NSPAIR(_ZN3aaa9GG2122131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2122131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122131E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21221313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21221313fooEv,_ZThn8_N3aaa9GG21221313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21221313fooEv,_ZThn20_N3aaa9GG21221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21221313fooEv,_ZThn28_N3aaa9GG21221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21221313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21221313fooEv,_ZThn8_N3aaa9GG21221313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221313fooEv,_ZThn20_N3aaa9GG21221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21221313fooEv,_ZThn28_N3aaa9GG21221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122131E[];
Class_Descriptor cd__ZN3aaa9GG2122131E = {  "_ZN3aaa9GG2122131E", // class name
  bases__ZN3aaa9GG2122131E, 6,
  &(vtc__ZN3aaa9GG2122131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122132  : ::aaa::EE212 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21221323barEv
  ~GG2122132(); // tgen
  GG2122132(); // tgen
};
//SIG(1 _ZN3aaa9GG2122132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21221323barEv");}
aaa::GG2122132 ::~GG2122132(){ note_dtor("_ZN3aaa9GG2122132E", this);} // tgen
aaa::GG2122132 ::GG2122132(){ note_ctor("_ZN3aaa9GG2122132E", this);} // tgen
}
static void Test__ZN3aaa9GG2122132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122132E, buf);
    ::aaa::GG2122132 *dp, &lv = *(dp=new (buf) ::aaa::GG2122132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122132E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2122132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2122132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2122132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122132E);
    dp->::aaa::GG2122132::~GG2122132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122132E(Test__ZN3aaa9GG2122132E, "_ZN3aaa9GG2122132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122132C1Ev();
extern void _ZN3aaa9GG2122132D1Ev();
Name_Map name_map__ZN3aaa9GG2122132E[] = {
  NSPAIR(_ZN3aaa9GG2122132C1Ev),
  NSPAIR(_ZN3aaa9GG2122132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2122132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122132E[];
extern void _ZN3aaa9GG21221323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21221323barEv,_ZThn20_N3aaa9GG21221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221323barEv,_ZThn20_N3aaa9GG21221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122132E[];
Class_Descriptor cd__ZN3aaa9GG2122132E = {  "_ZN3aaa9GG2122132E", // class name
  bases__ZN3aaa9GG2122132E, 6,
  &(vtc__ZN3aaa9GG2122132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122132E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122133  : ::aaa::EE212 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21221333fooEv
  virtual void  bar(); // _ZN3aaa9GG21221333barEv
  ~GG2122133(); // tgen
  GG2122133(); // tgen
};
//SIG(1 _ZN3aaa9GG2122133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21221333fooEv");}
void  aaa::GG2122133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21221333barEv");}
aaa::GG2122133 ::~GG2122133(){ note_dtor("_ZN3aaa9GG2122133E", this);} // tgen
aaa::GG2122133 ::GG2122133(){ note_ctor("_ZN3aaa9GG2122133E", this);} // tgen
}
static void Test__ZN3aaa9GG2122133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122133E, buf);
    ::aaa::GG2122133 *dp, &lv = *(dp=new (buf) ::aaa::GG2122133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122133E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2122133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2122133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2122133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122133E);
    dp->::aaa::GG2122133::~GG2122133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122133E(Test__ZN3aaa9GG2122133E, "_ZN3aaa9GG2122133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122133C1Ev();
extern void _ZN3aaa9GG2122133D1Ev();
Name_Map name_map__ZN3aaa9GG2122133E[] = {
  NSPAIR(_ZN3aaa9GG2122133C1Ev),
  NSPAIR(_ZN3aaa9GG2122133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2122133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122133E[];
extern void _ZN3aaa9GG21221333barEv();
extern void _ZN3aaa9GG21221333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21221333fooEv,_ZThn8_N3aaa9GG21221333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21221333barEv,_ZThn20_N3aaa9GG21221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21221333fooEv,_ZThn20_N3aaa9GG21221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21221333fooEv,_ZThn28_N3aaa9GG21221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21221333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21221333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21221333fooEv,_ZThn8_N3aaa9GG21221333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221333barEv,_ZThn20_N3aaa9GG21221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21221333fooEv,_ZThn20_N3aaa9GG21221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21221333fooEv,_ZThn28_N3aaa9GG21221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122133E[];
Class_Descriptor cd__ZN3aaa9GG2122133E = {  "_ZN3aaa9GG2122133E", // class name
  bases__ZN3aaa9GG2122133E, 6,
  &(vtc__ZN3aaa9GG2122133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122211  : ::aaa::EE212 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21222113fooEv
  ~GG2122211(); // tgen
  GG2122211(); // tgen
};
//SIG(1 _ZN3aaa9GG2122211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21222113fooEv");}
aaa::GG2122211 ::~GG2122211(){ note_dtor("_ZN3aaa9GG2122211E", this);} // tgen
aaa::GG2122211 ::GG2122211(){ note_ctor("_ZN3aaa9GG2122211E", this);} // tgen
}
static void Test__ZN3aaa9GG2122211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122211E, buf);
    ::aaa::GG2122211 *dp, &lv = *(dp=new (buf) ::aaa::GG2122211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122211E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2122211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2122211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2122211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122211E);
    dp->::aaa::GG2122211::~GG2122211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122211E(Test__ZN3aaa9GG2122211E, "_ZN3aaa9GG2122211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122211C1Ev();
extern void _ZN3aaa9GG2122211D1Ev();
Name_Map name_map__ZN3aaa9GG2122211E[] = {
  NSPAIR(_ZN3aaa9GG2122211C1Ev),
  NSPAIR(_ZN3aaa9GG2122211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2122211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122211E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21222113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21222113fooEv,_ZThn8_N3aaa9GG21222113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21222113fooEv,_ZThn20_N3aaa9GG21222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21222113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21222113fooEv,_ZThn8_N3aaa9GG21222113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222113fooEv,_ZThn20_N3aaa9GG21222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122211E[];
Class_Descriptor cd__ZN3aaa9GG2122211E = {  "_ZN3aaa9GG2122211E", // class name
  bases__ZN3aaa9GG2122211E, 6,
  &(vtc__ZN3aaa9GG2122211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122212  : ::aaa::EE212 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21222123barEv
  ~GG2122212(); // tgen
  GG2122212(); // tgen
};
//SIG(1 _ZN3aaa9GG2122212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21222123barEv");}
aaa::GG2122212 ::~GG2122212(){ note_dtor("_ZN3aaa9GG2122212E", this);} // tgen
aaa::GG2122212 ::GG2122212(){ note_ctor("_ZN3aaa9GG2122212E", this);} // tgen
}
static void Test__ZN3aaa9GG2122212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122212E, buf);
    ::aaa::GG2122212 *dp, &lv = *(dp=new (buf) ::aaa::GG2122212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122212E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2122212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2122212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2122212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122212E);
    dp->::aaa::GG2122212::~GG2122212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122212E(Test__ZN3aaa9GG2122212E, "_ZN3aaa9GG2122212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122212C1Ev();
extern void _ZN3aaa9GG2122212D1Ev();
Name_Map name_map__ZN3aaa9GG2122212E[] = {
  NSPAIR(_ZN3aaa9GG2122212C1Ev),
  NSPAIR(_ZN3aaa9GG2122212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2122212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122212E[];
extern void _ZN3aaa9GG21222123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21222123barEv,_ZThn20_N3aaa9GG21222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21222123barEv,_ZThn28_N3aaa9GG21222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222123barEv,_ZThn20_N3aaa9GG21222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21222123barEv,_ZThn28_N3aaa9GG21222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122212E[];
Class_Descriptor cd__ZN3aaa9GG2122212E = {  "_ZN3aaa9GG2122212E", // class name
  bases__ZN3aaa9GG2122212E, 6,
  &(vtc__ZN3aaa9GG2122212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122213  : ::aaa::EE212 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21222133fooEv
  virtual void  bar(); // _ZN3aaa9GG21222133barEv
  ~GG2122213(); // tgen
  GG2122213(); // tgen
};
//SIG(1 _ZN3aaa9GG2122213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21222133fooEv");}
void  aaa::GG2122213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21222133barEv");}
aaa::GG2122213 ::~GG2122213(){ note_dtor("_ZN3aaa9GG2122213E", this);} // tgen
aaa::GG2122213 ::GG2122213(){ note_ctor("_ZN3aaa9GG2122213E", this);} // tgen
}
static void Test__ZN3aaa9GG2122213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122213E, buf);
    ::aaa::GG2122213 *dp, &lv = *(dp=new (buf) ::aaa::GG2122213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122213E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2122213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2122213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2122213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122213E);
    dp->::aaa::GG2122213::~GG2122213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122213E(Test__ZN3aaa9GG2122213E, "_ZN3aaa9GG2122213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122213C1Ev();
extern void _ZN3aaa9GG2122213D1Ev();
Name_Map name_map__ZN3aaa9GG2122213E[] = {
  NSPAIR(_ZN3aaa9GG2122213C1Ev),
  NSPAIR(_ZN3aaa9GG2122213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2122213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122213E[];
extern void _ZN3aaa9GG21222133barEv();
extern void _ZN3aaa9GG21222133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21222133fooEv,_ZThn8_N3aaa9GG21222133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21222133barEv,_ZThn20_N3aaa9GG21222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21222133fooEv,_ZThn20_N3aaa9GG21222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21222133barEv,_ZThn28_N3aaa9GG21222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21222133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21222133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21222133fooEv,_ZThn8_N3aaa9GG21222133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222133barEv,_ZThn20_N3aaa9GG21222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222133fooEv,_ZThn20_N3aaa9GG21222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21222133barEv,_ZThn28_N3aaa9GG21222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122213E[];
Class_Descriptor cd__ZN3aaa9GG2122213E = {  "_ZN3aaa9GG2122213E", // class name
  bases__ZN3aaa9GG2122213E, 6,
  &(vtc__ZN3aaa9GG2122213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122221  : ::aaa::EE212 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21222213fooEv
  ~GG2122221(); // tgen
  GG2122221(); // tgen
};
//SIG(1 _ZN3aaa9GG2122221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21222213fooEv");}
aaa::GG2122221 ::~GG2122221(){ note_dtor("_ZN3aaa9GG2122221E", this);} // tgen
aaa::GG2122221 ::GG2122221(){ note_ctor("_ZN3aaa9GG2122221E", this);} // tgen
}
static void Test__ZN3aaa9GG2122221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122221E, buf);
    ::aaa::GG2122221 *dp, &lv = *(dp=new (buf) ::aaa::GG2122221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122221E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2122221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2122221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2122221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122221E);
    dp->::aaa::GG2122221::~GG2122221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122221E(Test__ZN3aaa9GG2122221E, "_ZN3aaa9GG2122221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122221C1Ev();
extern void _ZN3aaa9GG2122221D1Ev();
Name_Map name_map__ZN3aaa9GG2122221E[] = {
  NSPAIR(_ZN3aaa9GG2122221C1Ev),
  NSPAIR(_ZN3aaa9GG2122221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2122221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122221E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21222213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21222213fooEv,_ZThn8_N3aaa9GG21222213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21222213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21222213fooEv,_ZThn8_N3aaa9GG21222213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122221E[];
Class_Descriptor cd__ZN3aaa9GG2122221E = {  "_ZN3aaa9GG2122221E", // class name
  bases__ZN3aaa9GG2122221E, 6,
  &(vtc__ZN3aaa9GG2122221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122222  : ::aaa::EE212 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21222223barEv
  ~GG2122222(); // tgen
  GG2122222(); // tgen
};
//SIG(1 _ZN3aaa9GG2122222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21222223barEv");}
aaa::GG2122222 ::~GG2122222(){ note_dtor("_ZN3aaa9GG2122222E", this);} // tgen
aaa::GG2122222 ::GG2122222(){ note_ctor("_ZN3aaa9GG2122222E", this);} // tgen
}
static void Test__ZN3aaa9GG2122222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122222E, buf);
    ::aaa::GG2122222 *dp, &lv = *(dp=new (buf) ::aaa::GG2122222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122222E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2122222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2122222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2122222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122222E);
    dp->::aaa::GG2122222::~GG2122222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122222E(Test__ZN3aaa9GG2122222E, "_ZN3aaa9GG2122222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122222C1Ev();
extern void _ZN3aaa9GG2122222D1Ev();
Name_Map name_map__ZN3aaa9GG2122222E[] = {
  NSPAIR(_ZN3aaa9GG2122222C1Ev),
  NSPAIR(_ZN3aaa9GG2122222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2122222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122222E[];
extern void _ZN3aaa9GG21222223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21222223barEv,_ZThn20_N3aaa9GG21222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21222223barEv,_ZThn28_N3aaa9GG21222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222223barEv,_ZThn20_N3aaa9GG21222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21222223barEv,_ZThn28_N3aaa9GG21222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122222E[];
Class_Descriptor cd__ZN3aaa9GG2122222E = {  "_ZN3aaa9GG2122222E", // class name
  bases__ZN3aaa9GG2122222E, 6,
  &(vtc__ZN3aaa9GG2122222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122222E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122223  : ::aaa::EE212 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21222233fooEv
  virtual void  bar(); // _ZN3aaa9GG21222233barEv
  ~GG2122223(); // tgen
  GG2122223(); // tgen
};
//SIG(1 _ZN3aaa9GG2122223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21222233fooEv");}
void  aaa::GG2122223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21222233barEv");}
aaa::GG2122223 ::~GG2122223(){ note_dtor("_ZN3aaa9GG2122223E", this);} // tgen
aaa::GG2122223 ::GG2122223(){ note_ctor("_ZN3aaa9GG2122223E", this);} // tgen
}
static void Test__ZN3aaa9GG2122223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122223E, buf);
    ::aaa::GG2122223 *dp, &lv = *(dp=new (buf) ::aaa::GG2122223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122223E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2122223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2122223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2122223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122223E);
    dp->::aaa::GG2122223::~GG2122223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122223E(Test__ZN3aaa9GG2122223E, "_ZN3aaa9GG2122223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122223C1Ev();
extern void _ZN3aaa9GG2122223D1Ev();
Name_Map name_map__ZN3aaa9GG2122223E[] = {
  NSPAIR(_ZN3aaa9GG2122223C1Ev),
  NSPAIR(_ZN3aaa9GG2122223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2122223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122223E[];
extern void _ZN3aaa9GG21222233barEv();
extern void _ZN3aaa9GG21222233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21222233fooEv,_ZThn8_N3aaa9GG21222233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21222233barEv,_ZThn20_N3aaa9GG21222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21222233barEv,_ZThn28_N3aaa9GG21222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21222233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21222233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21222233fooEv,_ZThn8_N3aaa9GG21222233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222233barEv,_ZThn20_N3aaa9GG21222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21222233barEv,_ZThn28_N3aaa9GG21222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122223E[];
Class_Descriptor cd__ZN3aaa9GG2122223E = {  "_ZN3aaa9GG2122223E", // class name
  bases__ZN3aaa9GG2122223E, 6,
  &(vtc__ZN3aaa9GG2122223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122231  : ::aaa::EE212 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21222313fooEv
  ~GG2122231(); // tgen
  GG2122231(); // tgen
};
//SIG(1 _ZN3aaa9GG2122231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21222313fooEv");}
aaa::GG2122231 ::~GG2122231(){ note_dtor("_ZN3aaa9GG2122231E", this);} // tgen
aaa::GG2122231 ::GG2122231(){ note_ctor("_ZN3aaa9GG2122231E", this);} // tgen
}
static void Test__ZN3aaa9GG2122231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122231E, buf);
    ::aaa::GG2122231 *dp, &lv = *(dp=new (buf) ::aaa::GG2122231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122231E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2122231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2122231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2122231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122231E);
    dp->::aaa::GG2122231::~GG2122231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122231E(Test__ZN3aaa9GG2122231E, "_ZN3aaa9GG2122231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122231C1Ev();
extern void _ZN3aaa9GG2122231D1Ev();
Name_Map name_map__ZN3aaa9GG2122231E[] = {
  NSPAIR(_ZN3aaa9GG2122231C1Ev),
  NSPAIR(_ZN3aaa9GG2122231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2122231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122231E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21222313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21222313fooEv,_ZThn8_N3aaa9GG21222313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21222313fooEv,_ZThn20_N3aaa9GG21222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21222313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21222313fooEv,_ZThn8_N3aaa9GG21222313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222313fooEv,_ZThn20_N3aaa9GG21222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122231E[];
Class_Descriptor cd__ZN3aaa9GG2122231E = {  "_ZN3aaa9GG2122231E", // class name
  bases__ZN3aaa9GG2122231E, 6,
  &(vtc__ZN3aaa9GG2122231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122232  : ::aaa::EE212 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21222323barEv
  ~GG2122232(); // tgen
  GG2122232(); // tgen
};
//SIG(1 _ZN3aaa9GG2122232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21222323barEv");}
aaa::GG2122232 ::~GG2122232(){ note_dtor("_ZN3aaa9GG2122232E", this);} // tgen
aaa::GG2122232 ::GG2122232(){ note_ctor("_ZN3aaa9GG2122232E", this);} // tgen
}
static void Test__ZN3aaa9GG2122232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122232E, buf);
    ::aaa::GG2122232 *dp, &lv = *(dp=new (buf) ::aaa::GG2122232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122232E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2122232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2122232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2122232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122232E);
    dp->::aaa::GG2122232::~GG2122232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122232E(Test__ZN3aaa9GG2122232E, "_ZN3aaa9GG2122232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122232C1Ev();
extern void _ZN3aaa9GG2122232D1Ev();
Name_Map name_map__ZN3aaa9GG2122232E[] = {
  NSPAIR(_ZN3aaa9GG2122232C1Ev),
  NSPAIR(_ZN3aaa9GG2122232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2122232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122232E[];
extern void _ZN3aaa9GG21222323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21222323barEv,_ZThn20_N3aaa9GG21222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21222323barEv,_ZThn28_N3aaa9GG21222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222323barEv,_ZThn20_N3aaa9GG21222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21222323barEv,_ZThn28_N3aaa9GG21222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122232E[];
Class_Descriptor cd__ZN3aaa9GG2122232E = {  "_ZN3aaa9GG2122232E", // class name
  bases__ZN3aaa9GG2122232E, 6,
  &(vtc__ZN3aaa9GG2122232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122232E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122233  : ::aaa::EE212 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21222333fooEv
  virtual void  bar(); // _ZN3aaa9GG21222333barEv
  ~GG2122233(); // tgen
  GG2122233(); // tgen
};
//SIG(1 _ZN3aaa9GG2122233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21222333fooEv");}
void  aaa::GG2122233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21222333barEv");}
aaa::GG2122233 ::~GG2122233(){ note_dtor("_ZN3aaa9GG2122233E", this);} // tgen
aaa::GG2122233 ::GG2122233(){ note_ctor("_ZN3aaa9GG2122233E", this);} // tgen
}
static void Test__ZN3aaa9GG2122233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122233E, buf);
    ::aaa::GG2122233 *dp, &lv = *(dp=new (buf) ::aaa::GG2122233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122233E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2122233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2122233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2122233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122233E);
    dp->::aaa::GG2122233::~GG2122233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122233E(Test__ZN3aaa9GG2122233E, "_ZN3aaa9GG2122233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122233C1Ev();
extern void _ZN3aaa9GG2122233D1Ev();
Name_Map name_map__ZN3aaa9GG2122233E[] = {
  NSPAIR(_ZN3aaa9GG2122233C1Ev),
  NSPAIR(_ZN3aaa9GG2122233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2122233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122233E[];
extern void _ZN3aaa9GG21222333barEv();
extern void _ZN3aaa9GG21222333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21222333fooEv,_ZThn8_N3aaa9GG21222333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21222333barEv,_ZThn20_N3aaa9GG21222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21222333fooEv,_ZThn20_N3aaa9GG21222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21222333barEv,_ZThn28_N3aaa9GG21222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21222333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21222333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21222333fooEv,_ZThn8_N3aaa9GG21222333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222333barEv,_ZThn20_N3aaa9GG21222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21222333fooEv,_ZThn20_N3aaa9GG21222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21222333barEv,_ZThn28_N3aaa9GG21222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122233E[];
Class_Descriptor cd__ZN3aaa9GG2122233E = {  "_ZN3aaa9GG2122233E", // class name
  bases__ZN3aaa9GG2122233E, 6,
  &(vtc__ZN3aaa9GG2122233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122311  : ::aaa::EE212 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21223113fooEv
  ~GG2122311(); // tgen
  GG2122311(); // tgen
};
//SIG(1 _ZN3aaa9GG2122311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21223113fooEv");}
aaa::GG2122311 ::~GG2122311(){ note_dtor("_ZN3aaa9GG2122311E", this);} // tgen
aaa::GG2122311 ::GG2122311(){ note_ctor("_ZN3aaa9GG2122311E", this);} // tgen
}
static void Test__ZN3aaa9GG2122311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122311E, buf);
    ::aaa::GG2122311 *dp, &lv = *(dp=new (buf) ::aaa::GG2122311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122311E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2122311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2122311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2122311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122311E);
    dp->::aaa::GG2122311::~GG2122311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122311E(Test__ZN3aaa9GG2122311E, "_ZN3aaa9GG2122311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122311C1Ev();
extern void _ZN3aaa9GG2122311D1Ev();
Name_Map name_map__ZN3aaa9GG2122311E[] = {
  NSPAIR(_ZN3aaa9GG2122311C1Ev),
  NSPAIR(_ZN3aaa9GG2122311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2122311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122311E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21223113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21223113fooEv,_ZThn8_N3aaa9GG21223113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21223113fooEv,_ZThn20_N3aaa9GG21223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223113fooEv,_ZThn28_N3aaa9GG21223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21223113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21223113fooEv,_ZThn8_N3aaa9GG21223113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223113fooEv,_ZThn20_N3aaa9GG21223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223113fooEv,_ZThn28_N3aaa9GG21223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122311E[];
Class_Descriptor cd__ZN3aaa9GG2122311E = {  "_ZN3aaa9GG2122311E", // class name
  bases__ZN3aaa9GG2122311E, 6,
  &(vtc__ZN3aaa9GG2122311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122312  : ::aaa::EE212 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21223123barEv
  ~GG2122312(); // tgen
  GG2122312(); // tgen
};
//SIG(1 _ZN3aaa9GG2122312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21223123barEv");}
aaa::GG2122312 ::~GG2122312(){ note_dtor("_ZN3aaa9GG2122312E", this);} // tgen
aaa::GG2122312 ::GG2122312(){ note_ctor("_ZN3aaa9GG2122312E", this);} // tgen
}
static void Test__ZN3aaa9GG2122312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122312E, buf);
    ::aaa::GG2122312 *dp, &lv = *(dp=new (buf) ::aaa::GG2122312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122312E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2122312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2122312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2122312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122312E);
    dp->::aaa::GG2122312::~GG2122312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122312E(Test__ZN3aaa9GG2122312E, "_ZN3aaa9GG2122312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122312C1Ev();
extern void _ZN3aaa9GG2122312D1Ev();
Name_Map name_map__ZN3aaa9GG2122312E[] = {
  NSPAIR(_ZN3aaa9GG2122312C1Ev),
  NSPAIR(_ZN3aaa9GG2122312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2122312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122312E[];
extern void _ZN3aaa9GG21223123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21223123barEv,_ZThn20_N3aaa9GG21223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223123barEv,_ZThn28_N3aaa9GG21223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223123barEv,_ZThn20_N3aaa9GG21223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223123barEv,_ZThn28_N3aaa9GG21223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122312E[];
Class_Descriptor cd__ZN3aaa9GG2122312E = {  "_ZN3aaa9GG2122312E", // class name
  bases__ZN3aaa9GG2122312E, 6,
  &(vtc__ZN3aaa9GG2122312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122313  : ::aaa::EE212 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21223133fooEv
  virtual void  bar(); // _ZN3aaa9GG21223133barEv
  ~GG2122313(); // tgen
  GG2122313(); // tgen
};
//SIG(1 _ZN3aaa9GG2122313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21223133fooEv");}
void  aaa::GG2122313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21223133barEv");}
aaa::GG2122313 ::~GG2122313(){ note_dtor("_ZN3aaa9GG2122313E", this);} // tgen
aaa::GG2122313 ::GG2122313(){ note_ctor("_ZN3aaa9GG2122313E", this);} // tgen
}
static void Test__ZN3aaa9GG2122313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122313E, buf);
    ::aaa::GG2122313 *dp, &lv = *(dp=new (buf) ::aaa::GG2122313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122313E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2122313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2122313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2122313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122313E);
    dp->::aaa::GG2122313::~GG2122313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122313E(Test__ZN3aaa9GG2122313E, "_ZN3aaa9GG2122313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122313C1Ev();
extern void _ZN3aaa9GG2122313D1Ev();
Name_Map name_map__ZN3aaa9GG2122313E[] = {
  NSPAIR(_ZN3aaa9GG2122313C1Ev),
  NSPAIR(_ZN3aaa9GG2122313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2122313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122313E[];
extern void _ZN3aaa9GG21223133barEv();
extern void _ZN3aaa9GG21223133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21223133fooEv,_ZThn8_N3aaa9GG21223133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21223133barEv,_ZThn20_N3aaa9GG21223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21223133fooEv,_ZThn20_N3aaa9GG21223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223133fooEv,_ZThn28_N3aaa9GG21223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223133barEv,_ZThn28_N3aaa9GG21223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21223133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21223133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21223133fooEv,_ZThn8_N3aaa9GG21223133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223133barEv,_ZThn20_N3aaa9GG21223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223133fooEv,_ZThn20_N3aaa9GG21223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223133fooEv,_ZThn28_N3aaa9GG21223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223133barEv,_ZThn28_N3aaa9GG21223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122313E[];
Class_Descriptor cd__ZN3aaa9GG2122313E = {  "_ZN3aaa9GG2122313E", // class name
  bases__ZN3aaa9GG2122313E, 6,
  &(vtc__ZN3aaa9GG2122313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122321  : ::aaa::EE212 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21223213fooEv
  ~GG2122321(); // tgen
  GG2122321(); // tgen
};
//SIG(1 _ZN3aaa9GG2122321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21223213fooEv");}
aaa::GG2122321 ::~GG2122321(){ note_dtor("_ZN3aaa9GG2122321E", this);} // tgen
aaa::GG2122321 ::GG2122321(){ note_ctor("_ZN3aaa9GG2122321E", this);} // tgen
}
static void Test__ZN3aaa9GG2122321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122321E, buf);
    ::aaa::GG2122321 *dp, &lv = *(dp=new (buf) ::aaa::GG2122321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122321E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2122321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2122321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2122321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122321E);
    dp->::aaa::GG2122321::~GG2122321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122321E(Test__ZN3aaa9GG2122321E, "_ZN3aaa9GG2122321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122321C1Ev();
extern void _ZN3aaa9GG2122321D1Ev();
Name_Map name_map__ZN3aaa9GG2122321E[] = {
  NSPAIR(_ZN3aaa9GG2122321C1Ev),
  NSPAIR(_ZN3aaa9GG2122321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2122321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122321E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21223213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21223213fooEv,_ZThn8_N3aaa9GG21223213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21223213fooEv,_ZThn28_N3aaa9GG21223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21223213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21223213fooEv,_ZThn8_N3aaa9GG21223213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223213fooEv,_ZThn28_N3aaa9GG21223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122321E[];
Class_Descriptor cd__ZN3aaa9GG2122321E = {  "_ZN3aaa9GG2122321E", // class name
  bases__ZN3aaa9GG2122321E, 6,
  &(vtc__ZN3aaa9GG2122321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122322  : ::aaa::EE212 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21223223barEv
  ~GG2122322(); // tgen
  GG2122322(); // tgen
};
//SIG(1 _ZN3aaa9GG2122322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21223223barEv");}
aaa::GG2122322 ::~GG2122322(){ note_dtor("_ZN3aaa9GG2122322E", this);} // tgen
aaa::GG2122322 ::GG2122322(){ note_ctor("_ZN3aaa9GG2122322E", this);} // tgen
}
static void Test__ZN3aaa9GG2122322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122322E, buf);
    ::aaa::GG2122322 *dp, &lv = *(dp=new (buf) ::aaa::GG2122322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122322E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2122322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2122322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2122322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122322E);
    dp->::aaa::GG2122322::~GG2122322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122322E(Test__ZN3aaa9GG2122322E, "_ZN3aaa9GG2122322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122322C1Ev();
extern void _ZN3aaa9GG2122322D1Ev();
Name_Map name_map__ZN3aaa9GG2122322E[] = {
  NSPAIR(_ZN3aaa9GG2122322C1Ev),
  NSPAIR(_ZN3aaa9GG2122322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2122322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122322E[];
extern void _ZN3aaa9GG21223223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21223223barEv,_ZThn20_N3aaa9GG21223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21223223barEv,_ZThn28_N3aaa9GG21223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223223barEv,_ZThn20_N3aaa9GG21223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223223barEv,_ZThn28_N3aaa9GG21223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122322E[];
Class_Descriptor cd__ZN3aaa9GG2122322E = {  "_ZN3aaa9GG2122322E", // class name
  bases__ZN3aaa9GG2122322E, 6,
  &(vtc__ZN3aaa9GG2122322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122322E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122323  : ::aaa::EE212 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21223233fooEv
  virtual void  bar(); // _ZN3aaa9GG21223233barEv
  ~GG2122323(); // tgen
  GG2122323(); // tgen
};
//SIG(1 _ZN3aaa9GG2122323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21223233fooEv");}
void  aaa::GG2122323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21223233barEv");}
aaa::GG2122323 ::~GG2122323(){ note_dtor("_ZN3aaa9GG2122323E", this);} // tgen
aaa::GG2122323 ::GG2122323(){ note_ctor("_ZN3aaa9GG2122323E", this);} // tgen
}
static void Test__ZN3aaa9GG2122323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122323E, buf);
    ::aaa::GG2122323 *dp, &lv = *(dp=new (buf) ::aaa::GG2122323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122323E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2122323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2122323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2122323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122323E);
    dp->::aaa::GG2122323::~GG2122323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122323E(Test__ZN3aaa9GG2122323E, "_ZN3aaa9GG2122323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122323C1Ev();
extern void _ZN3aaa9GG2122323D1Ev();
Name_Map name_map__ZN3aaa9GG2122323E[] = {
  NSPAIR(_ZN3aaa9GG2122323C1Ev),
  NSPAIR(_ZN3aaa9GG2122323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2122323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122323E[];
extern void _ZN3aaa9GG21223233barEv();
extern void _ZN3aaa9GG21223233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21223233fooEv,_ZThn8_N3aaa9GG21223233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21223233barEv,_ZThn20_N3aaa9GG21223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223233fooEv,_ZThn28_N3aaa9GG21223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223233barEv,_ZThn28_N3aaa9GG21223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21223233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21223233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21223233fooEv,_ZThn8_N3aaa9GG21223233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223233barEv,_ZThn20_N3aaa9GG21223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223233fooEv,_ZThn28_N3aaa9GG21223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223233barEv,_ZThn28_N3aaa9GG21223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122323E[];
Class_Descriptor cd__ZN3aaa9GG2122323E = {  "_ZN3aaa9GG2122323E", // class name
  bases__ZN3aaa9GG2122323E, 6,
  &(vtc__ZN3aaa9GG2122323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122331  : ::aaa::EE212 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21223313fooEv
  ~GG2122331(); // tgen
  GG2122331(); // tgen
};
//SIG(1 _ZN3aaa9GG2122331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21223313fooEv");}
aaa::GG2122331 ::~GG2122331(){ note_dtor("_ZN3aaa9GG2122331E", this);} // tgen
aaa::GG2122331 ::GG2122331(){ note_ctor("_ZN3aaa9GG2122331E", this);} // tgen
}
static void Test__ZN3aaa9GG2122331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122331E, buf);
    ::aaa::GG2122331 *dp, &lv = *(dp=new (buf) ::aaa::GG2122331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122331E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2122331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2122331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2122331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122331E);
    dp->::aaa::GG2122331::~GG2122331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122331E(Test__ZN3aaa9GG2122331E, "_ZN3aaa9GG2122331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122331C1Ev();
extern void _ZN3aaa9GG2122331D1Ev();
Name_Map name_map__ZN3aaa9GG2122331E[] = {
  NSPAIR(_ZN3aaa9GG2122331C1Ev),
  NSPAIR(_ZN3aaa9GG2122331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2122331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122331E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21223313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21223313fooEv,_ZThn8_N3aaa9GG21223313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21223313fooEv,_ZThn20_N3aaa9GG21223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223313fooEv,_ZThn28_N3aaa9GG21223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21223313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21223313fooEv,_ZThn8_N3aaa9GG21223313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223313fooEv,_ZThn20_N3aaa9GG21223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223313fooEv,_ZThn28_N3aaa9GG21223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122331E[];
Class_Descriptor cd__ZN3aaa9GG2122331E = {  "_ZN3aaa9GG2122331E", // class name
  bases__ZN3aaa9GG2122331E, 6,
  &(vtc__ZN3aaa9GG2122331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122332  : ::aaa::EE212 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21223323barEv
  ~GG2122332(); // tgen
  GG2122332(); // tgen
};
//SIG(1 _ZN3aaa9GG2122332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2122332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21223323barEv");}
aaa::GG2122332 ::~GG2122332(){ note_dtor("_ZN3aaa9GG2122332E", this);} // tgen
aaa::GG2122332 ::GG2122332(){ note_ctor("_ZN3aaa9GG2122332E", this);} // tgen
}
static void Test__ZN3aaa9GG2122332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122332E, buf);
    ::aaa::GG2122332 *dp, &lv = *(dp=new (buf) ::aaa::GG2122332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122332E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2122332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2122332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2122332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122332E);
    dp->::aaa::GG2122332::~GG2122332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122332E(Test__ZN3aaa9GG2122332E, "_ZN3aaa9GG2122332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122332C1Ev();
extern void _ZN3aaa9GG2122332D1Ev();
Name_Map name_map__ZN3aaa9GG2122332E[] = {
  NSPAIR(_ZN3aaa9GG2122332C1Ev),
  NSPAIR(_ZN3aaa9GG2122332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2122332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122332E[];
extern void _ZN3aaa9GG21223323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21223323barEv,_ZThn20_N3aaa9GG21223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223323barEv,_ZThn28_N3aaa9GG21223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223323barEv,_ZThn20_N3aaa9GG21223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223323barEv,_ZThn28_N3aaa9GG21223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122332E[];
Class_Descriptor cd__ZN3aaa9GG2122332E = {  "_ZN3aaa9GG2122332E", // class name
  bases__ZN3aaa9GG2122332E, 6,
  &(vtc__ZN3aaa9GG2122332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122332E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2122333  : ::aaa::EE212 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21223333fooEv
  virtual void  bar(); // _ZN3aaa9GG21223333barEv
  ~GG2122333(); // tgen
  GG2122333(); // tgen
};
//SIG(1 _ZN3aaa9GG2122333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2122333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21223333fooEv");}
void  aaa::GG2122333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21223333barEv");}
aaa::GG2122333 ::~GG2122333(){ note_dtor("_ZN3aaa9GG2122333E", this);} // tgen
aaa::GG2122333 ::GG2122333(){ note_ctor("_ZN3aaa9GG2122333E", this);} // tgen
}
static void Test__ZN3aaa9GG2122333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2122333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2122333E, buf);
    ::aaa::GG2122333 *dp, &lv = *(dp=new (buf) ::aaa::GG2122333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2122333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2122333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2122333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2122333E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2122333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2122333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2122333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2122333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2122333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2122333E);
    dp->::aaa::GG2122333::~GG2122333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2122333E(Test__ZN3aaa9GG2122333E, "_ZN3aaa9GG2122333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2122333C1Ev();
extern void _ZN3aaa9GG2122333D1Ev();
Name_Map name_map__ZN3aaa9GG2122333E[] = {
  NSPAIR(_ZN3aaa9GG2122333C1Ev),
  NSPAIR(_ZN3aaa9GG2122333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2122333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2122333E[];
extern void _ZN3aaa9GG21223333barEv();
extern void _ZN3aaa9GG21223333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21223333fooEv,_ZThn8_N3aaa9GG21223333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21223333barEv,_ZThn20_N3aaa9GG21223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21223333fooEv,_ZThn20_N3aaa9GG21223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223333fooEv,_ZThn28_N3aaa9GG21223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21223333barEv,_ZThn28_N3aaa9GG21223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2122333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21223333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21223333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21223333fooEv,_ZThn8_N3aaa9GG21223333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223333barEv,_ZThn20_N3aaa9GG21223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21223333fooEv,_ZThn20_N3aaa9GG21223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223333fooEv,_ZThn28_N3aaa9GG21223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21223333barEv,_ZThn28_N3aaa9GG21223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2122333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2122333E[];
Class_Descriptor cd__ZN3aaa9GG2122333E = {  "_ZN3aaa9GG2122333E", // class name
  bases__ZN3aaa9GG2122333E, 6,
  &(vtc__ZN3aaa9GG2122333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2122333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2122333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123111  : ::aaa::EE212 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21231113fooEv
  ~GG2123111(); // tgen
  GG2123111(); // tgen
};
//SIG(1 _ZN3aaa9GG2123111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21231113fooEv");}
aaa::GG2123111 ::~GG2123111(){ note_dtor("_ZN3aaa9GG2123111E", this);} // tgen
aaa::GG2123111 ::GG2123111(){ note_ctor("_ZN3aaa9GG2123111E", this);} // tgen
}
static void Test__ZN3aaa9GG2123111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123111E, buf);
    ::aaa::GG2123111 *dp, &lv = *(dp=new (buf) ::aaa::GG2123111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123111E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2123111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2123111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2123111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123111E);
    dp->::aaa::GG2123111::~GG2123111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123111E(Test__ZN3aaa9GG2123111E, "_ZN3aaa9GG2123111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123111C1Ev();
extern void _ZN3aaa9GG2123111D1Ev();
Name_Map name_map__ZN3aaa9GG2123111E[] = {
  NSPAIR(_ZN3aaa9GG2123111C1Ev),
  NSPAIR(_ZN3aaa9GG2123111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2123111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123111E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21231113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21231113fooEv,_ZThn8_N3aaa9GG21231113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231113fooEv,_ZThn20_N3aaa9GG21231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21231113fooEv,_ZThn28_N3aaa9GG21231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21231113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21231113fooEv,_ZThn8_N3aaa9GG21231113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231113fooEv,_ZThn20_N3aaa9GG21231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21231113fooEv,_ZThn28_N3aaa9GG21231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123111E[];
Class_Descriptor cd__ZN3aaa9GG2123111E = {  "_ZN3aaa9GG2123111E", // class name
  bases__ZN3aaa9GG2123111E, 6,
  &(vtc__ZN3aaa9GG2123111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123112  : ::aaa::EE212 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21231123barEv
  ~GG2123112(); // tgen
  GG2123112(); // tgen
};
//SIG(1 _ZN3aaa9GG2123112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21231123barEv");}
aaa::GG2123112 ::~GG2123112(){ note_dtor("_ZN3aaa9GG2123112E", this);} // tgen
aaa::GG2123112 ::GG2123112(){ note_ctor("_ZN3aaa9GG2123112E", this);} // tgen
}
static void Test__ZN3aaa9GG2123112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123112E, buf);
    ::aaa::GG2123112 *dp, &lv = *(dp=new (buf) ::aaa::GG2123112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123112E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2123112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2123112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2123112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123112E);
    dp->::aaa::GG2123112::~GG2123112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123112E(Test__ZN3aaa9GG2123112E, "_ZN3aaa9GG2123112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123112C1Ev();
extern void _ZN3aaa9GG2123112D1Ev();
Name_Map name_map__ZN3aaa9GG2123112E[] = {
  NSPAIR(_ZN3aaa9GG2123112C1Ev),
  NSPAIR(_ZN3aaa9GG2123112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2123112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123112E[];
extern void _ZN3aaa9GG21231123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21231123barEv,_ZThn20_N3aaa9GG21231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231123barEv,_ZThn20_N3aaa9GG21231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123112E[];
Class_Descriptor cd__ZN3aaa9GG2123112E = {  "_ZN3aaa9GG2123112E", // class name
  bases__ZN3aaa9GG2123112E, 6,
  &(vtc__ZN3aaa9GG2123112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123113  : ::aaa::EE212 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21231133fooEv
  virtual void  bar(); // _ZN3aaa9GG21231133barEv
  ~GG2123113(); // tgen
  GG2123113(); // tgen
};
//SIG(1 _ZN3aaa9GG2123113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21231133fooEv");}
void  aaa::GG2123113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21231133barEv");}
aaa::GG2123113 ::~GG2123113(){ note_dtor("_ZN3aaa9GG2123113E", this);} // tgen
aaa::GG2123113 ::GG2123113(){ note_ctor("_ZN3aaa9GG2123113E", this);} // tgen
}
static void Test__ZN3aaa9GG2123113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123113E, buf);
    ::aaa::GG2123113 *dp, &lv = *(dp=new (buf) ::aaa::GG2123113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123113E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2123113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2123113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2123113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123113E);
    dp->::aaa::GG2123113::~GG2123113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123113E(Test__ZN3aaa9GG2123113E, "_ZN3aaa9GG2123113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123113C1Ev();
extern void _ZN3aaa9GG2123113D1Ev();
Name_Map name_map__ZN3aaa9GG2123113E[] = {
  NSPAIR(_ZN3aaa9GG2123113C1Ev),
  NSPAIR(_ZN3aaa9GG2123113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2123113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123113E[];
extern void _ZN3aaa9GG21231133barEv();
extern void _ZN3aaa9GG21231133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21231133fooEv,_ZThn8_N3aaa9GG21231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231133fooEv,_ZThn20_N3aaa9GG21231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231133barEv,_ZThn20_N3aaa9GG21231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21231133fooEv,_ZThn28_N3aaa9GG21231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21231133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21231133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21231133fooEv,_ZThn8_N3aaa9GG21231133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231133fooEv,_ZThn20_N3aaa9GG21231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231133barEv,_ZThn20_N3aaa9GG21231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21231133fooEv,_ZThn28_N3aaa9GG21231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123113E[];
Class_Descriptor cd__ZN3aaa9GG2123113E = {  "_ZN3aaa9GG2123113E", // class name
  bases__ZN3aaa9GG2123113E, 6,
  &(vtc__ZN3aaa9GG2123113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123121  : ::aaa::EE212 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21231213fooEv
  ~GG2123121(); // tgen
  GG2123121(); // tgen
};
//SIG(1 _ZN3aaa9GG2123121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21231213fooEv");}
aaa::GG2123121 ::~GG2123121(){ note_dtor("_ZN3aaa9GG2123121E", this);} // tgen
aaa::GG2123121 ::GG2123121(){ note_ctor("_ZN3aaa9GG2123121E", this);} // tgen
}
static void Test__ZN3aaa9GG2123121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123121E, buf);
    ::aaa::GG2123121 *dp, &lv = *(dp=new (buf) ::aaa::GG2123121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123121E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2123121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2123121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2123121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123121E);
    dp->::aaa::GG2123121::~GG2123121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123121E(Test__ZN3aaa9GG2123121E, "_ZN3aaa9GG2123121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123121C1Ev();
extern void _ZN3aaa9GG2123121D1Ev();
Name_Map name_map__ZN3aaa9GG2123121E[] = {
  NSPAIR(_ZN3aaa9GG2123121C1Ev),
  NSPAIR(_ZN3aaa9GG2123121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2123121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123121E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21231213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21231213fooEv,_ZThn8_N3aaa9GG21231213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231213fooEv,_ZThn20_N3aaa9GG21231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21231213fooEv,_ZThn28_N3aaa9GG21231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21231213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21231213fooEv,_ZThn8_N3aaa9GG21231213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231213fooEv,_ZThn20_N3aaa9GG21231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21231213fooEv,_ZThn28_N3aaa9GG21231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123121E[];
Class_Descriptor cd__ZN3aaa9GG2123121E = {  "_ZN3aaa9GG2123121E", // class name
  bases__ZN3aaa9GG2123121E, 6,
  &(vtc__ZN3aaa9GG2123121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123122  : ::aaa::EE212 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21231223barEv
  ~GG2123122(); // tgen
  GG2123122(); // tgen
};
//SIG(1 _ZN3aaa9GG2123122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21231223barEv");}
aaa::GG2123122 ::~GG2123122(){ note_dtor("_ZN3aaa9GG2123122E", this);} // tgen
aaa::GG2123122 ::GG2123122(){ note_ctor("_ZN3aaa9GG2123122E", this);} // tgen
}
static void Test__ZN3aaa9GG2123122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123122E, buf);
    ::aaa::GG2123122 *dp, &lv = *(dp=new (buf) ::aaa::GG2123122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123122E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2123122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2123122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2123122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123122E);
    dp->::aaa::GG2123122::~GG2123122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123122E(Test__ZN3aaa9GG2123122E, "_ZN3aaa9GG2123122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123122C1Ev();
extern void _ZN3aaa9GG2123122D1Ev();
Name_Map name_map__ZN3aaa9GG2123122E[] = {
  NSPAIR(_ZN3aaa9GG2123122C1Ev),
  NSPAIR(_ZN3aaa9GG2123122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2123122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123122E[];
extern void _ZN3aaa9GG21231223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21231223barEv,_ZThn20_N3aaa9GG21231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231223barEv,_ZThn20_N3aaa9GG21231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123122E[];
Class_Descriptor cd__ZN3aaa9GG2123122E = {  "_ZN3aaa9GG2123122E", // class name
  bases__ZN3aaa9GG2123122E, 6,
  &(vtc__ZN3aaa9GG2123122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123123  : ::aaa::EE212 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21231233fooEv
  virtual void  bar(); // _ZN3aaa9GG21231233barEv
  ~GG2123123(); // tgen
  GG2123123(); // tgen
};
//SIG(1 _ZN3aaa9GG2123123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21231233fooEv");}
void  aaa::GG2123123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21231233barEv");}
aaa::GG2123123 ::~GG2123123(){ note_dtor("_ZN3aaa9GG2123123E", this);} // tgen
aaa::GG2123123 ::GG2123123(){ note_ctor("_ZN3aaa9GG2123123E", this);} // tgen
}
static void Test__ZN3aaa9GG2123123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123123E, buf);
    ::aaa::GG2123123 *dp, &lv = *(dp=new (buf) ::aaa::GG2123123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123123E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2123123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2123123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2123123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123123E);
    dp->::aaa::GG2123123::~GG2123123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123123E(Test__ZN3aaa9GG2123123E, "_ZN3aaa9GG2123123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123123C1Ev();
extern void _ZN3aaa9GG2123123D1Ev();
Name_Map name_map__ZN3aaa9GG2123123E[] = {
  NSPAIR(_ZN3aaa9GG2123123C1Ev),
  NSPAIR(_ZN3aaa9GG2123123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2123123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123123E[];
extern void _ZN3aaa9GG21231233barEv();
extern void _ZN3aaa9GG21231233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21231233fooEv,_ZThn8_N3aaa9GG21231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231233fooEv,_ZThn20_N3aaa9GG21231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231233barEv,_ZThn20_N3aaa9GG21231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21231233fooEv,_ZThn28_N3aaa9GG21231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21231233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21231233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21231233fooEv,_ZThn8_N3aaa9GG21231233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231233fooEv,_ZThn20_N3aaa9GG21231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231233barEv,_ZThn20_N3aaa9GG21231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21231233fooEv,_ZThn28_N3aaa9GG21231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123123E[];
Class_Descriptor cd__ZN3aaa9GG2123123E = {  "_ZN3aaa9GG2123123E", // class name
  bases__ZN3aaa9GG2123123E, 6,
  &(vtc__ZN3aaa9GG2123123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123131  : ::aaa::EE212 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21231313fooEv
  ~GG2123131(); // tgen
  GG2123131(); // tgen
};
//SIG(1 _ZN3aaa9GG2123131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21231313fooEv");}
aaa::GG2123131 ::~GG2123131(){ note_dtor("_ZN3aaa9GG2123131E", this);} // tgen
aaa::GG2123131 ::GG2123131(){ note_ctor("_ZN3aaa9GG2123131E", this);} // tgen
}
static void Test__ZN3aaa9GG2123131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123131E, buf);
    ::aaa::GG2123131 *dp, &lv = *(dp=new (buf) ::aaa::GG2123131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123131E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2123131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2123131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2123131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123131E);
    dp->::aaa::GG2123131::~GG2123131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123131E(Test__ZN3aaa9GG2123131E, "_ZN3aaa9GG2123131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123131C1Ev();
extern void _ZN3aaa9GG2123131D1Ev();
Name_Map name_map__ZN3aaa9GG2123131E[] = {
  NSPAIR(_ZN3aaa9GG2123131C1Ev),
  NSPAIR(_ZN3aaa9GG2123131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2123131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123131E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21231313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21231313fooEv,_ZThn8_N3aaa9GG21231313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231313fooEv,_ZThn20_N3aaa9GG21231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21231313fooEv,_ZThn28_N3aaa9GG21231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21231313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21231313fooEv,_ZThn8_N3aaa9GG21231313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231313fooEv,_ZThn20_N3aaa9GG21231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21231313fooEv,_ZThn28_N3aaa9GG21231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123131E[];
Class_Descriptor cd__ZN3aaa9GG2123131E = {  "_ZN3aaa9GG2123131E", // class name
  bases__ZN3aaa9GG2123131E, 6,
  &(vtc__ZN3aaa9GG2123131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123132  : ::aaa::EE212 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21231323barEv
  ~GG2123132(); // tgen
  GG2123132(); // tgen
};
//SIG(1 _ZN3aaa9GG2123132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21231323barEv");}
aaa::GG2123132 ::~GG2123132(){ note_dtor("_ZN3aaa9GG2123132E", this);} // tgen
aaa::GG2123132 ::GG2123132(){ note_ctor("_ZN3aaa9GG2123132E", this);} // tgen
}
static void Test__ZN3aaa9GG2123132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123132E, buf);
    ::aaa::GG2123132 *dp, &lv = *(dp=new (buf) ::aaa::GG2123132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123132E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2123132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2123132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2123132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123132E);
    dp->::aaa::GG2123132::~GG2123132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123132E(Test__ZN3aaa9GG2123132E, "_ZN3aaa9GG2123132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123132C1Ev();
extern void _ZN3aaa9GG2123132D1Ev();
Name_Map name_map__ZN3aaa9GG2123132E[] = {
  NSPAIR(_ZN3aaa9GG2123132C1Ev),
  NSPAIR(_ZN3aaa9GG2123132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2123132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123132E[];
extern void _ZN3aaa9GG21231323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21231323barEv,_ZThn20_N3aaa9GG21231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231323barEv,_ZThn20_N3aaa9GG21231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123132E[];
Class_Descriptor cd__ZN3aaa9GG2123132E = {  "_ZN3aaa9GG2123132E", // class name
  bases__ZN3aaa9GG2123132E, 6,
  &(vtc__ZN3aaa9GG2123132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123132E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123133  : ::aaa::EE212 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21231333fooEv
  virtual void  bar(); // _ZN3aaa9GG21231333barEv
  ~GG2123133(); // tgen
  GG2123133(); // tgen
};
//SIG(1 _ZN3aaa9GG2123133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21231333fooEv");}
void  aaa::GG2123133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21231333barEv");}
aaa::GG2123133 ::~GG2123133(){ note_dtor("_ZN3aaa9GG2123133E", this);} // tgen
aaa::GG2123133 ::GG2123133(){ note_ctor("_ZN3aaa9GG2123133E", this);} // tgen
}
static void Test__ZN3aaa9GG2123133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123133E, buf);
    ::aaa::GG2123133 *dp, &lv = *(dp=new (buf) ::aaa::GG2123133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123133E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2123133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2123133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2123133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123133E);
    dp->::aaa::GG2123133::~GG2123133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123133E(Test__ZN3aaa9GG2123133E, "_ZN3aaa9GG2123133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123133C1Ev();
extern void _ZN3aaa9GG2123133D1Ev();
Name_Map name_map__ZN3aaa9GG2123133E[] = {
  NSPAIR(_ZN3aaa9GG2123133C1Ev),
  NSPAIR(_ZN3aaa9GG2123133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2123133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123133E[];
extern void _ZN3aaa9GG21231333barEv();
extern void _ZN3aaa9GG21231333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21231333fooEv,_ZThn8_N3aaa9GG21231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231333fooEv,_ZThn20_N3aaa9GG21231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21231333barEv,_ZThn20_N3aaa9GG21231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21231333fooEv,_ZThn28_N3aaa9GG21231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21231333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21231333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21231333fooEv,_ZThn8_N3aaa9GG21231333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231333fooEv,_ZThn20_N3aaa9GG21231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21231333barEv,_ZThn20_N3aaa9GG21231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21231333fooEv,_ZThn28_N3aaa9GG21231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123133E[];
Class_Descriptor cd__ZN3aaa9GG2123133E = {  "_ZN3aaa9GG2123133E", // class name
  bases__ZN3aaa9GG2123133E, 6,
  &(vtc__ZN3aaa9GG2123133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123211  : ::aaa::EE212 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21232113fooEv
  ~GG2123211(); // tgen
  GG2123211(); // tgen
};
//SIG(1 _ZN3aaa9GG2123211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21232113fooEv");}
aaa::GG2123211 ::~GG2123211(){ note_dtor("_ZN3aaa9GG2123211E", this);} // tgen
aaa::GG2123211 ::GG2123211(){ note_ctor("_ZN3aaa9GG2123211E", this);} // tgen
}
static void Test__ZN3aaa9GG2123211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123211E, buf);
    ::aaa::GG2123211 *dp, &lv = *(dp=new (buf) ::aaa::GG2123211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123211E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2123211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2123211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2123211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123211E);
    dp->::aaa::GG2123211::~GG2123211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123211E(Test__ZN3aaa9GG2123211E, "_ZN3aaa9GG2123211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123211C1Ev();
extern void _ZN3aaa9GG2123211D1Ev();
Name_Map name_map__ZN3aaa9GG2123211E[] = {
  NSPAIR(_ZN3aaa9GG2123211C1Ev),
  NSPAIR(_ZN3aaa9GG2123211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2123211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123211E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21232113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21232113fooEv,_ZThn8_N3aaa9GG21232113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232113fooEv,_ZThn20_N3aaa9GG21232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21232113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21232113fooEv,_ZThn8_N3aaa9GG21232113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232113fooEv,_ZThn20_N3aaa9GG21232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123211E[];
Class_Descriptor cd__ZN3aaa9GG2123211E = {  "_ZN3aaa9GG2123211E", // class name
  bases__ZN3aaa9GG2123211E, 6,
  &(vtc__ZN3aaa9GG2123211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123212  : ::aaa::EE212 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21232123barEv
  ~GG2123212(); // tgen
  GG2123212(); // tgen
};
//SIG(1 _ZN3aaa9GG2123212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21232123barEv");}
aaa::GG2123212 ::~GG2123212(){ note_dtor("_ZN3aaa9GG2123212E", this);} // tgen
aaa::GG2123212 ::GG2123212(){ note_ctor("_ZN3aaa9GG2123212E", this);} // tgen
}
static void Test__ZN3aaa9GG2123212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123212E, buf);
    ::aaa::GG2123212 *dp, &lv = *(dp=new (buf) ::aaa::GG2123212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123212E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2123212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2123212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2123212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123212E);
    dp->::aaa::GG2123212::~GG2123212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123212E(Test__ZN3aaa9GG2123212E, "_ZN3aaa9GG2123212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123212C1Ev();
extern void _ZN3aaa9GG2123212D1Ev();
Name_Map name_map__ZN3aaa9GG2123212E[] = {
  NSPAIR(_ZN3aaa9GG2123212C1Ev),
  NSPAIR(_ZN3aaa9GG2123212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2123212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123212E[];
extern void _ZN3aaa9GG21232123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21232123barEv,_ZThn20_N3aaa9GG21232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21232123barEv,_ZThn28_N3aaa9GG21232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232123barEv,_ZThn20_N3aaa9GG21232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21232123barEv,_ZThn28_N3aaa9GG21232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123212E[];
Class_Descriptor cd__ZN3aaa9GG2123212E = {  "_ZN3aaa9GG2123212E", // class name
  bases__ZN3aaa9GG2123212E, 6,
  &(vtc__ZN3aaa9GG2123212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123213  : ::aaa::EE212 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21232133fooEv
  virtual void  bar(); // _ZN3aaa9GG21232133barEv
  ~GG2123213(); // tgen
  GG2123213(); // tgen
};
//SIG(1 _ZN3aaa9GG2123213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21232133fooEv");}
void  aaa::GG2123213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21232133barEv");}
aaa::GG2123213 ::~GG2123213(){ note_dtor("_ZN3aaa9GG2123213E", this);} // tgen
aaa::GG2123213 ::GG2123213(){ note_ctor("_ZN3aaa9GG2123213E", this);} // tgen
}
static void Test__ZN3aaa9GG2123213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123213E, buf);
    ::aaa::GG2123213 *dp, &lv = *(dp=new (buf) ::aaa::GG2123213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123213E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2123213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2123213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2123213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123213E);
    dp->::aaa::GG2123213::~GG2123213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123213E(Test__ZN3aaa9GG2123213E, "_ZN3aaa9GG2123213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123213C1Ev();
extern void _ZN3aaa9GG2123213D1Ev();
Name_Map name_map__ZN3aaa9GG2123213E[] = {
  NSPAIR(_ZN3aaa9GG2123213C1Ev),
  NSPAIR(_ZN3aaa9GG2123213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2123213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123213E[];
extern void _ZN3aaa9GG21232133barEv();
extern void _ZN3aaa9GG21232133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21232133fooEv,_ZThn8_N3aaa9GG21232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232133fooEv,_ZThn20_N3aaa9GG21232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232133barEv,_ZThn20_N3aaa9GG21232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21232133barEv,_ZThn28_N3aaa9GG21232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21232133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21232133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21232133fooEv,_ZThn8_N3aaa9GG21232133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232133fooEv,_ZThn20_N3aaa9GG21232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232133barEv,_ZThn20_N3aaa9GG21232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21232133barEv,_ZThn28_N3aaa9GG21232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123213E[];
Class_Descriptor cd__ZN3aaa9GG2123213E = {  "_ZN3aaa9GG2123213E", // class name
  bases__ZN3aaa9GG2123213E, 6,
  &(vtc__ZN3aaa9GG2123213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123221  : ::aaa::EE212 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21232213fooEv
  ~GG2123221(); // tgen
  GG2123221(); // tgen
};
//SIG(1 _ZN3aaa9GG2123221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21232213fooEv");}
aaa::GG2123221 ::~GG2123221(){ note_dtor("_ZN3aaa9GG2123221E", this);} // tgen
aaa::GG2123221 ::GG2123221(){ note_ctor("_ZN3aaa9GG2123221E", this);} // tgen
}
static void Test__ZN3aaa9GG2123221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123221E, buf);
    ::aaa::GG2123221 *dp, &lv = *(dp=new (buf) ::aaa::GG2123221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123221E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2123221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2123221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2123221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123221E);
    dp->::aaa::GG2123221::~GG2123221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123221E(Test__ZN3aaa9GG2123221E, "_ZN3aaa9GG2123221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123221C1Ev();
extern void _ZN3aaa9GG2123221D1Ev();
Name_Map name_map__ZN3aaa9GG2123221E[] = {
  NSPAIR(_ZN3aaa9GG2123221C1Ev),
  NSPAIR(_ZN3aaa9GG2123221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2123221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123221E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21232213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21232213fooEv,_ZThn8_N3aaa9GG21232213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232213fooEv,_ZThn20_N3aaa9GG21232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21232213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21232213fooEv,_ZThn8_N3aaa9GG21232213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232213fooEv,_ZThn20_N3aaa9GG21232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123221E[];
Class_Descriptor cd__ZN3aaa9GG2123221E = {  "_ZN3aaa9GG2123221E", // class name
  bases__ZN3aaa9GG2123221E, 6,
  &(vtc__ZN3aaa9GG2123221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123222  : ::aaa::EE212 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21232223barEv
  ~GG2123222(); // tgen
  GG2123222(); // tgen
};
//SIG(1 _ZN3aaa9GG2123222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21232223barEv");}
aaa::GG2123222 ::~GG2123222(){ note_dtor("_ZN3aaa9GG2123222E", this);} // tgen
aaa::GG2123222 ::GG2123222(){ note_ctor("_ZN3aaa9GG2123222E", this);} // tgen
}
static void Test__ZN3aaa9GG2123222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123222E, buf);
    ::aaa::GG2123222 *dp, &lv = *(dp=new (buf) ::aaa::GG2123222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123222E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2123222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2123222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2123222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123222E);
    dp->::aaa::GG2123222::~GG2123222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123222E(Test__ZN3aaa9GG2123222E, "_ZN3aaa9GG2123222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123222C1Ev();
extern void _ZN3aaa9GG2123222D1Ev();
Name_Map name_map__ZN3aaa9GG2123222E[] = {
  NSPAIR(_ZN3aaa9GG2123222C1Ev),
  NSPAIR(_ZN3aaa9GG2123222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2123222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123222E[];
extern void _ZN3aaa9GG21232223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21232223barEv,_ZThn20_N3aaa9GG21232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21232223barEv,_ZThn28_N3aaa9GG21232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232223barEv,_ZThn20_N3aaa9GG21232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21232223barEv,_ZThn28_N3aaa9GG21232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123222E[];
Class_Descriptor cd__ZN3aaa9GG2123222E = {  "_ZN3aaa9GG2123222E", // class name
  bases__ZN3aaa9GG2123222E, 6,
  &(vtc__ZN3aaa9GG2123222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123223  : ::aaa::EE212 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21232233fooEv
  virtual void  bar(); // _ZN3aaa9GG21232233barEv
  ~GG2123223(); // tgen
  GG2123223(); // tgen
};
//SIG(1 _ZN3aaa9GG2123223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21232233fooEv");}
void  aaa::GG2123223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21232233barEv");}
aaa::GG2123223 ::~GG2123223(){ note_dtor("_ZN3aaa9GG2123223E", this);} // tgen
aaa::GG2123223 ::GG2123223(){ note_ctor("_ZN3aaa9GG2123223E", this);} // tgen
}
static void Test__ZN3aaa9GG2123223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123223E, buf);
    ::aaa::GG2123223 *dp, &lv = *(dp=new (buf) ::aaa::GG2123223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123223E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2123223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2123223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2123223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123223E);
    dp->::aaa::GG2123223::~GG2123223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123223E(Test__ZN3aaa9GG2123223E, "_ZN3aaa9GG2123223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123223C1Ev();
extern void _ZN3aaa9GG2123223D1Ev();
Name_Map name_map__ZN3aaa9GG2123223E[] = {
  NSPAIR(_ZN3aaa9GG2123223C1Ev),
  NSPAIR(_ZN3aaa9GG2123223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2123223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123223E[];
extern void _ZN3aaa9GG21232233barEv();
extern void _ZN3aaa9GG21232233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21232233fooEv,_ZThn8_N3aaa9GG21232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232233fooEv,_ZThn20_N3aaa9GG21232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232233barEv,_ZThn20_N3aaa9GG21232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21232233barEv,_ZThn28_N3aaa9GG21232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21232233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21232233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21232233fooEv,_ZThn8_N3aaa9GG21232233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232233fooEv,_ZThn20_N3aaa9GG21232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232233barEv,_ZThn20_N3aaa9GG21232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21232233barEv,_ZThn28_N3aaa9GG21232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123223E[];
Class_Descriptor cd__ZN3aaa9GG2123223E = {  "_ZN3aaa9GG2123223E", // class name
  bases__ZN3aaa9GG2123223E, 6,
  &(vtc__ZN3aaa9GG2123223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123231  : ::aaa::EE212 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21232313fooEv
  ~GG2123231(); // tgen
  GG2123231(); // tgen
};
//SIG(1 _ZN3aaa9GG2123231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21232313fooEv");}
aaa::GG2123231 ::~GG2123231(){ note_dtor("_ZN3aaa9GG2123231E", this);} // tgen
aaa::GG2123231 ::GG2123231(){ note_ctor("_ZN3aaa9GG2123231E", this);} // tgen
}
static void Test__ZN3aaa9GG2123231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123231E, buf);
    ::aaa::GG2123231 *dp, &lv = *(dp=new (buf) ::aaa::GG2123231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123231E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2123231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2123231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2123231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123231E);
    dp->::aaa::GG2123231::~GG2123231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123231E(Test__ZN3aaa9GG2123231E, "_ZN3aaa9GG2123231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123231C1Ev();
extern void _ZN3aaa9GG2123231D1Ev();
Name_Map name_map__ZN3aaa9GG2123231E[] = {
  NSPAIR(_ZN3aaa9GG2123231C1Ev),
  NSPAIR(_ZN3aaa9GG2123231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2123231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123231E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21232313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21232313fooEv,_ZThn8_N3aaa9GG21232313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232313fooEv,_ZThn20_N3aaa9GG21232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21232313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21232313fooEv,_ZThn8_N3aaa9GG21232313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232313fooEv,_ZThn20_N3aaa9GG21232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123231E[];
Class_Descriptor cd__ZN3aaa9GG2123231E = {  "_ZN3aaa9GG2123231E", // class name
  bases__ZN3aaa9GG2123231E, 6,
  &(vtc__ZN3aaa9GG2123231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123232  : ::aaa::EE212 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21232323barEv
  ~GG2123232(); // tgen
  GG2123232(); // tgen
};
//SIG(1 _ZN3aaa9GG2123232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21232323barEv");}
aaa::GG2123232 ::~GG2123232(){ note_dtor("_ZN3aaa9GG2123232E", this);} // tgen
aaa::GG2123232 ::GG2123232(){ note_ctor("_ZN3aaa9GG2123232E", this);} // tgen
}
static void Test__ZN3aaa9GG2123232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123232E, buf);
    ::aaa::GG2123232 *dp, &lv = *(dp=new (buf) ::aaa::GG2123232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123232E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2123232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2123232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2123232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123232E);
    dp->::aaa::GG2123232::~GG2123232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123232E(Test__ZN3aaa9GG2123232E, "_ZN3aaa9GG2123232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123232C1Ev();
extern void _ZN3aaa9GG2123232D1Ev();
Name_Map name_map__ZN3aaa9GG2123232E[] = {
  NSPAIR(_ZN3aaa9GG2123232C1Ev),
  NSPAIR(_ZN3aaa9GG2123232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2123232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123232E[];
extern void _ZN3aaa9GG21232323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21232323barEv,_ZThn20_N3aaa9GG21232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21232323barEv,_ZThn28_N3aaa9GG21232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232323barEv,_ZThn20_N3aaa9GG21232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21232323barEv,_ZThn28_N3aaa9GG21232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123232E[];
Class_Descriptor cd__ZN3aaa9GG2123232E = {  "_ZN3aaa9GG2123232E", // class name
  bases__ZN3aaa9GG2123232E, 6,
  &(vtc__ZN3aaa9GG2123232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123232E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123233  : ::aaa::EE212 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21232333fooEv
  virtual void  bar(); // _ZN3aaa9GG21232333barEv
  ~GG2123233(); // tgen
  GG2123233(); // tgen
};
//SIG(1 _ZN3aaa9GG2123233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21232333fooEv");}
void  aaa::GG2123233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21232333barEv");}
aaa::GG2123233 ::~GG2123233(){ note_dtor("_ZN3aaa9GG2123233E", this);} // tgen
aaa::GG2123233 ::GG2123233(){ note_ctor("_ZN3aaa9GG2123233E", this);} // tgen
}
static void Test__ZN3aaa9GG2123233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123233E, buf);
    ::aaa::GG2123233 *dp, &lv = *(dp=new (buf) ::aaa::GG2123233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123233E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2123233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2123233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2123233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123233E);
    dp->::aaa::GG2123233::~GG2123233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123233E(Test__ZN3aaa9GG2123233E, "_ZN3aaa9GG2123233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123233C1Ev();
extern void _ZN3aaa9GG2123233D1Ev();
Name_Map name_map__ZN3aaa9GG2123233E[] = {
  NSPAIR(_ZN3aaa9GG2123233C1Ev),
  NSPAIR(_ZN3aaa9GG2123233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2123233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123233E[];
extern void _ZN3aaa9GG21232333barEv();
extern void _ZN3aaa9GG21232333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21232333fooEv,_ZThn8_N3aaa9GG21232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232333fooEv,_ZThn20_N3aaa9GG21232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21232333barEv,_ZThn20_N3aaa9GG21232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21232333barEv,_ZThn28_N3aaa9GG21232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21232333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21232333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21232333fooEv,_ZThn8_N3aaa9GG21232333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232333fooEv,_ZThn20_N3aaa9GG21232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21232333barEv,_ZThn20_N3aaa9GG21232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21232333barEv,_ZThn28_N3aaa9GG21232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123233E[];
Class_Descriptor cd__ZN3aaa9GG2123233E = {  "_ZN3aaa9GG2123233E", // class name
  bases__ZN3aaa9GG2123233E, 6,
  &(vtc__ZN3aaa9GG2123233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123311  : ::aaa::EE212 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21233113fooEv
  ~GG2123311(); // tgen
  GG2123311(); // tgen
};
//SIG(1 _ZN3aaa9GG2123311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21233113fooEv");}
aaa::GG2123311 ::~GG2123311(){ note_dtor("_ZN3aaa9GG2123311E", this);} // tgen
aaa::GG2123311 ::GG2123311(){ note_ctor("_ZN3aaa9GG2123311E", this);} // tgen
}
static void Test__ZN3aaa9GG2123311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123311E, buf);
    ::aaa::GG2123311 *dp, &lv = *(dp=new (buf) ::aaa::GG2123311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123311E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2123311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2123311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2123311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123311E);
    dp->::aaa::GG2123311::~GG2123311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123311E(Test__ZN3aaa9GG2123311E, "_ZN3aaa9GG2123311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123311C1Ev();
extern void _ZN3aaa9GG2123311D1Ev();
Name_Map name_map__ZN3aaa9GG2123311E[] = {
  NSPAIR(_ZN3aaa9GG2123311C1Ev),
  NSPAIR(_ZN3aaa9GG2123311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2123311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123311E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21233113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21233113fooEv,_ZThn8_N3aaa9GG21233113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233113fooEv,_ZThn20_N3aaa9GG21233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21233113fooEv,_ZThn28_N3aaa9GG21233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21233113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21233113fooEv,_ZThn8_N3aaa9GG21233113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233113fooEv,_ZThn20_N3aaa9GG21233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233113fooEv,_ZThn28_N3aaa9GG21233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123311E[];
Class_Descriptor cd__ZN3aaa9GG2123311E = {  "_ZN3aaa9GG2123311E", // class name
  bases__ZN3aaa9GG2123311E, 6,
  &(vtc__ZN3aaa9GG2123311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123312  : ::aaa::EE212 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21233123barEv
  ~GG2123312(); // tgen
  GG2123312(); // tgen
};
//SIG(1 _ZN3aaa9GG2123312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21233123barEv");}
aaa::GG2123312 ::~GG2123312(){ note_dtor("_ZN3aaa9GG2123312E", this);} // tgen
aaa::GG2123312 ::GG2123312(){ note_ctor("_ZN3aaa9GG2123312E", this);} // tgen
}
static void Test__ZN3aaa9GG2123312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123312E, buf);
    ::aaa::GG2123312 *dp, &lv = *(dp=new (buf) ::aaa::GG2123312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123312E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2123312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2123312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2123312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123312E);
    dp->::aaa::GG2123312::~GG2123312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123312E(Test__ZN3aaa9GG2123312E, "_ZN3aaa9GG2123312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123312C1Ev();
extern void _ZN3aaa9GG2123312D1Ev();
Name_Map name_map__ZN3aaa9GG2123312E[] = {
  NSPAIR(_ZN3aaa9GG2123312C1Ev),
  NSPAIR(_ZN3aaa9GG2123312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2123312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123312E[];
extern void _ZN3aaa9GG21233123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21233123barEv,_ZThn20_N3aaa9GG21233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21233123barEv,_ZThn28_N3aaa9GG21233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233123barEv,_ZThn20_N3aaa9GG21233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233123barEv,_ZThn28_N3aaa9GG21233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123312E[];
Class_Descriptor cd__ZN3aaa9GG2123312E = {  "_ZN3aaa9GG2123312E", // class name
  bases__ZN3aaa9GG2123312E, 6,
  &(vtc__ZN3aaa9GG2123312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123313  : ::aaa::EE212 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21233133fooEv
  virtual void  bar(); // _ZN3aaa9GG21233133barEv
  ~GG2123313(); // tgen
  GG2123313(); // tgen
};
//SIG(1 _ZN3aaa9GG2123313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21233133fooEv");}
void  aaa::GG2123313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21233133barEv");}
aaa::GG2123313 ::~GG2123313(){ note_dtor("_ZN3aaa9GG2123313E", this);} // tgen
aaa::GG2123313 ::GG2123313(){ note_ctor("_ZN3aaa9GG2123313E", this);} // tgen
}
static void Test__ZN3aaa9GG2123313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123313E, buf);
    ::aaa::GG2123313 *dp, &lv = *(dp=new (buf) ::aaa::GG2123313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123313E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2123313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2123313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2123313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123313E);
    dp->::aaa::GG2123313::~GG2123313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123313E(Test__ZN3aaa9GG2123313E, "_ZN3aaa9GG2123313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123313C1Ev();
extern void _ZN3aaa9GG2123313D1Ev();
Name_Map name_map__ZN3aaa9GG2123313E[] = {
  NSPAIR(_ZN3aaa9GG2123313C1Ev),
  NSPAIR(_ZN3aaa9GG2123313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2123313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123313E[];
extern void _ZN3aaa9GG21233133barEv();
extern void _ZN3aaa9GG21233133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21233133fooEv,_ZThn8_N3aaa9GG21233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233133fooEv,_ZThn20_N3aaa9GG21233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233133barEv,_ZThn20_N3aaa9GG21233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21233133fooEv,_ZThn28_N3aaa9GG21233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21233133barEv,_ZThn28_N3aaa9GG21233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21233133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21233133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21233133fooEv,_ZThn8_N3aaa9GG21233133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233133fooEv,_ZThn20_N3aaa9GG21233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233133barEv,_ZThn20_N3aaa9GG21233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233133fooEv,_ZThn28_N3aaa9GG21233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233133barEv,_ZThn28_N3aaa9GG21233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123313E[];
Class_Descriptor cd__ZN3aaa9GG2123313E = {  "_ZN3aaa9GG2123313E", // class name
  bases__ZN3aaa9GG2123313E, 6,
  &(vtc__ZN3aaa9GG2123313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123321  : ::aaa::EE212 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21233213fooEv
  ~GG2123321(); // tgen
  GG2123321(); // tgen
};
//SIG(1 _ZN3aaa9GG2123321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21233213fooEv");}
aaa::GG2123321 ::~GG2123321(){ note_dtor("_ZN3aaa9GG2123321E", this);} // tgen
aaa::GG2123321 ::GG2123321(){ note_ctor("_ZN3aaa9GG2123321E", this);} // tgen
}
static void Test__ZN3aaa9GG2123321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123321E, buf);
    ::aaa::GG2123321 *dp, &lv = *(dp=new (buf) ::aaa::GG2123321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123321E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2123321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2123321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2123321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123321E);
    dp->::aaa::GG2123321::~GG2123321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123321E(Test__ZN3aaa9GG2123321E, "_ZN3aaa9GG2123321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123321C1Ev();
extern void _ZN3aaa9GG2123321D1Ev();
Name_Map name_map__ZN3aaa9GG2123321E[] = {
  NSPAIR(_ZN3aaa9GG2123321C1Ev),
  NSPAIR(_ZN3aaa9GG2123321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2123321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123321E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21233213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21233213fooEv,_ZThn8_N3aaa9GG21233213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233213fooEv,_ZThn20_N3aaa9GG21233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21233213fooEv,_ZThn28_N3aaa9GG21233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21233213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21233213fooEv,_ZThn8_N3aaa9GG21233213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233213fooEv,_ZThn20_N3aaa9GG21233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233213fooEv,_ZThn28_N3aaa9GG21233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123321E[];
Class_Descriptor cd__ZN3aaa9GG2123321E = {  "_ZN3aaa9GG2123321E", // class name
  bases__ZN3aaa9GG2123321E, 6,
  &(vtc__ZN3aaa9GG2123321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123322  : ::aaa::EE212 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21233223barEv
  ~GG2123322(); // tgen
  GG2123322(); // tgen
};
//SIG(1 _ZN3aaa9GG2123322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21233223barEv");}
aaa::GG2123322 ::~GG2123322(){ note_dtor("_ZN3aaa9GG2123322E", this);} // tgen
aaa::GG2123322 ::GG2123322(){ note_ctor("_ZN3aaa9GG2123322E", this);} // tgen
}
static void Test__ZN3aaa9GG2123322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123322E, buf);
    ::aaa::GG2123322 *dp, &lv = *(dp=new (buf) ::aaa::GG2123322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123322E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2123322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2123322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2123322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123322E);
    dp->::aaa::GG2123322::~GG2123322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123322E(Test__ZN3aaa9GG2123322E, "_ZN3aaa9GG2123322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123322C1Ev();
extern void _ZN3aaa9GG2123322D1Ev();
Name_Map name_map__ZN3aaa9GG2123322E[] = {
  NSPAIR(_ZN3aaa9GG2123322C1Ev),
  NSPAIR(_ZN3aaa9GG2123322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2123322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123322E[];
extern void _ZN3aaa9GG21233223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21233223barEv,_ZThn20_N3aaa9GG21233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21233223barEv,_ZThn28_N3aaa9GG21233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233223barEv,_ZThn20_N3aaa9GG21233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233223barEv,_ZThn28_N3aaa9GG21233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123322E[];
Class_Descriptor cd__ZN3aaa9GG2123322E = {  "_ZN3aaa9GG2123322E", // class name
  bases__ZN3aaa9GG2123322E, 6,
  &(vtc__ZN3aaa9GG2123322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123323  : ::aaa::EE212 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21233233fooEv
  virtual void  bar(); // _ZN3aaa9GG21233233barEv
  ~GG2123323(); // tgen
  GG2123323(); // tgen
};
//SIG(1 _ZN3aaa9GG2123323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21233233fooEv");}
void  aaa::GG2123323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21233233barEv");}
aaa::GG2123323 ::~GG2123323(){ note_dtor("_ZN3aaa9GG2123323E", this);} // tgen
aaa::GG2123323 ::GG2123323(){ note_ctor("_ZN3aaa9GG2123323E", this);} // tgen
}
static void Test__ZN3aaa9GG2123323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123323E, buf);
    ::aaa::GG2123323 *dp, &lv = *(dp=new (buf) ::aaa::GG2123323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123323E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2123323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2123323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2123323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123323E);
    dp->::aaa::GG2123323::~GG2123323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123323E(Test__ZN3aaa9GG2123323E, "_ZN3aaa9GG2123323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123323C1Ev();
extern void _ZN3aaa9GG2123323D1Ev();
Name_Map name_map__ZN3aaa9GG2123323E[] = {
  NSPAIR(_ZN3aaa9GG2123323C1Ev),
  NSPAIR(_ZN3aaa9GG2123323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2123323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123323E[];
extern void _ZN3aaa9GG21233233barEv();
extern void _ZN3aaa9GG21233233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21233233fooEv,_ZThn8_N3aaa9GG21233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233233fooEv,_ZThn20_N3aaa9GG21233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233233barEv,_ZThn20_N3aaa9GG21233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21233233fooEv,_ZThn28_N3aaa9GG21233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21233233barEv,_ZThn28_N3aaa9GG21233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21233233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21233233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21233233fooEv,_ZThn8_N3aaa9GG21233233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233233fooEv,_ZThn20_N3aaa9GG21233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233233barEv,_ZThn20_N3aaa9GG21233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233233fooEv,_ZThn28_N3aaa9GG21233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233233barEv,_ZThn28_N3aaa9GG21233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123323E[];
Class_Descriptor cd__ZN3aaa9GG2123323E = {  "_ZN3aaa9GG2123323E", // class name
  bases__ZN3aaa9GG2123323E, 6,
  &(vtc__ZN3aaa9GG2123323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123331  : ::aaa::EE212 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21233313fooEv
  ~GG2123331(); // tgen
  GG2123331(); // tgen
};
//SIG(1 _ZN3aaa9GG2123331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21233313fooEv");}
aaa::GG2123331 ::~GG2123331(){ note_dtor("_ZN3aaa9GG2123331E", this);} // tgen
aaa::GG2123331 ::GG2123331(){ note_ctor("_ZN3aaa9GG2123331E", this);} // tgen
}
static void Test__ZN3aaa9GG2123331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123331E, buf);
    ::aaa::GG2123331 *dp, &lv = *(dp=new (buf) ::aaa::GG2123331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123331E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2123331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2123331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2123331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123331E);
    dp->::aaa::GG2123331::~GG2123331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123331E(Test__ZN3aaa9GG2123331E, "_ZN3aaa9GG2123331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123331C1Ev();
extern void _ZN3aaa9GG2123331D1Ev();
Name_Map name_map__ZN3aaa9GG2123331E[] = {
  NSPAIR(_ZN3aaa9GG2123331C1Ev),
  NSPAIR(_ZN3aaa9GG2123331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2123331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123331E[];
extern void _ZN3aaa5EE2123barEv();
extern void _ZN3aaa9GG21233313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21233313fooEv,_ZThn8_N3aaa9GG21233313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233313fooEv,_ZThn20_N3aaa9GG21233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21233313fooEv,_ZThn28_N3aaa9GG21233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2123barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21233313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21233313fooEv,_ZThn8_N3aaa9GG21233313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233313fooEv,_ZThn20_N3aaa9GG21233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233313fooEv,_ZThn28_N3aaa9GG21233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123331E[];
Class_Descriptor cd__ZN3aaa9GG2123331E = {  "_ZN3aaa9GG2123331E", // class name
  bases__ZN3aaa9GG2123331E, 6,
  &(vtc__ZN3aaa9GG2123331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123332  : ::aaa::EE212 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21233323barEv
  ~GG2123332(); // tgen
  GG2123332(); // tgen
};
//SIG(1 _ZN3aaa9GG2123332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2123332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21233323barEv");}
aaa::GG2123332 ::~GG2123332(){ note_dtor("_ZN3aaa9GG2123332E", this);} // tgen
aaa::GG2123332 ::GG2123332(){ note_ctor("_ZN3aaa9GG2123332E", this);} // tgen
}
static void Test__ZN3aaa9GG2123332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123332E, buf);
    ::aaa::GG2123332 *dp, &lv = *(dp=new (buf) ::aaa::GG2123332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123332E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2123332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2123332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2123332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123332E);
    dp->::aaa::GG2123332::~GG2123332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123332E(Test__ZN3aaa9GG2123332E, "_ZN3aaa9GG2123332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123332C1Ev();
extern void _ZN3aaa9GG2123332D1Ev();
Name_Map name_map__ZN3aaa9GG2123332E[] = {
  NSPAIR(_ZN3aaa9GG2123332C1Ev),
  NSPAIR(_ZN3aaa9GG2123332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2123332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123332E[];
extern void _ZN3aaa9GG21233323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21233323barEv,_ZThn20_N3aaa9GG21233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21233323barEv,_ZThn28_N3aaa9GG21233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233323barEv,_ZThn20_N3aaa9GG21233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233323barEv,_ZThn28_N3aaa9GG21233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123332E[];
Class_Descriptor cd__ZN3aaa9GG2123332E = {  "_ZN3aaa9GG2123332E", // class name
  bases__ZN3aaa9GG2123332E, 6,
  &(vtc__ZN3aaa9GG2123332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123332E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2123333  : ::aaa::EE212 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21233333fooEv
  virtual void  bar(); // _ZN3aaa9GG21233333barEv
  ~GG2123333(); // tgen
  GG2123333(); // tgen
};
//SIG(1 _ZN3aaa9GG2123333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2123333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21233333fooEv");}
void  aaa::GG2123333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21233333barEv");}
aaa::GG2123333 ::~GG2123333(){ note_dtor("_ZN3aaa9GG2123333E", this);} // tgen
aaa::GG2123333 ::GG2123333(){ note_ctor("_ZN3aaa9GG2123333E", this);} // tgen
}
static void Test__ZN3aaa9GG2123333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2123333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2123333E, buf);
    ::aaa::GG2123333 *dp, &lv = *(dp=new (buf) ::aaa::GG2123333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2123333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2123333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE212*), 0, "_ZN3aaa9GG2123333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE212*), ABISELECT(16,8), "_ZN3aaa9GG2123333E");
    check_base_class_offset(lv, (::aaa::EE212*), 0, "_ZN3aaa9GG2123333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2123333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2123333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2123333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2123333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2123333E);
    dp->::aaa::GG2123333::~GG2123333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2123333E(Test__ZN3aaa9GG2123333E, "_ZN3aaa9GG2123333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2123333C1Ev();
extern void _ZN3aaa9GG2123333D1Ev();
Name_Map name_map__ZN3aaa9GG2123333E[] = {
  NSPAIR(_ZN3aaa9GG2123333C1Ev),
  NSPAIR(_ZN3aaa9GG2123333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE212E;
extern VTBL_ENTRY _ZTIN3aaa5EE212E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE212E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2123333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE212E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2123333E[];
extern void _ZN3aaa9GG21233333barEv();
extern void _ZN3aaa9GG21233333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21233333fooEv,_ZThn8_N3aaa9GG21233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233333fooEv,_ZThn20_N3aaa9GG21233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21233333barEv,_ZThn20_N3aaa9GG21233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21233333fooEv,_ZThn28_N3aaa9GG21233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21233333barEv,_ZThn28_N3aaa9GG21233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2123333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21233333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21233333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21233333fooEv,_ZThn8_N3aaa9GG21233333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233333fooEv,_ZThn20_N3aaa9GG21233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21233333barEv,_ZThn20_N3aaa9GG21233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233333fooEv,_ZThn28_N3aaa9GG21233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21233333barEv,_ZThn28_N3aaa9GG21233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2123333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2123333E[];
Class_Descriptor cd__ZN3aaa9GG2123333E = {  "_ZN3aaa9GG2123333E", // class name
  bases__ZN3aaa9GG2123333E, 6,
  &(vtc__ZN3aaa9GG2123333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2123333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2123333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131111  : ::aaa::EE213 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21311113fooEv
  ~GG2131111(); // tgen
  GG2131111(); // tgen
};
//SIG(1 _ZN3aaa9GG2131111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21311113fooEv");}
aaa::GG2131111 ::~GG2131111(){ note_dtor("_ZN3aaa9GG2131111E", this);} // tgen
aaa::GG2131111 ::GG2131111(){ note_ctor("_ZN3aaa9GG2131111E", this);} // tgen
}
static void Test__ZN3aaa9GG2131111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131111E, buf);
    ::aaa::GG2131111 *dp, &lv = *(dp=new (buf) ::aaa::GG2131111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131111E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2131111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2131111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2131111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131111E);
    dp->::aaa::GG2131111::~GG2131111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131111E(Test__ZN3aaa9GG2131111E, "_ZN3aaa9GG2131111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131111C1Ev();
extern void _ZN3aaa9GG2131111D1Ev();
Name_Map name_map__ZN3aaa9GG2131111E[] = {
  NSPAIR(_ZN3aaa9GG2131111C1Ev),
  NSPAIR(_ZN3aaa9GG2131111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2131111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131111E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21311113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21311113fooEv,_ZThn8_N3aaa9GG21311113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21311113fooEv,_ZThn20_N3aaa9GG21311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21311113fooEv,_ZThn28_N3aaa9GG21311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21311113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21311113fooEv,_ZThn8_N3aaa9GG21311113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311113fooEv,_ZThn20_N3aaa9GG21311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21311113fooEv,_ZThn28_N3aaa9GG21311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131111E[];
Class_Descriptor cd__ZN3aaa9GG2131111E = {  "_ZN3aaa9GG2131111E", // class name
  bases__ZN3aaa9GG2131111E, 6,
  &(vtc__ZN3aaa9GG2131111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131112  : ::aaa::EE213 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21311123barEv
  ~GG2131112(); // tgen
  GG2131112(); // tgen
};
//SIG(1 _ZN3aaa9GG2131112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21311123barEv");}
aaa::GG2131112 ::~GG2131112(){ note_dtor("_ZN3aaa9GG2131112E", this);} // tgen
aaa::GG2131112 ::GG2131112(){ note_ctor("_ZN3aaa9GG2131112E", this);} // tgen
}
static void Test__ZN3aaa9GG2131112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131112E, buf);
    ::aaa::GG2131112 *dp, &lv = *(dp=new (buf) ::aaa::GG2131112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131112E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2131112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2131112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2131112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131112E);
    dp->::aaa::GG2131112::~GG2131112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131112E(Test__ZN3aaa9GG2131112E, "_ZN3aaa9GG2131112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131112C1Ev();
extern void _ZN3aaa9GG2131112D1Ev();
Name_Map name_map__ZN3aaa9GG2131112E[] = {
  NSPAIR(_ZN3aaa9GG2131112C1Ev),
  NSPAIR(_ZN3aaa9GG2131112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2131112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131112E[];
extern void _ZN3aaa9GG21311123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21311123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131112E[];
Class_Descriptor cd__ZN3aaa9GG2131112E = {  "_ZN3aaa9GG2131112E", // class name
  bases__ZN3aaa9GG2131112E, 6,
  &(vtc__ZN3aaa9GG2131112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131113  : ::aaa::EE213 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21311133fooEv
  virtual void  bar(); // _ZN3aaa9GG21311133barEv
  ~GG2131113(); // tgen
  GG2131113(); // tgen
};
//SIG(1 _ZN3aaa9GG2131113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21311133fooEv");}
void  aaa::GG2131113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21311133barEv");}
aaa::GG2131113 ::~GG2131113(){ note_dtor("_ZN3aaa9GG2131113E", this);} // tgen
aaa::GG2131113 ::GG2131113(){ note_ctor("_ZN3aaa9GG2131113E", this);} // tgen
}
static void Test__ZN3aaa9GG2131113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131113E, buf);
    ::aaa::GG2131113 *dp, &lv = *(dp=new (buf) ::aaa::GG2131113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131113E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2131113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2131113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2131113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131113E);
    dp->::aaa::GG2131113::~GG2131113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131113E(Test__ZN3aaa9GG2131113E, "_ZN3aaa9GG2131113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131113C1Ev();
extern void _ZN3aaa9GG2131113D1Ev();
Name_Map name_map__ZN3aaa9GG2131113E[] = {
  NSPAIR(_ZN3aaa9GG2131113C1Ev),
  NSPAIR(_ZN3aaa9GG2131113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2131113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131113E[];
extern void _ZN3aaa9GG21311133barEv();
extern void _ZN3aaa9GG21311133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21311133fooEv,_ZThn8_N3aaa9GG21311133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21311133fooEv,_ZThn20_N3aaa9GG21311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21311133fooEv,_ZThn28_N3aaa9GG21311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21311133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21311133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21311133fooEv,_ZThn8_N3aaa9GG21311133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311133fooEv,_ZThn20_N3aaa9GG21311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21311133fooEv,_ZThn28_N3aaa9GG21311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131113E[];
Class_Descriptor cd__ZN3aaa9GG2131113E = {  "_ZN3aaa9GG2131113E", // class name
  bases__ZN3aaa9GG2131113E, 6,
  &(vtc__ZN3aaa9GG2131113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131121  : ::aaa::EE213 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21311213fooEv
  ~GG2131121(); // tgen
  GG2131121(); // tgen
};
//SIG(1 _ZN3aaa9GG2131121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21311213fooEv");}
aaa::GG2131121 ::~GG2131121(){ note_dtor("_ZN3aaa9GG2131121E", this);} // tgen
aaa::GG2131121 ::GG2131121(){ note_ctor("_ZN3aaa9GG2131121E", this);} // tgen
}
static void Test__ZN3aaa9GG2131121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131121E, buf);
    ::aaa::GG2131121 *dp, &lv = *(dp=new (buf) ::aaa::GG2131121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131121E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2131121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2131121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2131121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131121E);
    dp->::aaa::GG2131121::~GG2131121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131121E(Test__ZN3aaa9GG2131121E, "_ZN3aaa9GG2131121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131121C1Ev();
extern void _ZN3aaa9GG2131121D1Ev();
Name_Map name_map__ZN3aaa9GG2131121E[] = {
  NSPAIR(_ZN3aaa9GG2131121C1Ev),
  NSPAIR(_ZN3aaa9GG2131121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2131121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131121E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21311213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21311213fooEv,_ZThn8_N3aaa9GG21311213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21311213fooEv,_ZThn20_N3aaa9GG21311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21311213fooEv,_ZThn28_N3aaa9GG21311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21311213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21311213fooEv,_ZThn8_N3aaa9GG21311213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311213fooEv,_ZThn20_N3aaa9GG21311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21311213fooEv,_ZThn28_N3aaa9GG21311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131121E[];
Class_Descriptor cd__ZN3aaa9GG2131121E = {  "_ZN3aaa9GG2131121E", // class name
  bases__ZN3aaa9GG2131121E, 6,
  &(vtc__ZN3aaa9GG2131121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131122  : ::aaa::EE213 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21311223barEv
  ~GG2131122(); // tgen
  GG2131122(); // tgen
};
//SIG(1 _ZN3aaa9GG2131122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21311223barEv");}
aaa::GG2131122 ::~GG2131122(){ note_dtor("_ZN3aaa9GG2131122E", this);} // tgen
aaa::GG2131122 ::GG2131122(){ note_ctor("_ZN3aaa9GG2131122E", this);} // tgen
}
static void Test__ZN3aaa9GG2131122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131122E, buf);
    ::aaa::GG2131122 *dp, &lv = *(dp=new (buf) ::aaa::GG2131122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131122E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2131122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2131122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2131122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131122E);
    dp->::aaa::GG2131122::~GG2131122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131122E(Test__ZN3aaa9GG2131122E, "_ZN3aaa9GG2131122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131122C1Ev();
extern void _ZN3aaa9GG2131122D1Ev();
Name_Map name_map__ZN3aaa9GG2131122E[] = {
  NSPAIR(_ZN3aaa9GG2131122C1Ev),
  NSPAIR(_ZN3aaa9GG2131122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2131122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131122E[];
extern void _ZN3aaa9GG21311223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21311223barEv,_ZThn20_N3aaa9GG21311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21311223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311223barEv,_ZThn20_N3aaa9GG21311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131122E[];
Class_Descriptor cd__ZN3aaa9GG2131122E = {  "_ZN3aaa9GG2131122E", // class name
  bases__ZN3aaa9GG2131122E, 6,
  &(vtc__ZN3aaa9GG2131122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131123  : ::aaa::EE213 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21311233fooEv
  virtual void  bar(); // _ZN3aaa9GG21311233barEv
  ~GG2131123(); // tgen
  GG2131123(); // tgen
};
//SIG(1 _ZN3aaa9GG2131123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21311233fooEv");}
void  aaa::GG2131123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21311233barEv");}
aaa::GG2131123 ::~GG2131123(){ note_dtor("_ZN3aaa9GG2131123E", this);} // tgen
aaa::GG2131123 ::GG2131123(){ note_ctor("_ZN3aaa9GG2131123E", this);} // tgen
}
static void Test__ZN3aaa9GG2131123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131123E, buf);
    ::aaa::GG2131123 *dp, &lv = *(dp=new (buf) ::aaa::GG2131123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131123E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2131123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2131123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2131123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131123E);
    dp->::aaa::GG2131123::~GG2131123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131123E(Test__ZN3aaa9GG2131123E, "_ZN3aaa9GG2131123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131123C1Ev();
extern void _ZN3aaa9GG2131123D1Ev();
Name_Map name_map__ZN3aaa9GG2131123E[] = {
  NSPAIR(_ZN3aaa9GG2131123C1Ev),
  NSPAIR(_ZN3aaa9GG2131123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2131123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131123E[];
extern void _ZN3aaa9GG21311233barEv();
extern void _ZN3aaa9GG21311233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21311233fooEv,_ZThn8_N3aaa9GG21311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21311233fooEv,_ZThn20_N3aaa9GG21311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21311233barEv,_ZThn20_N3aaa9GG21311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21311233fooEv,_ZThn28_N3aaa9GG21311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21311233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21311233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21311233fooEv,_ZThn8_N3aaa9GG21311233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311233fooEv,_ZThn20_N3aaa9GG21311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311233barEv,_ZThn20_N3aaa9GG21311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21311233fooEv,_ZThn28_N3aaa9GG21311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131123E[];
Class_Descriptor cd__ZN3aaa9GG2131123E = {  "_ZN3aaa9GG2131123E", // class name
  bases__ZN3aaa9GG2131123E, 6,
  &(vtc__ZN3aaa9GG2131123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131131  : ::aaa::EE213 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21311313fooEv
  ~GG2131131(); // tgen
  GG2131131(); // tgen
};
//SIG(1 _ZN3aaa9GG2131131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21311313fooEv");}
aaa::GG2131131 ::~GG2131131(){ note_dtor("_ZN3aaa9GG2131131E", this);} // tgen
aaa::GG2131131 ::GG2131131(){ note_ctor("_ZN3aaa9GG2131131E", this);} // tgen
}
static void Test__ZN3aaa9GG2131131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131131E, buf);
    ::aaa::GG2131131 *dp, &lv = *(dp=new (buf) ::aaa::GG2131131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131131E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2131131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2131131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2131131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131131E);
    dp->::aaa::GG2131131::~GG2131131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131131E(Test__ZN3aaa9GG2131131E, "_ZN3aaa9GG2131131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131131C1Ev();
extern void _ZN3aaa9GG2131131D1Ev();
Name_Map name_map__ZN3aaa9GG2131131E[] = {
  NSPAIR(_ZN3aaa9GG2131131C1Ev),
  NSPAIR(_ZN3aaa9GG2131131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2131131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131131E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21311313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21311313fooEv,_ZThn8_N3aaa9GG21311313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21311313fooEv,_ZThn20_N3aaa9GG21311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21311313fooEv,_ZThn28_N3aaa9GG21311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21311313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21311313fooEv,_ZThn8_N3aaa9GG21311313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311313fooEv,_ZThn20_N3aaa9GG21311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21311313fooEv,_ZThn28_N3aaa9GG21311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131131E[];
Class_Descriptor cd__ZN3aaa9GG2131131E = {  "_ZN3aaa9GG2131131E", // class name
  bases__ZN3aaa9GG2131131E, 6,
  &(vtc__ZN3aaa9GG2131131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131132  : ::aaa::EE213 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21311323barEv
  ~GG2131132(); // tgen
  GG2131132(); // tgen
};
//SIG(1 _ZN3aaa9GG2131132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21311323barEv");}
aaa::GG2131132 ::~GG2131132(){ note_dtor("_ZN3aaa9GG2131132E", this);} // tgen
aaa::GG2131132 ::GG2131132(){ note_ctor("_ZN3aaa9GG2131132E", this);} // tgen
}
static void Test__ZN3aaa9GG2131132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131132E, buf);
    ::aaa::GG2131132 *dp, &lv = *(dp=new (buf) ::aaa::GG2131132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131132E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2131132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2131132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2131132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131132E);
    dp->::aaa::GG2131132::~GG2131132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131132E(Test__ZN3aaa9GG2131132E, "_ZN3aaa9GG2131132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131132C1Ev();
extern void _ZN3aaa9GG2131132D1Ev();
Name_Map name_map__ZN3aaa9GG2131132E[] = {
  NSPAIR(_ZN3aaa9GG2131132C1Ev),
  NSPAIR(_ZN3aaa9GG2131132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2131132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131132E[];
extern void _ZN3aaa9GG21311323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21311323barEv,_ZThn20_N3aaa9GG21311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21311323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311323barEv,_ZThn20_N3aaa9GG21311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131132E[];
Class_Descriptor cd__ZN3aaa9GG2131132E = {  "_ZN3aaa9GG2131132E", // class name
  bases__ZN3aaa9GG2131132E, 6,
  &(vtc__ZN3aaa9GG2131132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131133  : ::aaa::EE213 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21311333fooEv
  virtual void  bar(); // _ZN3aaa9GG21311333barEv
  ~GG2131133(); // tgen
  GG2131133(); // tgen
};
//SIG(1 _ZN3aaa9GG2131133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21311333fooEv");}
void  aaa::GG2131133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21311333barEv");}
aaa::GG2131133 ::~GG2131133(){ note_dtor("_ZN3aaa9GG2131133E", this);} // tgen
aaa::GG2131133 ::GG2131133(){ note_ctor("_ZN3aaa9GG2131133E", this);} // tgen
}
static void Test__ZN3aaa9GG2131133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131133E, buf);
    ::aaa::GG2131133 *dp, &lv = *(dp=new (buf) ::aaa::GG2131133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131133E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2131133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2131133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2131133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131133E);
    dp->::aaa::GG2131133::~GG2131133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131133E(Test__ZN3aaa9GG2131133E, "_ZN3aaa9GG2131133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131133C1Ev();
extern void _ZN3aaa9GG2131133D1Ev();
Name_Map name_map__ZN3aaa9GG2131133E[] = {
  NSPAIR(_ZN3aaa9GG2131133C1Ev),
  NSPAIR(_ZN3aaa9GG2131133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2131133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131133E[];
extern void _ZN3aaa9GG21311333barEv();
extern void _ZN3aaa9GG21311333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21311333fooEv,_ZThn8_N3aaa9GG21311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21311333fooEv,_ZThn20_N3aaa9GG21311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21311333barEv,_ZThn20_N3aaa9GG21311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21311333fooEv,_ZThn28_N3aaa9GG21311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21311333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21311333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21311333fooEv,_ZThn8_N3aaa9GG21311333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311333fooEv,_ZThn20_N3aaa9GG21311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21311333barEv,_ZThn20_N3aaa9GG21311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21311333fooEv,_ZThn28_N3aaa9GG21311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131133E[];
Class_Descriptor cd__ZN3aaa9GG2131133E = {  "_ZN3aaa9GG2131133E", // class name
  bases__ZN3aaa9GG2131133E, 6,
  &(vtc__ZN3aaa9GG2131133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131211  : ::aaa::EE213 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21312113fooEv
  ~GG2131211(); // tgen
  GG2131211(); // tgen
};
//SIG(1 _ZN3aaa9GG2131211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21312113fooEv");}
aaa::GG2131211 ::~GG2131211(){ note_dtor("_ZN3aaa9GG2131211E", this);} // tgen
aaa::GG2131211 ::GG2131211(){ note_ctor("_ZN3aaa9GG2131211E", this);} // tgen
}
static void Test__ZN3aaa9GG2131211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131211E, buf);
    ::aaa::GG2131211 *dp, &lv = *(dp=new (buf) ::aaa::GG2131211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131211E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2131211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2131211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2131211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131211E);
    dp->::aaa::GG2131211::~GG2131211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131211E(Test__ZN3aaa9GG2131211E, "_ZN3aaa9GG2131211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131211C1Ev();
extern void _ZN3aaa9GG2131211D1Ev();
Name_Map name_map__ZN3aaa9GG2131211E[] = {
  NSPAIR(_ZN3aaa9GG2131211C1Ev),
  NSPAIR(_ZN3aaa9GG2131211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2131211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131211E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21312113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21312113fooEv,_ZThn8_N3aaa9GG21312113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21312113fooEv,_ZThn20_N3aaa9GG21312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21312113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21312113fooEv,_ZThn8_N3aaa9GG21312113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312113fooEv,_ZThn20_N3aaa9GG21312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131211E[];
Class_Descriptor cd__ZN3aaa9GG2131211E = {  "_ZN3aaa9GG2131211E", // class name
  bases__ZN3aaa9GG2131211E, 6,
  &(vtc__ZN3aaa9GG2131211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131212  : ::aaa::EE213 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21312123barEv
  ~GG2131212(); // tgen
  GG2131212(); // tgen
};
//SIG(1 _ZN3aaa9GG2131212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21312123barEv");}
aaa::GG2131212 ::~GG2131212(){ note_dtor("_ZN3aaa9GG2131212E", this);} // tgen
aaa::GG2131212 ::GG2131212(){ note_ctor("_ZN3aaa9GG2131212E", this);} // tgen
}
static void Test__ZN3aaa9GG2131212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131212E, buf);
    ::aaa::GG2131212 *dp, &lv = *(dp=new (buf) ::aaa::GG2131212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131212E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2131212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2131212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2131212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131212E);
    dp->::aaa::GG2131212::~GG2131212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131212E(Test__ZN3aaa9GG2131212E, "_ZN3aaa9GG2131212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131212C1Ev();
extern void _ZN3aaa9GG2131212D1Ev();
Name_Map name_map__ZN3aaa9GG2131212E[] = {
  NSPAIR(_ZN3aaa9GG2131212C1Ev),
  NSPAIR(_ZN3aaa9GG2131212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2131212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131212E[];
extern void _ZN3aaa9GG21312123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21312123barEv,_ZThn28_N3aaa9GG21312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21312123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21312123barEv,_ZThn28_N3aaa9GG21312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131212E[];
Class_Descriptor cd__ZN3aaa9GG2131212E = {  "_ZN3aaa9GG2131212E", // class name
  bases__ZN3aaa9GG2131212E, 6,
  &(vtc__ZN3aaa9GG2131212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131213  : ::aaa::EE213 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21312133fooEv
  virtual void  bar(); // _ZN3aaa9GG21312133barEv
  ~GG2131213(); // tgen
  GG2131213(); // tgen
};
//SIG(1 _ZN3aaa9GG2131213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21312133fooEv");}
void  aaa::GG2131213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21312133barEv");}
aaa::GG2131213 ::~GG2131213(){ note_dtor("_ZN3aaa9GG2131213E", this);} // tgen
aaa::GG2131213 ::GG2131213(){ note_ctor("_ZN3aaa9GG2131213E", this);} // tgen
}
static void Test__ZN3aaa9GG2131213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131213E, buf);
    ::aaa::GG2131213 *dp, &lv = *(dp=new (buf) ::aaa::GG2131213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131213E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2131213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2131213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2131213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131213E);
    dp->::aaa::GG2131213::~GG2131213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131213E(Test__ZN3aaa9GG2131213E, "_ZN3aaa9GG2131213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131213C1Ev();
extern void _ZN3aaa9GG2131213D1Ev();
Name_Map name_map__ZN3aaa9GG2131213E[] = {
  NSPAIR(_ZN3aaa9GG2131213C1Ev),
  NSPAIR(_ZN3aaa9GG2131213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2131213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131213E[];
extern void _ZN3aaa9GG21312133barEv();
extern void _ZN3aaa9GG21312133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21312133fooEv,_ZThn8_N3aaa9GG21312133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21312133fooEv,_ZThn20_N3aaa9GG21312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21312133barEv,_ZThn28_N3aaa9GG21312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21312133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21312133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21312133fooEv,_ZThn8_N3aaa9GG21312133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312133fooEv,_ZThn20_N3aaa9GG21312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21312133barEv,_ZThn28_N3aaa9GG21312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131213E[];
Class_Descriptor cd__ZN3aaa9GG2131213E = {  "_ZN3aaa9GG2131213E", // class name
  bases__ZN3aaa9GG2131213E, 6,
  &(vtc__ZN3aaa9GG2131213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131221  : ::aaa::EE213 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21312213fooEv
  ~GG2131221(); // tgen
  GG2131221(); // tgen
};
//SIG(1 _ZN3aaa9GG2131221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21312213fooEv");}
aaa::GG2131221 ::~GG2131221(){ note_dtor("_ZN3aaa9GG2131221E", this);} // tgen
aaa::GG2131221 ::GG2131221(){ note_ctor("_ZN3aaa9GG2131221E", this);} // tgen
}
static void Test__ZN3aaa9GG2131221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131221E, buf);
    ::aaa::GG2131221 *dp, &lv = *(dp=new (buf) ::aaa::GG2131221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131221E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2131221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2131221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2131221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131221E);
    dp->::aaa::GG2131221::~GG2131221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131221E(Test__ZN3aaa9GG2131221E, "_ZN3aaa9GG2131221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131221C1Ev();
extern void _ZN3aaa9GG2131221D1Ev();
Name_Map name_map__ZN3aaa9GG2131221E[] = {
  NSPAIR(_ZN3aaa9GG2131221C1Ev),
  NSPAIR(_ZN3aaa9GG2131221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2131221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131221E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21312213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21312213fooEv,_ZThn8_N3aaa9GG21312213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21312213fooEv,_ZThn20_N3aaa9GG21312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21312213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21312213fooEv,_ZThn8_N3aaa9GG21312213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312213fooEv,_ZThn20_N3aaa9GG21312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131221E[];
Class_Descriptor cd__ZN3aaa9GG2131221E = {  "_ZN3aaa9GG2131221E", // class name
  bases__ZN3aaa9GG2131221E, 6,
  &(vtc__ZN3aaa9GG2131221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131222  : ::aaa::EE213 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21312223barEv
  ~GG2131222(); // tgen
  GG2131222(); // tgen
};
//SIG(1 _ZN3aaa9GG2131222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21312223barEv");}
aaa::GG2131222 ::~GG2131222(){ note_dtor("_ZN3aaa9GG2131222E", this);} // tgen
aaa::GG2131222 ::GG2131222(){ note_ctor("_ZN3aaa9GG2131222E", this);} // tgen
}
static void Test__ZN3aaa9GG2131222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131222E, buf);
    ::aaa::GG2131222 *dp, &lv = *(dp=new (buf) ::aaa::GG2131222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131222E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2131222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2131222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2131222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131222E);
    dp->::aaa::GG2131222::~GG2131222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131222E(Test__ZN3aaa9GG2131222E, "_ZN3aaa9GG2131222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131222C1Ev();
extern void _ZN3aaa9GG2131222D1Ev();
Name_Map name_map__ZN3aaa9GG2131222E[] = {
  NSPAIR(_ZN3aaa9GG2131222C1Ev),
  NSPAIR(_ZN3aaa9GG2131222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2131222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131222E[];
extern void _ZN3aaa9GG21312223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21312223barEv,_ZThn20_N3aaa9GG21312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21312223barEv,_ZThn28_N3aaa9GG21312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21312223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312223barEv,_ZThn20_N3aaa9GG21312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21312223barEv,_ZThn28_N3aaa9GG21312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131222E[];
Class_Descriptor cd__ZN3aaa9GG2131222E = {  "_ZN3aaa9GG2131222E", // class name
  bases__ZN3aaa9GG2131222E, 6,
  &(vtc__ZN3aaa9GG2131222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131223  : ::aaa::EE213 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21312233fooEv
  virtual void  bar(); // _ZN3aaa9GG21312233barEv
  ~GG2131223(); // tgen
  GG2131223(); // tgen
};
//SIG(1 _ZN3aaa9GG2131223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21312233fooEv");}
void  aaa::GG2131223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21312233barEv");}
aaa::GG2131223 ::~GG2131223(){ note_dtor("_ZN3aaa9GG2131223E", this);} // tgen
aaa::GG2131223 ::GG2131223(){ note_ctor("_ZN3aaa9GG2131223E", this);} // tgen
}
static void Test__ZN3aaa9GG2131223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131223E, buf);
    ::aaa::GG2131223 *dp, &lv = *(dp=new (buf) ::aaa::GG2131223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131223E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2131223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2131223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2131223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131223E);
    dp->::aaa::GG2131223::~GG2131223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131223E(Test__ZN3aaa9GG2131223E, "_ZN3aaa9GG2131223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131223C1Ev();
extern void _ZN3aaa9GG2131223D1Ev();
Name_Map name_map__ZN3aaa9GG2131223E[] = {
  NSPAIR(_ZN3aaa9GG2131223C1Ev),
  NSPAIR(_ZN3aaa9GG2131223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2131223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131223E[];
extern void _ZN3aaa9GG21312233barEv();
extern void _ZN3aaa9GG21312233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21312233fooEv,_ZThn8_N3aaa9GG21312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21312233fooEv,_ZThn20_N3aaa9GG21312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21312233barEv,_ZThn20_N3aaa9GG21312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21312233barEv,_ZThn28_N3aaa9GG21312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21312233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21312233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21312233fooEv,_ZThn8_N3aaa9GG21312233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312233fooEv,_ZThn20_N3aaa9GG21312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312233barEv,_ZThn20_N3aaa9GG21312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21312233barEv,_ZThn28_N3aaa9GG21312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131223E[];
Class_Descriptor cd__ZN3aaa9GG2131223E = {  "_ZN3aaa9GG2131223E", // class name
  bases__ZN3aaa9GG2131223E, 6,
  &(vtc__ZN3aaa9GG2131223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131231  : ::aaa::EE213 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21312313fooEv
  ~GG2131231(); // tgen
  GG2131231(); // tgen
};
//SIG(1 _ZN3aaa9GG2131231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21312313fooEv");}
aaa::GG2131231 ::~GG2131231(){ note_dtor("_ZN3aaa9GG2131231E", this);} // tgen
aaa::GG2131231 ::GG2131231(){ note_ctor("_ZN3aaa9GG2131231E", this);} // tgen
}
static void Test__ZN3aaa9GG2131231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131231E, buf);
    ::aaa::GG2131231 *dp, &lv = *(dp=new (buf) ::aaa::GG2131231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131231E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2131231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2131231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2131231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131231E);
    dp->::aaa::GG2131231::~GG2131231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131231E(Test__ZN3aaa9GG2131231E, "_ZN3aaa9GG2131231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131231C1Ev();
extern void _ZN3aaa9GG2131231D1Ev();
Name_Map name_map__ZN3aaa9GG2131231E[] = {
  NSPAIR(_ZN3aaa9GG2131231C1Ev),
  NSPAIR(_ZN3aaa9GG2131231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2131231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131231E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21312313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21312313fooEv,_ZThn8_N3aaa9GG21312313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21312313fooEv,_ZThn20_N3aaa9GG21312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21312313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21312313fooEv,_ZThn8_N3aaa9GG21312313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312313fooEv,_ZThn20_N3aaa9GG21312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131231E[];
Class_Descriptor cd__ZN3aaa9GG2131231E = {  "_ZN3aaa9GG2131231E", // class name
  bases__ZN3aaa9GG2131231E, 6,
  &(vtc__ZN3aaa9GG2131231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131232  : ::aaa::EE213 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21312323barEv
  ~GG2131232(); // tgen
  GG2131232(); // tgen
};
//SIG(1 _ZN3aaa9GG2131232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21312323barEv");}
aaa::GG2131232 ::~GG2131232(){ note_dtor("_ZN3aaa9GG2131232E", this);} // tgen
aaa::GG2131232 ::GG2131232(){ note_ctor("_ZN3aaa9GG2131232E", this);} // tgen
}
static void Test__ZN3aaa9GG2131232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131232E, buf);
    ::aaa::GG2131232 *dp, &lv = *(dp=new (buf) ::aaa::GG2131232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131232E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2131232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2131232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2131232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131232E);
    dp->::aaa::GG2131232::~GG2131232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131232E(Test__ZN3aaa9GG2131232E, "_ZN3aaa9GG2131232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131232C1Ev();
extern void _ZN3aaa9GG2131232D1Ev();
Name_Map name_map__ZN3aaa9GG2131232E[] = {
  NSPAIR(_ZN3aaa9GG2131232C1Ev),
  NSPAIR(_ZN3aaa9GG2131232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2131232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131232E[];
extern void _ZN3aaa9GG21312323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21312323barEv,_ZThn20_N3aaa9GG21312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21312323barEv,_ZThn28_N3aaa9GG21312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21312323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312323barEv,_ZThn20_N3aaa9GG21312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21312323barEv,_ZThn28_N3aaa9GG21312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131232E[];
Class_Descriptor cd__ZN3aaa9GG2131232E = {  "_ZN3aaa9GG2131232E", // class name
  bases__ZN3aaa9GG2131232E, 6,
  &(vtc__ZN3aaa9GG2131232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131233  : ::aaa::EE213 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21312333fooEv
  virtual void  bar(); // _ZN3aaa9GG21312333barEv
  ~GG2131233(); // tgen
  GG2131233(); // tgen
};
//SIG(1 _ZN3aaa9GG2131233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21312333fooEv");}
void  aaa::GG2131233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21312333barEv");}
aaa::GG2131233 ::~GG2131233(){ note_dtor("_ZN3aaa9GG2131233E", this);} // tgen
aaa::GG2131233 ::GG2131233(){ note_ctor("_ZN3aaa9GG2131233E", this);} // tgen
}
static void Test__ZN3aaa9GG2131233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131233E, buf);
    ::aaa::GG2131233 *dp, &lv = *(dp=new (buf) ::aaa::GG2131233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131233E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2131233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2131233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2131233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131233E);
    dp->::aaa::GG2131233::~GG2131233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131233E(Test__ZN3aaa9GG2131233E, "_ZN3aaa9GG2131233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131233C1Ev();
extern void _ZN3aaa9GG2131233D1Ev();
Name_Map name_map__ZN3aaa9GG2131233E[] = {
  NSPAIR(_ZN3aaa9GG2131233C1Ev),
  NSPAIR(_ZN3aaa9GG2131233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2131233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131233E[];
extern void _ZN3aaa9GG21312333barEv();
extern void _ZN3aaa9GG21312333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21312333fooEv,_ZThn8_N3aaa9GG21312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21312333fooEv,_ZThn20_N3aaa9GG21312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21312333barEv,_ZThn20_N3aaa9GG21312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21312333barEv,_ZThn28_N3aaa9GG21312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21312333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21312333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21312333fooEv,_ZThn8_N3aaa9GG21312333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312333fooEv,_ZThn20_N3aaa9GG21312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21312333barEv,_ZThn20_N3aaa9GG21312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21312333barEv,_ZThn28_N3aaa9GG21312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131233E[];
Class_Descriptor cd__ZN3aaa9GG2131233E = {  "_ZN3aaa9GG2131233E", // class name
  bases__ZN3aaa9GG2131233E, 6,
  &(vtc__ZN3aaa9GG2131233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131311  : ::aaa::EE213 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21313113fooEv
  ~GG2131311(); // tgen
  GG2131311(); // tgen
};
//SIG(1 _ZN3aaa9GG2131311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21313113fooEv");}
aaa::GG2131311 ::~GG2131311(){ note_dtor("_ZN3aaa9GG2131311E", this);} // tgen
aaa::GG2131311 ::GG2131311(){ note_ctor("_ZN3aaa9GG2131311E", this);} // tgen
}
static void Test__ZN3aaa9GG2131311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131311E, buf);
    ::aaa::GG2131311 *dp, &lv = *(dp=new (buf) ::aaa::GG2131311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131311E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2131311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2131311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2131311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131311E);
    dp->::aaa::GG2131311::~GG2131311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131311E(Test__ZN3aaa9GG2131311E, "_ZN3aaa9GG2131311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131311C1Ev();
extern void _ZN3aaa9GG2131311D1Ev();
Name_Map name_map__ZN3aaa9GG2131311E[] = {
  NSPAIR(_ZN3aaa9GG2131311C1Ev),
  NSPAIR(_ZN3aaa9GG2131311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2131311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131311E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21313113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21313113fooEv,_ZThn8_N3aaa9GG21313113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21313113fooEv,_ZThn20_N3aaa9GG21313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313113fooEv,_ZThn28_N3aaa9GG21313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21313113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21313113fooEv,_ZThn8_N3aaa9GG21313113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313113fooEv,_ZThn20_N3aaa9GG21313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313113fooEv,_ZThn28_N3aaa9GG21313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131311E[];
Class_Descriptor cd__ZN3aaa9GG2131311E = {  "_ZN3aaa9GG2131311E", // class name
  bases__ZN3aaa9GG2131311E, 6,
  &(vtc__ZN3aaa9GG2131311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131312  : ::aaa::EE213 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21313123barEv
  ~GG2131312(); // tgen
  GG2131312(); // tgen
};
//SIG(1 _ZN3aaa9GG2131312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21313123barEv");}
aaa::GG2131312 ::~GG2131312(){ note_dtor("_ZN3aaa9GG2131312E", this);} // tgen
aaa::GG2131312 ::GG2131312(){ note_ctor("_ZN3aaa9GG2131312E", this);} // tgen
}
static void Test__ZN3aaa9GG2131312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131312E, buf);
    ::aaa::GG2131312 *dp, &lv = *(dp=new (buf) ::aaa::GG2131312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131312E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2131312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2131312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2131312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131312E);
    dp->::aaa::GG2131312::~GG2131312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131312E(Test__ZN3aaa9GG2131312E, "_ZN3aaa9GG2131312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131312C1Ev();
extern void _ZN3aaa9GG2131312D1Ev();
Name_Map name_map__ZN3aaa9GG2131312E[] = {
  NSPAIR(_ZN3aaa9GG2131312C1Ev),
  NSPAIR(_ZN3aaa9GG2131312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2131312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131312E[];
extern void _ZN3aaa9GG21313123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313123barEv,_ZThn28_N3aaa9GG21313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21313123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313123barEv,_ZThn28_N3aaa9GG21313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131312E[];
Class_Descriptor cd__ZN3aaa9GG2131312E = {  "_ZN3aaa9GG2131312E", // class name
  bases__ZN3aaa9GG2131312E, 6,
  &(vtc__ZN3aaa9GG2131312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131313  : ::aaa::EE213 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21313133fooEv
  virtual void  bar(); // _ZN3aaa9GG21313133barEv
  ~GG2131313(); // tgen
  GG2131313(); // tgen
};
//SIG(1 _ZN3aaa9GG2131313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21313133fooEv");}
void  aaa::GG2131313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21313133barEv");}
aaa::GG2131313 ::~GG2131313(){ note_dtor("_ZN3aaa9GG2131313E", this);} // tgen
aaa::GG2131313 ::GG2131313(){ note_ctor("_ZN3aaa9GG2131313E", this);} // tgen
}
static void Test__ZN3aaa9GG2131313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131313E, buf);
    ::aaa::GG2131313 *dp, &lv = *(dp=new (buf) ::aaa::GG2131313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131313E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2131313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2131313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2131313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131313E);
    dp->::aaa::GG2131313::~GG2131313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131313E(Test__ZN3aaa9GG2131313E, "_ZN3aaa9GG2131313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131313C1Ev();
extern void _ZN3aaa9GG2131313D1Ev();
Name_Map name_map__ZN3aaa9GG2131313E[] = {
  NSPAIR(_ZN3aaa9GG2131313C1Ev),
  NSPAIR(_ZN3aaa9GG2131313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2131313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131313E[];
extern void _ZN3aaa9GG21313133barEv();
extern void _ZN3aaa9GG21313133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21313133fooEv,_ZThn8_N3aaa9GG21313133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21313133fooEv,_ZThn20_N3aaa9GG21313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313133fooEv,_ZThn28_N3aaa9GG21313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313133barEv,_ZThn28_N3aaa9GG21313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21313133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21313133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21313133fooEv,_ZThn8_N3aaa9GG21313133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313133fooEv,_ZThn20_N3aaa9GG21313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313133fooEv,_ZThn28_N3aaa9GG21313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313133barEv,_ZThn28_N3aaa9GG21313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131313E[];
Class_Descriptor cd__ZN3aaa9GG2131313E = {  "_ZN3aaa9GG2131313E", // class name
  bases__ZN3aaa9GG2131313E, 6,
  &(vtc__ZN3aaa9GG2131313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131321  : ::aaa::EE213 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21313213fooEv
  ~GG2131321(); // tgen
  GG2131321(); // tgen
};
//SIG(1 _ZN3aaa9GG2131321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21313213fooEv");}
aaa::GG2131321 ::~GG2131321(){ note_dtor("_ZN3aaa9GG2131321E", this);} // tgen
aaa::GG2131321 ::GG2131321(){ note_ctor("_ZN3aaa9GG2131321E", this);} // tgen
}
static void Test__ZN3aaa9GG2131321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131321E, buf);
    ::aaa::GG2131321 *dp, &lv = *(dp=new (buf) ::aaa::GG2131321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131321E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2131321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2131321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2131321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131321E);
    dp->::aaa::GG2131321::~GG2131321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131321E(Test__ZN3aaa9GG2131321E, "_ZN3aaa9GG2131321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131321C1Ev();
extern void _ZN3aaa9GG2131321D1Ev();
Name_Map name_map__ZN3aaa9GG2131321E[] = {
  NSPAIR(_ZN3aaa9GG2131321C1Ev),
  NSPAIR(_ZN3aaa9GG2131321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2131321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131321E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21313213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21313213fooEv,_ZThn8_N3aaa9GG21313213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21313213fooEv,_ZThn20_N3aaa9GG21313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21313213fooEv,_ZThn28_N3aaa9GG21313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21313213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21313213fooEv,_ZThn8_N3aaa9GG21313213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313213fooEv,_ZThn20_N3aaa9GG21313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313213fooEv,_ZThn28_N3aaa9GG21313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131321E[];
Class_Descriptor cd__ZN3aaa9GG2131321E = {  "_ZN3aaa9GG2131321E", // class name
  bases__ZN3aaa9GG2131321E, 6,
  &(vtc__ZN3aaa9GG2131321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131322  : ::aaa::EE213 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21313223barEv
  ~GG2131322(); // tgen
  GG2131322(); // tgen
};
//SIG(1 _ZN3aaa9GG2131322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21313223barEv");}
aaa::GG2131322 ::~GG2131322(){ note_dtor("_ZN3aaa9GG2131322E", this);} // tgen
aaa::GG2131322 ::GG2131322(){ note_ctor("_ZN3aaa9GG2131322E", this);} // tgen
}
static void Test__ZN3aaa9GG2131322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131322E, buf);
    ::aaa::GG2131322 *dp, &lv = *(dp=new (buf) ::aaa::GG2131322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131322E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2131322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2131322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2131322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131322E);
    dp->::aaa::GG2131322::~GG2131322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131322E(Test__ZN3aaa9GG2131322E, "_ZN3aaa9GG2131322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131322C1Ev();
extern void _ZN3aaa9GG2131322D1Ev();
Name_Map name_map__ZN3aaa9GG2131322E[] = {
  NSPAIR(_ZN3aaa9GG2131322C1Ev),
  NSPAIR(_ZN3aaa9GG2131322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2131322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131322E[];
extern void _ZN3aaa9GG21313223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21313223barEv,_ZThn20_N3aaa9GG21313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21313223barEv,_ZThn28_N3aaa9GG21313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21313223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313223barEv,_ZThn20_N3aaa9GG21313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313223barEv,_ZThn28_N3aaa9GG21313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131322E[];
Class_Descriptor cd__ZN3aaa9GG2131322E = {  "_ZN3aaa9GG2131322E", // class name
  bases__ZN3aaa9GG2131322E, 6,
  &(vtc__ZN3aaa9GG2131322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131323  : ::aaa::EE213 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21313233fooEv
  virtual void  bar(); // _ZN3aaa9GG21313233barEv
  ~GG2131323(); // tgen
  GG2131323(); // tgen
};
//SIG(1 _ZN3aaa9GG2131323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21313233fooEv");}
void  aaa::GG2131323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21313233barEv");}
aaa::GG2131323 ::~GG2131323(){ note_dtor("_ZN3aaa9GG2131323E", this);} // tgen
aaa::GG2131323 ::GG2131323(){ note_ctor("_ZN3aaa9GG2131323E", this);} // tgen
}
static void Test__ZN3aaa9GG2131323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131323E, buf);
    ::aaa::GG2131323 *dp, &lv = *(dp=new (buf) ::aaa::GG2131323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131323E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2131323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2131323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2131323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131323E);
    dp->::aaa::GG2131323::~GG2131323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131323E(Test__ZN3aaa9GG2131323E, "_ZN3aaa9GG2131323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131323C1Ev();
extern void _ZN3aaa9GG2131323D1Ev();
Name_Map name_map__ZN3aaa9GG2131323E[] = {
  NSPAIR(_ZN3aaa9GG2131323C1Ev),
  NSPAIR(_ZN3aaa9GG2131323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2131323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131323E[];
extern void _ZN3aaa9GG21313233barEv();
extern void _ZN3aaa9GG21313233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21313233fooEv,_ZThn8_N3aaa9GG21313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21313233fooEv,_ZThn20_N3aaa9GG21313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21313233barEv,_ZThn20_N3aaa9GG21313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313233fooEv,_ZThn28_N3aaa9GG21313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313233barEv,_ZThn28_N3aaa9GG21313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21313233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21313233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21313233fooEv,_ZThn8_N3aaa9GG21313233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313233fooEv,_ZThn20_N3aaa9GG21313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313233barEv,_ZThn20_N3aaa9GG21313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313233fooEv,_ZThn28_N3aaa9GG21313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313233barEv,_ZThn28_N3aaa9GG21313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131323E[];
Class_Descriptor cd__ZN3aaa9GG2131323E = {  "_ZN3aaa9GG2131323E", // class name
  bases__ZN3aaa9GG2131323E, 6,
  &(vtc__ZN3aaa9GG2131323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131331  : ::aaa::EE213 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21313313fooEv
  ~GG2131331(); // tgen
  GG2131331(); // tgen
};
//SIG(1 _ZN3aaa9GG2131331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21313313fooEv");}
aaa::GG2131331 ::~GG2131331(){ note_dtor("_ZN3aaa9GG2131331E", this);} // tgen
aaa::GG2131331 ::GG2131331(){ note_ctor("_ZN3aaa9GG2131331E", this);} // tgen
}
static void Test__ZN3aaa9GG2131331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131331E, buf);
    ::aaa::GG2131331 *dp, &lv = *(dp=new (buf) ::aaa::GG2131331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131331E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2131331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2131331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2131331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131331E);
    dp->::aaa::GG2131331::~GG2131331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131331E(Test__ZN3aaa9GG2131331E, "_ZN3aaa9GG2131331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131331C1Ev();
extern void _ZN3aaa9GG2131331D1Ev();
Name_Map name_map__ZN3aaa9GG2131331E[] = {
  NSPAIR(_ZN3aaa9GG2131331C1Ev),
  NSPAIR(_ZN3aaa9GG2131331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2131331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131331E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21313313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21313313fooEv,_ZThn8_N3aaa9GG21313313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21313313fooEv,_ZThn20_N3aaa9GG21313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21313313fooEv,_ZThn28_N3aaa9GG21313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21313313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21313313fooEv,_ZThn8_N3aaa9GG21313313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313313fooEv,_ZThn20_N3aaa9GG21313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313313fooEv,_ZThn28_N3aaa9GG21313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131331E[];
Class_Descriptor cd__ZN3aaa9GG2131331E = {  "_ZN3aaa9GG2131331E", // class name
  bases__ZN3aaa9GG2131331E, 6,
  &(vtc__ZN3aaa9GG2131331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131332  : ::aaa::EE213 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21313323barEv
  ~GG2131332(); // tgen
  GG2131332(); // tgen
};
//SIG(1 _ZN3aaa9GG2131332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2131332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21313323barEv");}
aaa::GG2131332 ::~GG2131332(){ note_dtor("_ZN3aaa9GG2131332E", this);} // tgen
aaa::GG2131332 ::GG2131332(){ note_ctor("_ZN3aaa9GG2131332E", this);} // tgen
}
static void Test__ZN3aaa9GG2131332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131332E, buf);
    ::aaa::GG2131332 *dp, &lv = *(dp=new (buf) ::aaa::GG2131332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131332E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2131332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2131332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2131332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131332E);
    dp->::aaa::GG2131332::~GG2131332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131332E(Test__ZN3aaa9GG2131332E, "_ZN3aaa9GG2131332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131332C1Ev();
extern void _ZN3aaa9GG2131332D1Ev();
Name_Map name_map__ZN3aaa9GG2131332E[] = {
  NSPAIR(_ZN3aaa9GG2131332C1Ev),
  NSPAIR(_ZN3aaa9GG2131332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2131332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131332E[];
extern void _ZN3aaa9GG21313323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21313323barEv,_ZThn20_N3aaa9GG21313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313323barEv,_ZThn28_N3aaa9GG21313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21313323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313323barEv,_ZThn20_N3aaa9GG21313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313323barEv,_ZThn28_N3aaa9GG21313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131332E[];
Class_Descriptor cd__ZN3aaa9GG2131332E = {  "_ZN3aaa9GG2131332E", // class name
  bases__ZN3aaa9GG2131332E, 6,
  &(vtc__ZN3aaa9GG2131332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2131333  : ::aaa::EE213 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21313333fooEv
  virtual void  bar(); // _ZN3aaa9GG21313333barEv
  ~GG2131333(); // tgen
  GG2131333(); // tgen
};
//SIG(1 _ZN3aaa9GG2131333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2131333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21313333fooEv");}
void  aaa::GG2131333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21313333barEv");}
aaa::GG2131333 ::~GG2131333(){ note_dtor("_ZN3aaa9GG2131333E", this);} // tgen
aaa::GG2131333 ::GG2131333(){ note_ctor("_ZN3aaa9GG2131333E", this);} // tgen
}
static void Test__ZN3aaa9GG2131333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2131333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2131333E, buf);
    ::aaa::GG2131333 *dp, &lv = *(dp=new (buf) ::aaa::GG2131333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2131333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2131333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2131333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2131333E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2131333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2131333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2131333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2131333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2131333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2131333E);
    dp->::aaa::GG2131333::~GG2131333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2131333E(Test__ZN3aaa9GG2131333E, "_ZN3aaa9GG2131333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2131333C1Ev();
extern void _ZN3aaa9GG2131333D1Ev();
Name_Map name_map__ZN3aaa9GG2131333E[] = {
  NSPAIR(_ZN3aaa9GG2131333C1Ev),
  NSPAIR(_ZN3aaa9GG2131333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2131333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2131333E[];
extern void _ZN3aaa9GG21313333barEv();
extern void _ZN3aaa9GG21313333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21313333fooEv,_ZThn8_N3aaa9GG21313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21313333fooEv,_ZThn20_N3aaa9GG21313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21313333barEv,_ZThn20_N3aaa9GG21313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313333fooEv,_ZThn28_N3aaa9GG21313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21313333barEv,_ZThn28_N3aaa9GG21313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2131333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21313333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21313333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21313333fooEv,_ZThn8_N3aaa9GG21313333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313333fooEv,_ZThn20_N3aaa9GG21313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21313333barEv,_ZThn20_N3aaa9GG21313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313333fooEv,_ZThn28_N3aaa9GG21313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21313333barEv,_ZThn28_N3aaa9GG21313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2131333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2131333E[];
Class_Descriptor cd__ZN3aaa9GG2131333E = {  "_ZN3aaa9GG2131333E", // class name
  bases__ZN3aaa9GG2131333E, 6,
  &(vtc__ZN3aaa9GG2131333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2131333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2131333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132111  : ::aaa::EE213 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21321113fooEv
  ~GG2132111(); // tgen
  GG2132111(); // tgen
};
//SIG(1 _ZN3aaa9GG2132111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21321113fooEv");}
aaa::GG2132111 ::~GG2132111(){ note_dtor("_ZN3aaa9GG2132111E", this);} // tgen
aaa::GG2132111 ::GG2132111(){ note_ctor("_ZN3aaa9GG2132111E", this);} // tgen
}
static void Test__ZN3aaa9GG2132111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132111E, buf);
    ::aaa::GG2132111 *dp, &lv = *(dp=new (buf) ::aaa::GG2132111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132111E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2132111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2132111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2132111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132111E);
    dp->::aaa::GG2132111::~GG2132111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132111E(Test__ZN3aaa9GG2132111E, "_ZN3aaa9GG2132111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132111C1Ev();
extern void _ZN3aaa9GG2132111D1Ev();
Name_Map name_map__ZN3aaa9GG2132111E[] = {
  NSPAIR(_ZN3aaa9GG2132111C1Ev),
  NSPAIR(_ZN3aaa9GG2132111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2132111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132111E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21321113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21321113fooEv,_ZThn8_N3aaa9GG21321113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21321113fooEv,_ZThn20_N3aaa9GG21321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21321113fooEv,_ZThn28_N3aaa9GG21321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21321113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21321113fooEv,_ZThn8_N3aaa9GG21321113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321113fooEv,_ZThn20_N3aaa9GG21321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21321113fooEv,_ZThn28_N3aaa9GG21321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132111E[];
Class_Descriptor cd__ZN3aaa9GG2132111E = {  "_ZN3aaa9GG2132111E", // class name
  bases__ZN3aaa9GG2132111E, 6,
  &(vtc__ZN3aaa9GG2132111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132112  : ::aaa::EE213 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21321123barEv
  ~GG2132112(); // tgen
  GG2132112(); // tgen
};
//SIG(1 _ZN3aaa9GG2132112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21321123barEv");}
aaa::GG2132112 ::~GG2132112(){ note_dtor("_ZN3aaa9GG2132112E", this);} // tgen
aaa::GG2132112 ::GG2132112(){ note_ctor("_ZN3aaa9GG2132112E", this);} // tgen
}
static void Test__ZN3aaa9GG2132112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132112E, buf);
    ::aaa::GG2132112 *dp, &lv = *(dp=new (buf) ::aaa::GG2132112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132112E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2132112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2132112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2132112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132112E);
    dp->::aaa::GG2132112::~GG2132112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132112E(Test__ZN3aaa9GG2132112E, "_ZN3aaa9GG2132112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132112C1Ev();
extern void _ZN3aaa9GG2132112D1Ev();
Name_Map name_map__ZN3aaa9GG2132112E[] = {
  NSPAIR(_ZN3aaa9GG2132112C1Ev),
  NSPAIR(_ZN3aaa9GG2132112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2132112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132112E[];
extern void _ZN3aaa9GG21321123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21321123barEv,_ZThn20_N3aaa9GG21321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21321123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321123barEv,_ZThn20_N3aaa9GG21321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132112E[];
Class_Descriptor cd__ZN3aaa9GG2132112E = {  "_ZN3aaa9GG2132112E", // class name
  bases__ZN3aaa9GG2132112E, 6,
  &(vtc__ZN3aaa9GG2132112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132113  : ::aaa::EE213 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21321133fooEv
  virtual void  bar(); // _ZN3aaa9GG21321133barEv
  ~GG2132113(); // tgen
  GG2132113(); // tgen
};
//SIG(1 _ZN3aaa9GG2132113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21321133fooEv");}
void  aaa::GG2132113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21321133barEv");}
aaa::GG2132113 ::~GG2132113(){ note_dtor("_ZN3aaa9GG2132113E", this);} // tgen
aaa::GG2132113 ::GG2132113(){ note_ctor("_ZN3aaa9GG2132113E", this);} // tgen
}
static void Test__ZN3aaa9GG2132113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132113E, buf);
    ::aaa::GG2132113 *dp, &lv = *(dp=new (buf) ::aaa::GG2132113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132113E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2132113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2132113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2132113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132113E);
    dp->::aaa::GG2132113::~GG2132113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132113E(Test__ZN3aaa9GG2132113E, "_ZN3aaa9GG2132113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132113C1Ev();
extern void _ZN3aaa9GG2132113D1Ev();
Name_Map name_map__ZN3aaa9GG2132113E[] = {
  NSPAIR(_ZN3aaa9GG2132113C1Ev),
  NSPAIR(_ZN3aaa9GG2132113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2132113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132113E[];
extern void _ZN3aaa9GG21321133barEv();
extern void _ZN3aaa9GG21321133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21321133fooEv,_ZThn8_N3aaa9GG21321133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21321133barEv,_ZThn20_N3aaa9GG21321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21321133fooEv,_ZThn20_N3aaa9GG21321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21321133fooEv,_ZThn28_N3aaa9GG21321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21321133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21321133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21321133fooEv,_ZThn8_N3aaa9GG21321133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321133barEv,_ZThn20_N3aaa9GG21321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321133fooEv,_ZThn20_N3aaa9GG21321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21321133fooEv,_ZThn28_N3aaa9GG21321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132113E[];
Class_Descriptor cd__ZN3aaa9GG2132113E = {  "_ZN3aaa9GG2132113E", // class name
  bases__ZN3aaa9GG2132113E, 6,
  &(vtc__ZN3aaa9GG2132113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132121  : ::aaa::EE213 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21321213fooEv
  ~GG2132121(); // tgen
  GG2132121(); // tgen
};
//SIG(1 _ZN3aaa9GG2132121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21321213fooEv");}
aaa::GG2132121 ::~GG2132121(){ note_dtor("_ZN3aaa9GG2132121E", this);} // tgen
aaa::GG2132121 ::GG2132121(){ note_ctor("_ZN3aaa9GG2132121E", this);} // tgen
}
static void Test__ZN3aaa9GG2132121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132121E, buf);
    ::aaa::GG2132121 *dp, &lv = *(dp=new (buf) ::aaa::GG2132121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132121E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2132121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2132121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2132121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132121E);
    dp->::aaa::GG2132121::~GG2132121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132121E(Test__ZN3aaa9GG2132121E, "_ZN3aaa9GG2132121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132121C1Ev();
extern void _ZN3aaa9GG2132121D1Ev();
Name_Map name_map__ZN3aaa9GG2132121E[] = {
  NSPAIR(_ZN3aaa9GG2132121C1Ev),
  NSPAIR(_ZN3aaa9GG2132121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2132121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132121E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21321213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21321213fooEv,_ZThn8_N3aaa9GG21321213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21321213fooEv,_ZThn28_N3aaa9GG21321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21321213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21321213fooEv,_ZThn8_N3aaa9GG21321213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21321213fooEv,_ZThn28_N3aaa9GG21321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132121E[];
Class_Descriptor cd__ZN3aaa9GG2132121E = {  "_ZN3aaa9GG2132121E", // class name
  bases__ZN3aaa9GG2132121E, 6,
  &(vtc__ZN3aaa9GG2132121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132122  : ::aaa::EE213 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21321223barEv
  ~GG2132122(); // tgen
  GG2132122(); // tgen
};
//SIG(1 _ZN3aaa9GG2132122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21321223barEv");}
aaa::GG2132122 ::~GG2132122(){ note_dtor("_ZN3aaa9GG2132122E", this);} // tgen
aaa::GG2132122 ::GG2132122(){ note_ctor("_ZN3aaa9GG2132122E", this);} // tgen
}
static void Test__ZN3aaa9GG2132122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132122E, buf);
    ::aaa::GG2132122 *dp, &lv = *(dp=new (buf) ::aaa::GG2132122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132122E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2132122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2132122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2132122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132122E);
    dp->::aaa::GG2132122::~GG2132122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132122E(Test__ZN3aaa9GG2132122E, "_ZN3aaa9GG2132122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132122C1Ev();
extern void _ZN3aaa9GG2132122D1Ev();
Name_Map name_map__ZN3aaa9GG2132122E[] = {
  NSPAIR(_ZN3aaa9GG2132122C1Ev),
  NSPAIR(_ZN3aaa9GG2132122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2132122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132122E[];
extern void _ZN3aaa9GG21321223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21321223barEv,_ZThn20_N3aaa9GG21321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21321223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321223barEv,_ZThn20_N3aaa9GG21321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132122E[];
Class_Descriptor cd__ZN3aaa9GG2132122E = {  "_ZN3aaa9GG2132122E", // class name
  bases__ZN3aaa9GG2132122E, 6,
  &(vtc__ZN3aaa9GG2132122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132123  : ::aaa::EE213 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21321233fooEv
  virtual void  bar(); // _ZN3aaa9GG21321233barEv
  ~GG2132123(); // tgen
  GG2132123(); // tgen
};
//SIG(1 _ZN3aaa9GG2132123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21321233fooEv");}
void  aaa::GG2132123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21321233barEv");}
aaa::GG2132123 ::~GG2132123(){ note_dtor("_ZN3aaa9GG2132123E", this);} // tgen
aaa::GG2132123 ::GG2132123(){ note_ctor("_ZN3aaa9GG2132123E", this);} // tgen
}
static void Test__ZN3aaa9GG2132123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132123E, buf);
    ::aaa::GG2132123 *dp, &lv = *(dp=new (buf) ::aaa::GG2132123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132123E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2132123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2132123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2132123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132123E);
    dp->::aaa::GG2132123::~GG2132123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132123E(Test__ZN3aaa9GG2132123E, "_ZN3aaa9GG2132123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132123C1Ev();
extern void _ZN3aaa9GG2132123D1Ev();
Name_Map name_map__ZN3aaa9GG2132123E[] = {
  NSPAIR(_ZN3aaa9GG2132123C1Ev),
  NSPAIR(_ZN3aaa9GG2132123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2132123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132123E[];
extern void _ZN3aaa9GG21321233barEv();
extern void _ZN3aaa9GG21321233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21321233fooEv,_ZThn8_N3aaa9GG21321233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21321233barEv,_ZThn20_N3aaa9GG21321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21321233fooEv,_ZThn28_N3aaa9GG21321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21321233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21321233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21321233fooEv,_ZThn8_N3aaa9GG21321233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321233barEv,_ZThn20_N3aaa9GG21321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21321233fooEv,_ZThn28_N3aaa9GG21321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132123E[];
Class_Descriptor cd__ZN3aaa9GG2132123E = {  "_ZN3aaa9GG2132123E", // class name
  bases__ZN3aaa9GG2132123E, 6,
  &(vtc__ZN3aaa9GG2132123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132131  : ::aaa::EE213 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21321313fooEv
  ~GG2132131(); // tgen
  GG2132131(); // tgen
};
//SIG(1 _ZN3aaa9GG2132131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21321313fooEv");}
aaa::GG2132131 ::~GG2132131(){ note_dtor("_ZN3aaa9GG2132131E", this);} // tgen
aaa::GG2132131 ::GG2132131(){ note_ctor("_ZN3aaa9GG2132131E", this);} // tgen
}
static void Test__ZN3aaa9GG2132131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132131E, buf);
    ::aaa::GG2132131 *dp, &lv = *(dp=new (buf) ::aaa::GG2132131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132131E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2132131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2132131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2132131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132131E);
    dp->::aaa::GG2132131::~GG2132131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132131E(Test__ZN3aaa9GG2132131E, "_ZN3aaa9GG2132131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132131C1Ev();
extern void _ZN3aaa9GG2132131D1Ev();
Name_Map name_map__ZN3aaa9GG2132131E[] = {
  NSPAIR(_ZN3aaa9GG2132131C1Ev),
  NSPAIR(_ZN3aaa9GG2132131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2132131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132131E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21321313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21321313fooEv,_ZThn8_N3aaa9GG21321313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21321313fooEv,_ZThn20_N3aaa9GG21321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21321313fooEv,_ZThn28_N3aaa9GG21321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21321313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21321313fooEv,_ZThn8_N3aaa9GG21321313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321313fooEv,_ZThn20_N3aaa9GG21321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21321313fooEv,_ZThn28_N3aaa9GG21321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132131E[];
Class_Descriptor cd__ZN3aaa9GG2132131E = {  "_ZN3aaa9GG2132131E", // class name
  bases__ZN3aaa9GG2132131E, 6,
  &(vtc__ZN3aaa9GG2132131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132132  : ::aaa::EE213 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21321323barEv
  ~GG2132132(); // tgen
  GG2132132(); // tgen
};
//SIG(1 _ZN3aaa9GG2132132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21321323barEv");}
aaa::GG2132132 ::~GG2132132(){ note_dtor("_ZN3aaa9GG2132132E", this);} // tgen
aaa::GG2132132 ::GG2132132(){ note_ctor("_ZN3aaa9GG2132132E", this);} // tgen
}
static void Test__ZN3aaa9GG2132132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132132E, buf);
    ::aaa::GG2132132 *dp, &lv = *(dp=new (buf) ::aaa::GG2132132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132132E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2132132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2132132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2132132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132132E);
    dp->::aaa::GG2132132::~GG2132132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132132E(Test__ZN3aaa9GG2132132E, "_ZN3aaa9GG2132132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132132C1Ev();
extern void _ZN3aaa9GG2132132D1Ev();
Name_Map name_map__ZN3aaa9GG2132132E[] = {
  NSPAIR(_ZN3aaa9GG2132132C1Ev),
  NSPAIR(_ZN3aaa9GG2132132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2132132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132132E[];
extern void _ZN3aaa9GG21321323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21321323barEv,_ZThn20_N3aaa9GG21321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21321323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321323barEv,_ZThn20_N3aaa9GG21321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132132E[];
Class_Descriptor cd__ZN3aaa9GG2132132E = {  "_ZN3aaa9GG2132132E", // class name
  bases__ZN3aaa9GG2132132E, 6,
  &(vtc__ZN3aaa9GG2132132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132133  : ::aaa::EE213 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21321333fooEv
  virtual void  bar(); // _ZN3aaa9GG21321333barEv
  ~GG2132133(); // tgen
  GG2132133(); // tgen
};
//SIG(1 _ZN3aaa9GG2132133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21321333fooEv");}
void  aaa::GG2132133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21321333barEv");}
aaa::GG2132133 ::~GG2132133(){ note_dtor("_ZN3aaa9GG2132133E", this);} // tgen
aaa::GG2132133 ::GG2132133(){ note_ctor("_ZN3aaa9GG2132133E", this);} // tgen
}
static void Test__ZN3aaa9GG2132133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132133E, buf);
    ::aaa::GG2132133 *dp, &lv = *(dp=new (buf) ::aaa::GG2132133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132133E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2132133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2132133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2132133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132133E);
    dp->::aaa::GG2132133::~GG2132133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132133E(Test__ZN3aaa9GG2132133E, "_ZN3aaa9GG2132133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132133C1Ev();
extern void _ZN3aaa9GG2132133D1Ev();
Name_Map name_map__ZN3aaa9GG2132133E[] = {
  NSPAIR(_ZN3aaa9GG2132133C1Ev),
  NSPAIR(_ZN3aaa9GG2132133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2132133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132133E[];
extern void _ZN3aaa9GG21321333barEv();
extern void _ZN3aaa9GG21321333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21321333fooEv,_ZThn8_N3aaa9GG21321333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21321333barEv,_ZThn20_N3aaa9GG21321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21321333fooEv,_ZThn20_N3aaa9GG21321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21321333fooEv,_ZThn28_N3aaa9GG21321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21321333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21321333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21321333fooEv,_ZThn8_N3aaa9GG21321333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321333barEv,_ZThn20_N3aaa9GG21321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21321333fooEv,_ZThn20_N3aaa9GG21321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21321333fooEv,_ZThn28_N3aaa9GG21321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132133E[];
Class_Descriptor cd__ZN3aaa9GG2132133E = {  "_ZN3aaa9GG2132133E", // class name
  bases__ZN3aaa9GG2132133E, 6,
  &(vtc__ZN3aaa9GG2132133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132211  : ::aaa::EE213 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21322113fooEv
  ~GG2132211(); // tgen
  GG2132211(); // tgen
};
//SIG(1 _ZN3aaa9GG2132211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21322113fooEv");}
aaa::GG2132211 ::~GG2132211(){ note_dtor("_ZN3aaa9GG2132211E", this);} // tgen
aaa::GG2132211 ::GG2132211(){ note_ctor("_ZN3aaa9GG2132211E", this);} // tgen
}
static void Test__ZN3aaa9GG2132211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132211E, buf);
    ::aaa::GG2132211 *dp, &lv = *(dp=new (buf) ::aaa::GG2132211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132211E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2132211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2132211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2132211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132211E);
    dp->::aaa::GG2132211::~GG2132211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132211E(Test__ZN3aaa9GG2132211E, "_ZN3aaa9GG2132211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132211C1Ev();
extern void _ZN3aaa9GG2132211D1Ev();
Name_Map name_map__ZN3aaa9GG2132211E[] = {
  NSPAIR(_ZN3aaa9GG2132211C1Ev),
  NSPAIR(_ZN3aaa9GG2132211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2132211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132211E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21322113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21322113fooEv,_ZThn8_N3aaa9GG21322113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21322113fooEv,_ZThn20_N3aaa9GG21322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21322113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21322113fooEv,_ZThn8_N3aaa9GG21322113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322113fooEv,_ZThn20_N3aaa9GG21322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132211E[];
Class_Descriptor cd__ZN3aaa9GG2132211E = {  "_ZN3aaa9GG2132211E", // class name
  bases__ZN3aaa9GG2132211E, 6,
  &(vtc__ZN3aaa9GG2132211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132212  : ::aaa::EE213 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21322123barEv
  ~GG2132212(); // tgen
  GG2132212(); // tgen
};
//SIG(1 _ZN3aaa9GG2132212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21322123barEv");}
aaa::GG2132212 ::~GG2132212(){ note_dtor("_ZN3aaa9GG2132212E", this);} // tgen
aaa::GG2132212 ::GG2132212(){ note_ctor("_ZN3aaa9GG2132212E", this);} // tgen
}
static void Test__ZN3aaa9GG2132212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132212E, buf);
    ::aaa::GG2132212 *dp, &lv = *(dp=new (buf) ::aaa::GG2132212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132212E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2132212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2132212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2132212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132212E);
    dp->::aaa::GG2132212::~GG2132212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132212E(Test__ZN3aaa9GG2132212E, "_ZN3aaa9GG2132212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132212C1Ev();
extern void _ZN3aaa9GG2132212D1Ev();
Name_Map name_map__ZN3aaa9GG2132212E[] = {
  NSPAIR(_ZN3aaa9GG2132212C1Ev),
  NSPAIR(_ZN3aaa9GG2132212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2132212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132212E[];
extern void _ZN3aaa9GG21322123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21322123barEv,_ZThn20_N3aaa9GG21322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21322123barEv,_ZThn28_N3aaa9GG21322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21322123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322123barEv,_ZThn20_N3aaa9GG21322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21322123barEv,_ZThn28_N3aaa9GG21322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132212E[];
Class_Descriptor cd__ZN3aaa9GG2132212E = {  "_ZN3aaa9GG2132212E", // class name
  bases__ZN3aaa9GG2132212E, 6,
  &(vtc__ZN3aaa9GG2132212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132213  : ::aaa::EE213 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21322133fooEv
  virtual void  bar(); // _ZN3aaa9GG21322133barEv
  ~GG2132213(); // tgen
  GG2132213(); // tgen
};
//SIG(1 _ZN3aaa9GG2132213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21322133fooEv");}
void  aaa::GG2132213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21322133barEv");}
aaa::GG2132213 ::~GG2132213(){ note_dtor("_ZN3aaa9GG2132213E", this);} // tgen
aaa::GG2132213 ::GG2132213(){ note_ctor("_ZN3aaa9GG2132213E", this);} // tgen
}
static void Test__ZN3aaa9GG2132213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132213E, buf);
    ::aaa::GG2132213 *dp, &lv = *(dp=new (buf) ::aaa::GG2132213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132213E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2132213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2132213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2132213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132213E);
    dp->::aaa::GG2132213::~GG2132213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132213E(Test__ZN3aaa9GG2132213E, "_ZN3aaa9GG2132213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132213C1Ev();
extern void _ZN3aaa9GG2132213D1Ev();
Name_Map name_map__ZN3aaa9GG2132213E[] = {
  NSPAIR(_ZN3aaa9GG2132213C1Ev),
  NSPAIR(_ZN3aaa9GG2132213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2132213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132213E[];
extern void _ZN3aaa9GG21322133barEv();
extern void _ZN3aaa9GG21322133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21322133fooEv,_ZThn8_N3aaa9GG21322133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21322133barEv,_ZThn20_N3aaa9GG21322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21322133fooEv,_ZThn20_N3aaa9GG21322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21322133barEv,_ZThn28_N3aaa9GG21322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21322133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21322133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21322133fooEv,_ZThn8_N3aaa9GG21322133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322133barEv,_ZThn20_N3aaa9GG21322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322133fooEv,_ZThn20_N3aaa9GG21322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21322133barEv,_ZThn28_N3aaa9GG21322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132213E[];
Class_Descriptor cd__ZN3aaa9GG2132213E = {  "_ZN3aaa9GG2132213E", // class name
  bases__ZN3aaa9GG2132213E, 6,
  &(vtc__ZN3aaa9GG2132213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132221  : ::aaa::EE213 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21322213fooEv
  ~GG2132221(); // tgen
  GG2132221(); // tgen
};
//SIG(1 _ZN3aaa9GG2132221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21322213fooEv");}
aaa::GG2132221 ::~GG2132221(){ note_dtor("_ZN3aaa9GG2132221E", this);} // tgen
aaa::GG2132221 ::GG2132221(){ note_ctor("_ZN3aaa9GG2132221E", this);} // tgen
}
static void Test__ZN3aaa9GG2132221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132221E, buf);
    ::aaa::GG2132221 *dp, &lv = *(dp=new (buf) ::aaa::GG2132221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132221E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2132221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2132221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2132221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132221E);
    dp->::aaa::GG2132221::~GG2132221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132221E(Test__ZN3aaa9GG2132221E, "_ZN3aaa9GG2132221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132221C1Ev();
extern void _ZN3aaa9GG2132221D1Ev();
Name_Map name_map__ZN3aaa9GG2132221E[] = {
  NSPAIR(_ZN3aaa9GG2132221C1Ev),
  NSPAIR(_ZN3aaa9GG2132221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2132221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132221E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21322213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21322213fooEv,_ZThn8_N3aaa9GG21322213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21322213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21322213fooEv,_ZThn8_N3aaa9GG21322213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132221E[];
Class_Descriptor cd__ZN3aaa9GG2132221E = {  "_ZN3aaa9GG2132221E", // class name
  bases__ZN3aaa9GG2132221E, 6,
  &(vtc__ZN3aaa9GG2132221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132222  : ::aaa::EE213 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21322223barEv
  ~GG2132222(); // tgen
  GG2132222(); // tgen
};
//SIG(1 _ZN3aaa9GG2132222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21322223barEv");}
aaa::GG2132222 ::~GG2132222(){ note_dtor("_ZN3aaa9GG2132222E", this);} // tgen
aaa::GG2132222 ::GG2132222(){ note_ctor("_ZN3aaa9GG2132222E", this);} // tgen
}
static void Test__ZN3aaa9GG2132222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132222E, buf);
    ::aaa::GG2132222 *dp, &lv = *(dp=new (buf) ::aaa::GG2132222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132222E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2132222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2132222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2132222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132222E);
    dp->::aaa::GG2132222::~GG2132222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132222E(Test__ZN3aaa9GG2132222E, "_ZN3aaa9GG2132222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132222C1Ev();
extern void _ZN3aaa9GG2132222D1Ev();
Name_Map name_map__ZN3aaa9GG2132222E[] = {
  NSPAIR(_ZN3aaa9GG2132222C1Ev),
  NSPAIR(_ZN3aaa9GG2132222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2132222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132222E[];
extern void _ZN3aaa9GG21322223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21322223barEv,_ZThn20_N3aaa9GG21322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21322223barEv,_ZThn28_N3aaa9GG21322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21322223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322223barEv,_ZThn20_N3aaa9GG21322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21322223barEv,_ZThn28_N3aaa9GG21322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132222E[];
Class_Descriptor cd__ZN3aaa9GG2132222E = {  "_ZN3aaa9GG2132222E", // class name
  bases__ZN3aaa9GG2132222E, 6,
  &(vtc__ZN3aaa9GG2132222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132223  : ::aaa::EE213 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21322233fooEv
  virtual void  bar(); // _ZN3aaa9GG21322233barEv
  ~GG2132223(); // tgen
  GG2132223(); // tgen
};
//SIG(1 _ZN3aaa9GG2132223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21322233fooEv");}
void  aaa::GG2132223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21322233barEv");}
aaa::GG2132223 ::~GG2132223(){ note_dtor("_ZN3aaa9GG2132223E", this);} // tgen
aaa::GG2132223 ::GG2132223(){ note_ctor("_ZN3aaa9GG2132223E", this);} // tgen
}
static void Test__ZN3aaa9GG2132223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132223E, buf);
    ::aaa::GG2132223 *dp, &lv = *(dp=new (buf) ::aaa::GG2132223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132223E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2132223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2132223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2132223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132223E);
    dp->::aaa::GG2132223::~GG2132223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132223E(Test__ZN3aaa9GG2132223E, "_ZN3aaa9GG2132223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132223C1Ev();
extern void _ZN3aaa9GG2132223D1Ev();
Name_Map name_map__ZN3aaa9GG2132223E[] = {
  NSPAIR(_ZN3aaa9GG2132223C1Ev),
  NSPAIR(_ZN3aaa9GG2132223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2132223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132223E[];
extern void _ZN3aaa9GG21322233barEv();
extern void _ZN3aaa9GG21322233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21322233fooEv,_ZThn8_N3aaa9GG21322233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21322233barEv,_ZThn20_N3aaa9GG21322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21322233barEv,_ZThn28_N3aaa9GG21322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21322233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21322233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21322233fooEv,_ZThn8_N3aaa9GG21322233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322233barEv,_ZThn20_N3aaa9GG21322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21322233barEv,_ZThn28_N3aaa9GG21322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132223E[];
Class_Descriptor cd__ZN3aaa9GG2132223E = {  "_ZN3aaa9GG2132223E", // class name
  bases__ZN3aaa9GG2132223E, 6,
  &(vtc__ZN3aaa9GG2132223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132231  : ::aaa::EE213 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21322313fooEv
  ~GG2132231(); // tgen
  GG2132231(); // tgen
};
//SIG(1 _ZN3aaa9GG2132231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21322313fooEv");}
aaa::GG2132231 ::~GG2132231(){ note_dtor("_ZN3aaa9GG2132231E", this);} // tgen
aaa::GG2132231 ::GG2132231(){ note_ctor("_ZN3aaa9GG2132231E", this);} // tgen
}
static void Test__ZN3aaa9GG2132231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132231E, buf);
    ::aaa::GG2132231 *dp, &lv = *(dp=new (buf) ::aaa::GG2132231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132231E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2132231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2132231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2132231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132231E);
    dp->::aaa::GG2132231::~GG2132231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132231E(Test__ZN3aaa9GG2132231E, "_ZN3aaa9GG2132231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132231C1Ev();
extern void _ZN3aaa9GG2132231D1Ev();
Name_Map name_map__ZN3aaa9GG2132231E[] = {
  NSPAIR(_ZN3aaa9GG2132231C1Ev),
  NSPAIR(_ZN3aaa9GG2132231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2132231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132231E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21322313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21322313fooEv,_ZThn8_N3aaa9GG21322313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21322313fooEv,_ZThn20_N3aaa9GG21322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21322313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21322313fooEv,_ZThn8_N3aaa9GG21322313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322313fooEv,_ZThn20_N3aaa9GG21322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132231E[];
Class_Descriptor cd__ZN3aaa9GG2132231E = {  "_ZN3aaa9GG2132231E", // class name
  bases__ZN3aaa9GG2132231E, 6,
  &(vtc__ZN3aaa9GG2132231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132232  : ::aaa::EE213 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21322323barEv
  ~GG2132232(); // tgen
  GG2132232(); // tgen
};
//SIG(1 _ZN3aaa9GG2132232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21322323barEv");}
aaa::GG2132232 ::~GG2132232(){ note_dtor("_ZN3aaa9GG2132232E", this);} // tgen
aaa::GG2132232 ::GG2132232(){ note_ctor("_ZN3aaa9GG2132232E", this);} // tgen
}
static void Test__ZN3aaa9GG2132232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132232E, buf);
    ::aaa::GG2132232 *dp, &lv = *(dp=new (buf) ::aaa::GG2132232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132232E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2132232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2132232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2132232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132232E);
    dp->::aaa::GG2132232::~GG2132232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132232E(Test__ZN3aaa9GG2132232E, "_ZN3aaa9GG2132232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132232C1Ev();
extern void _ZN3aaa9GG2132232D1Ev();
Name_Map name_map__ZN3aaa9GG2132232E[] = {
  NSPAIR(_ZN3aaa9GG2132232C1Ev),
  NSPAIR(_ZN3aaa9GG2132232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2132232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132232E[];
extern void _ZN3aaa9GG21322323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21322323barEv,_ZThn20_N3aaa9GG21322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21322323barEv,_ZThn28_N3aaa9GG21322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21322323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322323barEv,_ZThn20_N3aaa9GG21322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21322323barEv,_ZThn28_N3aaa9GG21322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132232E[];
Class_Descriptor cd__ZN3aaa9GG2132232E = {  "_ZN3aaa9GG2132232E", // class name
  bases__ZN3aaa9GG2132232E, 6,
  &(vtc__ZN3aaa9GG2132232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132233  : ::aaa::EE213 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21322333fooEv
  virtual void  bar(); // _ZN3aaa9GG21322333barEv
  ~GG2132233(); // tgen
  GG2132233(); // tgen
};
//SIG(1 _ZN3aaa9GG2132233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21322333fooEv");}
void  aaa::GG2132233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21322333barEv");}
aaa::GG2132233 ::~GG2132233(){ note_dtor("_ZN3aaa9GG2132233E", this);} // tgen
aaa::GG2132233 ::GG2132233(){ note_ctor("_ZN3aaa9GG2132233E", this);} // tgen
}
static void Test__ZN3aaa9GG2132233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132233E, buf);
    ::aaa::GG2132233 *dp, &lv = *(dp=new (buf) ::aaa::GG2132233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132233E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2132233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2132233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2132233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132233E);
    dp->::aaa::GG2132233::~GG2132233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132233E(Test__ZN3aaa9GG2132233E, "_ZN3aaa9GG2132233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132233C1Ev();
extern void _ZN3aaa9GG2132233D1Ev();
Name_Map name_map__ZN3aaa9GG2132233E[] = {
  NSPAIR(_ZN3aaa9GG2132233C1Ev),
  NSPAIR(_ZN3aaa9GG2132233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2132233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132233E[];
extern void _ZN3aaa9GG21322333barEv();
extern void _ZN3aaa9GG21322333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21322333fooEv,_ZThn8_N3aaa9GG21322333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21322333barEv,_ZThn20_N3aaa9GG21322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21322333fooEv,_ZThn20_N3aaa9GG21322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21322333barEv,_ZThn28_N3aaa9GG21322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21322333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21322333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21322333fooEv,_ZThn8_N3aaa9GG21322333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322333barEv,_ZThn20_N3aaa9GG21322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21322333fooEv,_ZThn20_N3aaa9GG21322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21322333barEv,_ZThn28_N3aaa9GG21322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132233E[];
Class_Descriptor cd__ZN3aaa9GG2132233E = {  "_ZN3aaa9GG2132233E", // class name
  bases__ZN3aaa9GG2132233E, 6,
  &(vtc__ZN3aaa9GG2132233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132311  : ::aaa::EE213 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21323113fooEv
  ~GG2132311(); // tgen
  GG2132311(); // tgen
};
//SIG(1 _ZN3aaa9GG2132311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21323113fooEv");}
aaa::GG2132311 ::~GG2132311(){ note_dtor("_ZN3aaa9GG2132311E", this);} // tgen
aaa::GG2132311 ::GG2132311(){ note_ctor("_ZN3aaa9GG2132311E", this);} // tgen
}
static void Test__ZN3aaa9GG2132311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132311E, buf);
    ::aaa::GG2132311 *dp, &lv = *(dp=new (buf) ::aaa::GG2132311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132311E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2132311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2132311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2132311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132311E);
    dp->::aaa::GG2132311::~GG2132311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132311E(Test__ZN3aaa9GG2132311E, "_ZN3aaa9GG2132311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132311C1Ev();
extern void _ZN3aaa9GG2132311D1Ev();
Name_Map name_map__ZN3aaa9GG2132311E[] = {
  NSPAIR(_ZN3aaa9GG2132311C1Ev),
  NSPAIR(_ZN3aaa9GG2132311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2132311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132311E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21323113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21323113fooEv,_ZThn8_N3aaa9GG21323113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21323113fooEv,_ZThn20_N3aaa9GG21323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323113fooEv,_ZThn28_N3aaa9GG21323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21323113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21323113fooEv,_ZThn8_N3aaa9GG21323113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323113fooEv,_ZThn20_N3aaa9GG21323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323113fooEv,_ZThn28_N3aaa9GG21323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132311E[];
Class_Descriptor cd__ZN3aaa9GG2132311E = {  "_ZN3aaa9GG2132311E", // class name
  bases__ZN3aaa9GG2132311E, 6,
  &(vtc__ZN3aaa9GG2132311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132312  : ::aaa::EE213 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21323123barEv
  ~GG2132312(); // tgen
  GG2132312(); // tgen
};
//SIG(1 _ZN3aaa9GG2132312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21323123barEv");}
aaa::GG2132312 ::~GG2132312(){ note_dtor("_ZN3aaa9GG2132312E", this);} // tgen
aaa::GG2132312 ::GG2132312(){ note_ctor("_ZN3aaa9GG2132312E", this);} // tgen
}
static void Test__ZN3aaa9GG2132312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132312E, buf);
    ::aaa::GG2132312 *dp, &lv = *(dp=new (buf) ::aaa::GG2132312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132312E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2132312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2132312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2132312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132312E);
    dp->::aaa::GG2132312::~GG2132312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132312E(Test__ZN3aaa9GG2132312E, "_ZN3aaa9GG2132312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132312C1Ev();
extern void _ZN3aaa9GG2132312D1Ev();
Name_Map name_map__ZN3aaa9GG2132312E[] = {
  NSPAIR(_ZN3aaa9GG2132312C1Ev),
  NSPAIR(_ZN3aaa9GG2132312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2132312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132312E[];
extern void _ZN3aaa9GG21323123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21323123barEv,_ZThn20_N3aaa9GG21323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323123barEv,_ZThn28_N3aaa9GG21323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21323123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323123barEv,_ZThn20_N3aaa9GG21323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323123barEv,_ZThn28_N3aaa9GG21323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132312E[];
Class_Descriptor cd__ZN3aaa9GG2132312E = {  "_ZN3aaa9GG2132312E", // class name
  bases__ZN3aaa9GG2132312E, 6,
  &(vtc__ZN3aaa9GG2132312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132313  : ::aaa::EE213 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21323133fooEv
  virtual void  bar(); // _ZN3aaa9GG21323133barEv
  ~GG2132313(); // tgen
  GG2132313(); // tgen
};
//SIG(1 _ZN3aaa9GG2132313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21323133fooEv");}
void  aaa::GG2132313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21323133barEv");}
aaa::GG2132313 ::~GG2132313(){ note_dtor("_ZN3aaa9GG2132313E", this);} // tgen
aaa::GG2132313 ::GG2132313(){ note_ctor("_ZN3aaa9GG2132313E", this);} // tgen
}
static void Test__ZN3aaa9GG2132313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132313E, buf);
    ::aaa::GG2132313 *dp, &lv = *(dp=new (buf) ::aaa::GG2132313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132313E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2132313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2132313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2132313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132313E);
    dp->::aaa::GG2132313::~GG2132313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132313E(Test__ZN3aaa9GG2132313E, "_ZN3aaa9GG2132313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132313C1Ev();
extern void _ZN3aaa9GG2132313D1Ev();
Name_Map name_map__ZN3aaa9GG2132313E[] = {
  NSPAIR(_ZN3aaa9GG2132313C1Ev),
  NSPAIR(_ZN3aaa9GG2132313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2132313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132313E[];
extern void _ZN3aaa9GG21323133barEv();
extern void _ZN3aaa9GG21323133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21323133fooEv,_ZThn8_N3aaa9GG21323133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21323133barEv,_ZThn20_N3aaa9GG21323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21323133fooEv,_ZThn20_N3aaa9GG21323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323133fooEv,_ZThn28_N3aaa9GG21323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323133barEv,_ZThn28_N3aaa9GG21323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21323133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21323133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21323133fooEv,_ZThn8_N3aaa9GG21323133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323133barEv,_ZThn20_N3aaa9GG21323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323133fooEv,_ZThn20_N3aaa9GG21323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323133fooEv,_ZThn28_N3aaa9GG21323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323133barEv,_ZThn28_N3aaa9GG21323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132313E[];
Class_Descriptor cd__ZN3aaa9GG2132313E = {  "_ZN3aaa9GG2132313E", // class name
  bases__ZN3aaa9GG2132313E, 6,
  &(vtc__ZN3aaa9GG2132313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132321  : ::aaa::EE213 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21323213fooEv
  ~GG2132321(); // tgen
  GG2132321(); // tgen
};
//SIG(1 _ZN3aaa9GG2132321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21323213fooEv");}
aaa::GG2132321 ::~GG2132321(){ note_dtor("_ZN3aaa9GG2132321E", this);} // tgen
aaa::GG2132321 ::GG2132321(){ note_ctor("_ZN3aaa9GG2132321E", this);} // tgen
}
static void Test__ZN3aaa9GG2132321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132321E, buf);
    ::aaa::GG2132321 *dp, &lv = *(dp=new (buf) ::aaa::GG2132321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132321E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2132321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2132321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2132321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132321E);
    dp->::aaa::GG2132321::~GG2132321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132321E(Test__ZN3aaa9GG2132321E, "_ZN3aaa9GG2132321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132321C1Ev();
extern void _ZN3aaa9GG2132321D1Ev();
Name_Map name_map__ZN3aaa9GG2132321E[] = {
  NSPAIR(_ZN3aaa9GG2132321C1Ev),
  NSPAIR(_ZN3aaa9GG2132321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2132321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132321E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21323213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21323213fooEv,_ZThn8_N3aaa9GG21323213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21323213fooEv,_ZThn28_N3aaa9GG21323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21323213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21323213fooEv,_ZThn8_N3aaa9GG21323213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323213fooEv,_ZThn28_N3aaa9GG21323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132321E[];
Class_Descriptor cd__ZN3aaa9GG2132321E = {  "_ZN3aaa9GG2132321E", // class name
  bases__ZN3aaa9GG2132321E, 6,
  &(vtc__ZN3aaa9GG2132321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132322  : ::aaa::EE213 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21323223barEv
  ~GG2132322(); // tgen
  GG2132322(); // tgen
};
//SIG(1 _ZN3aaa9GG2132322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21323223barEv");}
aaa::GG2132322 ::~GG2132322(){ note_dtor("_ZN3aaa9GG2132322E", this);} // tgen
aaa::GG2132322 ::GG2132322(){ note_ctor("_ZN3aaa9GG2132322E", this);} // tgen
}
static void Test__ZN3aaa9GG2132322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132322E, buf);
    ::aaa::GG2132322 *dp, &lv = *(dp=new (buf) ::aaa::GG2132322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132322E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2132322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2132322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2132322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132322E);
    dp->::aaa::GG2132322::~GG2132322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132322E(Test__ZN3aaa9GG2132322E, "_ZN3aaa9GG2132322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132322C1Ev();
extern void _ZN3aaa9GG2132322D1Ev();
Name_Map name_map__ZN3aaa9GG2132322E[] = {
  NSPAIR(_ZN3aaa9GG2132322C1Ev),
  NSPAIR(_ZN3aaa9GG2132322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2132322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132322E[];
extern void _ZN3aaa9GG21323223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21323223barEv,_ZThn20_N3aaa9GG21323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21323223barEv,_ZThn28_N3aaa9GG21323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21323223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323223barEv,_ZThn20_N3aaa9GG21323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323223barEv,_ZThn28_N3aaa9GG21323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132322E[];
Class_Descriptor cd__ZN3aaa9GG2132322E = {  "_ZN3aaa9GG2132322E", // class name
  bases__ZN3aaa9GG2132322E, 6,
  &(vtc__ZN3aaa9GG2132322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132323  : ::aaa::EE213 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21323233fooEv
  virtual void  bar(); // _ZN3aaa9GG21323233barEv
  ~GG2132323(); // tgen
  GG2132323(); // tgen
};
//SIG(1 _ZN3aaa9GG2132323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21323233fooEv");}
void  aaa::GG2132323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21323233barEv");}
aaa::GG2132323 ::~GG2132323(){ note_dtor("_ZN3aaa9GG2132323E", this);} // tgen
aaa::GG2132323 ::GG2132323(){ note_ctor("_ZN3aaa9GG2132323E", this);} // tgen
}
static void Test__ZN3aaa9GG2132323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132323E, buf);
    ::aaa::GG2132323 *dp, &lv = *(dp=new (buf) ::aaa::GG2132323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132323E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2132323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2132323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2132323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132323E);
    dp->::aaa::GG2132323::~GG2132323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132323E(Test__ZN3aaa9GG2132323E, "_ZN3aaa9GG2132323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132323C1Ev();
extern void _ZN3aaa9GG2132323D1Ev();
Name_Map name_map__ZN3aaa9GG2132323E[] = {
  NSPAIR(_ZN3aaa9GG2132323C1Ev),
  NSPAIR(_ZN3aaa9GG2132323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2132323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132323E[];
extern void _ZN3aaa9GG21323233barEv();
extern void _ZN3aaa9GG21323233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21323233fooEv,_ZThn8_N3aaa9GG21323233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21323233barEv,_ZThn20_N3aaa9GG21323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323233fooEv,_ZThn28_N3aaa9GG21323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323233barEv,_ZThn28_N3aaa9GG21323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21323233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21323233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21323233fooEv,_ZThn8_N3aaa9GG21323233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323233barEv,_ZThn20_N3aaa9GG21323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323233fooEv,_ZThn28_N3aaa9GG21323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323233barEv,_ZThn28_N3aaa9GG21323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132323E[];
Class_Descriptor cd__ZN3aaa9GG2132323E = {  "_ZN3aaa9GG2132323E", // class name
  bases__ZN3aaa9GG2132323E, 6,
  &(vtc__ZN3aaa9GG2132323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132331  : ::aaa::EE213 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21323313fooEv
  ~GG2132331(); // tgen
  GG2132331(); // tgen
};
//SIG(1 _ZN3aaa9GG2132331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21323313fooEv");}
aaa::GG2132331 ::~GG2132331(){ note_dtor("_ZN3aaa9GG2132331E", this);} // tgen
aaa::GG2132331 ::GG2132331(){ note_ctor("_ZN3aaa9GG2132331E", this);} // tgen
}
static void Test__ZN3aaa9GG2132331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132331E, buf);
    ::aaa::GG2132331 *dp, &lv = *(dp=new (buf) ::aaa::GG2132331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132331E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2132331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2132331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2132331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132331E);
    dp->::aaa::GG2132331::~GG2132331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132331E(Test__ZN3aaa9GG2132331E, "_ZN3aaa9GG2132331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132331C1Ev();
extern void _ZN3aaa9GG2132331D1Ev();
Name_Map name_map__ZN3aaa9GG2132331E[] = {
  NSPAIR(_ZN3aaa9GG2132331C1Ev),
  NSPAIR(_ZN3aaa9GG2132331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2132331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132331E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21323313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21323313fooEv,_ZThn8_N3aaa9GG21323313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21323313fooEv,_ZThn20_N3aaa9GG21323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323313fooEv,_ZThn28_N3aaa9GG21323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21323313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21323313fooEv,_ZThn8_N3aaa9GG21323313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323313fooEv,_ZThn20_N3aaa9GG21323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323313fooEv,_ZThn28_N3aaa9GG21323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132331E[];
Class_Descriptor cd__ZN3aaa9GG2132331E = {  "_ZN3aaa9GG2132331E", // class name
  bases__ZN3aaa9GG2132331E, 6,
  &(vtc__ZN3aaa9GG2132331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132332  : ::aaa::EE213 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21323323barEv
  ~GG2132332(); // tgen
  GG2132332(); // tgen
};
//SIG(1 _ZN3aaa9GG2132332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2132332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21323323barEv");}
aaa::GG2132332 ::~GG2132332(){ note_dtor("_ZN3aaa9GG2132332E", this);} // tgen
aaa::GG2132332 ::GG2132332(){ note_ctor("_ZN3aaa9GG2132332E", this);} // tgen
}
static void Test__ZN3aaa9GG2132332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132332E, buf);
    ::aaa::GG2132332 *dp, &lv = *(dp=new (buf) ::aaa::GG2132332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132332E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2132332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2132332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2132332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132332E);
    dp->::aaa::GG2132332::~GG2132332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132332E(Test__ZN3aaa9GG2132332E, "_ZN3aaa9GG2132332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132332C1Ev();
extern void _ZN3aaa9GG2132332D1Ev();
Name_Map name_map__ZN3aaa9GG2132332E[] = {
  NSPAIR(_ZN3aaa9GG2132332C1Ev),
  NSPAIR(_ZN3aaa9GG2132332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2132332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132332E[];
extern void _ZN3aaa9GG21323323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21323323barEv,_ZThn20_N3aaa9GG21323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323323barEv,_ZThn28_N3aaa9GG21323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21323323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323323barEv,_ZThn20_N3aaa9GG21323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323323barEv,_ZThn28_N3aaa9GG21323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132332E[];
Class_Descriptor cd__ZN3aaa9GG2132332E = {  "_ZN3aaa9GG2132332E", // class name
  bases__ZN3aaa9GG2132332E, 6,
  &(vtc__ZN3aaa9GG2132332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2132333  : ::aaa::EE213 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21323333fooEv
  virtual void  bar(); // _ZN3aaa9GG21323333barEv
  ~GG2132333(); // tgen
  GG2132333(); // tgen
};
//SIG(1 _ZN3aaa9GG2132333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2132333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21323333fooEv");}
void  aaa::GG2132333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21323333barEv");}
aaa::GG2132333 ::~GG2132333(){ note_dtor("_ZN3aaa9GG2132333E", this);} // tgen
aaa::GG2132333 ::GG2132333(){ note_ctor("_ZN3aaa9GG2132333E", this);} // tgen
}
static void Test__ZN3aaa9GG2132333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2132333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2132333E, buf);
    ::aaa::GG2132333 *dp, &lv = *(dp=new (buf) ::aaa::GG2132333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2132333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2132333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2132333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2132333E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2132333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2132333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2132333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2132333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2132333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2132333E);
    dp->::aaa::GG2132333::~GG2132333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2132333E(Test__ZN3aaa9GG2132333E, "_ZN3aaa9GG2132333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2132333C1Ev();
extern void _ZN3aaa9GG2132333D1Ev();
Name_Map name_map__ZN3aaa9GG2132333E[] = {
  NSPAIR(_ZN3aaa9GG2132333C1Ev),
  NSPAIR(_ZN3aaa9GG2132333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2132333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2132333E[];
extern void _ZN3aaa9GG21323333barEv();
extern void _ZN3aaa9GG21323333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21323333fooEv,_ZThn8_N3aaa9GG21323333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21323333barEv,_ZThn20_N3aaa9GG21323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21323333fooEv,_ZThn20_N3aaa9GG21323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323333fooEv,_ZThn28_N3aaa9GG21323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21323333barEv,_ZThn28_N3aaa9GG21323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2132333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21323333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21323333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21323333fooEv,_ZThn8_N3aaa9GG21323333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323333barEv,_ZThn20_N3aaa9GG21323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21323333fooEv,_ZThn20_N3aaa9GG21323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323333fooEv,_ZThn28_N3aaa9GG21323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21323333barEv,_ZThn28_N3aaa9GG21323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2132333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2132333E[];
Class_Descriptor cd__ZN3aaa9GG2132333E = {  "_ZN3aaa9GG2132333E", // class name
  bases__ZN3aaa9GG2132333E, 6,
  &(vtc__ZN3aaa9GG2132333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2132333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2132333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133111  : ::aaa::EE213 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21331113fooEv
  ~GG2133111(); // tgen
  GG2133111(); // tgen
};
//SIG(1 _ZN3aaa9GG2133111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133111 ::foo(){vfunc_called(this, "_ZN3aaa9GG21331113fooEv");}
aaa::GG2133111 ::~GG2133111(){ note_dtor("_ZN3aaa9GG2133111E", this);} // tgen
aaa::GG2133111 ::GG2133111(){ note_ctor("_ZN3aaa9GG2133111E", this);} // tgen
}
static void Test__ZN3aaa9GG2133111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133111E, buf);
    ::aaa::GG2133111 *dp, &lv = *(dp=new (buf) ::aaa::GG2133111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133111E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2133111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2133111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2133111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133111E);
    dp->::aaa::GG2133111::~GG2133111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133111E(Test__ZN3aaa9GG2133111E, "_ZN3aaa9GG2133111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133111C1Ev();
extern void _ZN3aaa9GG2133111D1Ev();
Name_Map name_map__ZN3aaa9GG2133111E[] = {
  NSPAIR(_ZN3aaa9GG2133111C1Ev),
  NSPAIR(_ZN3aaa9GG2133111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2133111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133111E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21331113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21331113fooEv,_ZThn8_N3aaa9GG21331113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331113fooEv,_ZThn20_N3aaa9GG21331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21331113fooEv,_ZThn28_N3aaa9GG21331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21331113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21331113fooEv,_ZThn8_N3aaa9GG21331113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331113fooEv,_ZThn20_N3aaa9GG21331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21331113fooEv,_ZThn28_N3aaa9GG21331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133111E[];
Class_Descriptor cd__ZN3aaa9GG2133111E = {  "_ZN3aaa9GG2133111E", // class name
  bases__ZN3aaa9GG2133111E, 6,
  &(vtc__ZN3aaa9GG2133111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133112  : ::aaa::EE213 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21331123barEv
  ~GG2133112(); // tgen
  GG2133112(); // tgen
};
//SIG(1 _ZN3aaa9GG2133112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133112 ::bar(){vfunc_called(this, "_ZN3aaa9GG21331123barEv");}
aaa::GG2133112 ::~GG2133112(){ note_dtor("_ZN3aaa9GG2133112E", this);} // tgen
aaa::GG2133112 ::GG2133112(){ note_ctor("_ZN3aaa9GG2133112E", this);} // tgen
}
static void Test__ZN3aaa9GG2133112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133112E, buf);
    ::aaa::GG2133112 *dp, &lv = *(dp=new (buf) ::aaa::GG2133112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133112E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2133112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2133112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2133112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133112E);
    dp->::aaa::GG2133112::~GG2133112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133112E(Test__ZN3aaa9GG2133112E, "_ZN3aaa9GG2133112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133112C1Ev();
extern void _ZN3aaa9GG2133112D1Ev();
Name_Map name_map__ZN3aaa9GG2133112E[] = {
  NSPAIR(_ZN3aaa9GG2133112C1Ev),
  NSPAIR(_ZN3aaa9GG2133112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2133112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133112E[];
extern void _ZN3aaa9GG21331123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21331123barEv,_ZThn20_N3aaa9GG21331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21331123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331123barEv,_ZThn20_N3aaa9GG21331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133112E[];
Class_Descriptor cd__ZN3aaa9GG2133112E = {  "_ZN3aaa9GG2133112E", // class name
  bases__ZN3aaa9GG2133112E, 6,
  &(vtc__ZN3aaa9GG2133112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133113  : ::aaa::EE213 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21331133fooEv
  virtual void  bar(); // _ZN3aaa9GG21331133barEv
  ~GG2133113(); // tgen
  GG2133113(); // tgen
};
//SIG(1 _ZN3aaa9GG2133113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133113 ::foo(){vfunc_called(this, "_ZN3aaa9GG21331133fooEv");}
void  aaa::GG2133113 ::bar(){vfunc_called(this, "_ZN3aaa9GG21331133barEv");}
aaa::GG2133113 ::~GG2133113(){ note_dtor("_ZN3aaa9GG2133113E", this);} // tgen
aaa::GG2133113 ::GG2133113(){ note_ctor("_ZN3aaa9GG2133113E", this);} // tgen
}
static void Test__ZN3aaa9GG2133113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133113E, buf);
    ::aaa::GG2133113 *dp, &lv = *(dp=new (buf) ::aaa::GG2133113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133113E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2133113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2133113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2133113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133113E);
    dp->::aaa::GG2133113::~GG2133113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133113E(Test__ZN3aaa9GG2133113E, "_ZN3aaa9GG2133113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133113C1Ev();
extern void _ZN3aaa9GG2133113D1Ev();
Name_Map name_map__ZN3aaa9GG2133113E[] = {
  NSPAIR(_ZN3aaa9GG2133113C1Ev),
  NSPAIR(_ZN3aaa9GG2133113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2133113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133113E[];
extern void _ZN3aaa9GG21331133barEv();
extern void _ZN3aaa9GG21331133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21331133fooEv,_ZThn8_N3aaa9GG21331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331133fooEv,_ZThn20_N3aaa9GG21331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331133barEv,_ZThn20_N3aaa9GG21331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21331133fooEv,_ZThn28_N3aaa9GG21331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21331133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21331133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21331133fooEv,_ZThn8_N3aaa9GG21331133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331133fooEv,_ZThn20_N3aaa9GG21331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331133barEv,_ZThn20_N3aaa9GG21331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21331133fooEv,_ZThn28_N3aaa9GG21331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133113E[];
Class_Descriptor cd__ZN3aaa9GG2133113E = {  "_ZN3aaa9GG2133113E", // class name
  bases__ZN3aaa9GG2133113E, 6,
  &(vtc__ZN3aaa9GG2133113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133121  : ::aaa::EE213 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21331213fooEv
  ~GG2133121(); // tgen
  GG2133121(); // tgen
};
//SIG(1 _ZN3aaa9GG2133121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133121 ::foo(){vfunc_called(this, "_ZN3aaa9GG21331213fooEv");}
aaa::GG2133121 ::~GG2133121(){ note_dtor("_ZN3aaa9GG2133121E", this);} // tgen
aaa::GG2133121 ::GG2133121(){ note_ctor("_ZN3aaa9GG2133121E", this);} // tgen
}
static void Test__ZN3aaa9GG2133121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133121E, buf);
    ::aaa::GG2133121 *dp, &lv = *(dp=new (buf) ::aaa::GG2133121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133121E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2133121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2133121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2133121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133121E);
    dp->::aaa::GG2133121::~GG2133121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133121E(Test__ZN3aaa9GG2133121E, "_ZN3aaa9GG2133121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133121C1Ev();
extern void _ZN3aaa9GG2133121D1Ev();
Name_Map name_map__ZN3aaa9GG2133121E[] = {
  NSPAIR(_ZN3aaa9GG2133121C1Ev),
  NSPAIR(_ZN3aaa9GG2133121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2133121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133121E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21331213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21331213fooEv,_ZThn8_N3aaa9GG21331213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331213fooEv,_ZThn20_N3aaa9GG21331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21331213fooEv,_ZThn28_N3aaa9GG21331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21331213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21331213fooEv,_ZThn8_N3aaa9GG21331213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331213fooEv,_ZThn20_N3aaa9GG21331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21331213fooEv,_ZThn28_N3aaa9GG21331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133121E[];
Class_Descriptor cd__ZN3aaa9GG2133121E = {  "_ZN3aaa9GG2133121E", // class name
  bases__ZN3aaa9GG2133121E, 6,
  &(vtc__ZN3aaa9GG2133121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133122  : ::aaa::EE213 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21331223barEv
  ~GG2133122(); // tgen
  GG2133122(); // tgen
};
//SIG(1 _ZN3aaa9GG2133122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133122 ::bar(){vfunc_called(this, "_ZN3aaa9GG21331223barEv");}
aaa::GG2133122 ::~GG2133122(){ note_dtor("_ZN3aaa9GG2133122E", this);} // tgen
aaa::GG2133122 ::GG2133122(){ note_ctor("_ZN3aaa9GG2133122E", this);} // tgen
}
static void Test__ZN3aaa9GG2133122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133122E, buf);
    ::aaa::GG2133122 *dp, &lv = *(dp=new (buf) ::aaa::GG2133122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133122E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2133122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2133122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2133122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133122E);
    dp->::aaa::GG2133122::~GG2133122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133122E(Test__ZN3aaa9GG2133122E, "_ZN3aaa9GG2133122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133122C1Ev();
extern void _ZN3aaa9GG2133122D1Ev();
Name_Map name_map__ZN3aaa9GG2133122E[] = {
  NSPAIR(_ZN3aaa9GG2133122C1Ev),
  NSPAIR(_ZN3aaa9GG2133122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2133122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133122E[];
extern void _ZN3aaa9GG21331223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21331223barEv,_ZThn20_N3aaa9GG21331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21331223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331223barEv,_ZThn20_N3aaa9GG21331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133122E[];
Class_Descriptor cd__ZN3aaa9GG2133122E = {  "_ZN3aaa9GG2133122E", // class name
  bases__ZN3aaa9GG2133122E, 6,
  &(vtc__ZN3aaa9GG2133122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133123  : ::aaa::EE213 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21331233fooEv
  virtual void  bar(); // _ZN3aaa9GG21331233barEv
  ~GG2133123(); // tgen
  GG2133123(); // tgen
};
//SIG(1 _ZN3aaa9GG2133123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133123 ::foo(){vfunc_called(this, "_ZN3aaa9GG21331233fooEv");}
void  aaa::GG2133123 ::bar(){vfunc_called(this, "_ZN3aaa9GG21331233barEv");}
aaa::GG2133123 ::~GG2133123(){ note_dtor("_ZN3aaa9GG2133123E", this);} // tgen
aaa::GG2133123 ::GG2133123(){ note_ctor("_ZN3aaa9GG2133123E", this);} // tgen
}
static void Test__ZN3aaa9GG2133123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133123E, buf);
    ::aaa::GG2133123 *dp, &lv = *(dp=new (buf) ::aaa::GG2133123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133123E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2133123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2133123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2133123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133123E);
    dp->::aaa::GG2133123::~GG2133123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133123E(Test__ZN3aaa9GG2133123E, "_ZN3aaa9GG2133123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133123C1Ev();
extern void _ZN3aaa9GG2133123D1Ev();
Name_Map name_map__ZN3aaa9GG2133123E[] = {
  NSPAIR(_ZN3aaa9GG2133123C1Ev),
  NSPAIR(_ZN3aaa9GG2133123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2133123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133123E[];
extern void _ZN3aaa9GG21331233barEv();
extern void _ZN3aaa9GG21331233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21331233fooEv,_ZThn8_N3aaa9GG21331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331233fooEv,_ZThn20_N3aaa9GG21331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331233barEv,_ZThn20_N3aaa9GG21331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21331233fooEv,_ZThn28_N3aaa9GG21331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21331233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21331233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21331233fooEv,_ZThn8_N3aaa9GG21331233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331233fooEv,_ZThn20_N3aaa9GG21331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331233barEv,_ZThn20_N3aaa9GG21331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21331233fooEv,_ZThn28_N3aaa9GG21331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133123E[];
Class_Descriptor cd__ZN3aaa9GG2133123E = {  "_ZN3aaa9GG2133123E", // class name
  bases__ZN3aaa9GG2133123E, 6,
  &(vtc__ZN3aaa9GG2133123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133131  : ::aaa::EE213 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21331313fooEv
  ~GG2133131(); // tgen
  GG2133131(); // tgen
};
//SIG(1 _ZN3aaa9GG2133131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133131 ::foo(){vfunc_called(this, "_ZN3aaa9GG21331313fooEv");}
aaa::GG2133131 ::~GG2133131(){ note_dtor("_ZN3aaa9GG2133131E", this);} // tgen
aaa::GG2133131 ::GG2133131(){ note_ctor("_ZN3aaa9GG2133131E", this);} // tgen
}
static void Test__ZN3aaa9GG2133131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133131E, buf);
    ::aaa::GG2133131 *dp, &lv = *(dp=new (buf) ::aaa::GG2133131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133131E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2133131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2133131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2133131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133131E);
    dp->::aaa::GG2133131::~GG2133131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133131E(Test__ZN3aaa9GG2133131E, "_ZN3aaa9GG2133131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133131C1Ev();
extern void _ZN3aaa9GG2133131D1Ev();
Name_Map name_map__ZN3aaa9GG2133131E[] = {
  NSPAIR(_ZN3aaa9GG2133131C1Ev),
  NSPAIR(_ZN3aaa9GG2133131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2133131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133131E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21331313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21331313fooEv,_ZThn8_N3aaa9GG21331313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331313fooEv,_ZThn20_N3aaa9GG21331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21331313fooEv,_ZThn28_N3aaa9GG21331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21331313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21331313fooEv,_ZThn8_N3aaa9GG21331313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331313fooEv,_ZThn20_N3aaa9GG21331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21331313fooEv,_ZThn28_N3aaa9GG21331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133131E[];
Class_Descriptor cd__ZN3aaa9GG2133131E = {  "_ZN3aaa9GG2133131E", // class name
  bases__ZN3aaa9GG2133131E, 6,
  &(vtc__ZN3aaa9GG2133131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133132  : ::aaa::EE213 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21331323barEv
  ~GG2133132(); // tgen
  GG2133132(); // tgen
};
//SIG(1 _ZN3aaa9GG2133132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133132 ::bar(){vfunc_called(this, "_ZN3aaa9GG21331323barEv");}
aaa::GG2133132 ::~GG2133132(){ note_dtor("_ZN3aaa9GG2133132E", this);} // tgen
aaa::GG2133132 ::GG2133132(){ note_ctor("_ZN3aaa9GG2133132E", this);} // tgen
}
static void Test__ZN3aaa9GG2133132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133132E, buf);
    ::aaa::GG2133132 *dp, &lv = *(dp=new (buf) ::aaa::GG2133132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133132E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2133132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2133132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2133132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133132E);
    dp->::aaa::GG2133132::~GG2133132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133132E(Test__ZN3aaa9GG2133132E, "_ZN3aaa9GG2133132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133132C1Ev();
extern void _ZN3aaa9GG2133132D1Ev();
Name_Map name_map__ZN3aaa9GG2133132E[] = {
  NSPAIR(_ZN3aaa9GG2133132C1Ev),
  NSPAIR(_ZN3aaa9GG2133132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2133132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133132E[];
extern void _ZN3aaa9GG21331323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21331323barEv,_ZThn20_N3aaa9GG21331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21331323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331323barEv,_ZThn20_N3aaa9GG21331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133132E[];
Class_Descriptor cd__ZN3aaa9GG2133132E = {  "_ZN3aaa9GG2133132E", // class name
  bases__ZN3aaa9GG2133132E, 6,
  &(vtc__ZN3aaa9GG2133132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133133  : ::aaa::EE213 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21331333fooEv
  virtual void  bar(); // _ZN3aaa9GG21331333barEv
  ~GG2133133(); // tgen
  GG2133133(); // tgen
};
//SIG(1 _ZN3aaa9GG2133133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133133 ::foo(){vfunc_called(this, "_ZN3aaa9GG21331333fooEv");}
void  aaa::GG2133133 ::bar(){vfunc_called(this, "_ZN3aaa9GG21331333barEv");}
aaa::GG2133133 ::~GG2133133(){ note_dtor("_ZN3aaa9GG2133133E", this);} // tgen
aaa::GG2133133 ::GG2133133(){ note_ctor("_ZN3aaa9GG2133133E", this);} // tgen
}
static void Test__ZN3aaa9GG2133133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133133E, buf);
    ::aaa::GG2133133 *dp, &lv = *(dp=new (buf) ::aaa::GG2133133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133133E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2133133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2133133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2133133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133133E);
    dp->::aaa::GG2133133::~GG2133133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133133E(Test__ZN3aaa9GG2133133E, "_ZN3aaa9GG2133133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133133C1Ev();
extern void _ZN3aaa9GG2133133D1Ev();
Name_Map name_map__ZN3aaa9GG2133133E[] = {
  NSPAIR(_ZN3aaa9GG2133133C1Ev),
  NSPAIR(_ZN3aaa9GG2133133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2133133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133133E[];
extern void _ZN3aaa9GG21331333barEv();
extern void _ZN3aaa9GG21331333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21331333fooEv,_ZThn8_N3aaa9GG21331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331333fooEv,_ZThn20_N3aaa9GG21331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21331333barEv,_ZThn20_N3aaa9GG21331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21331333fooEv,_ZThn28_N3aaa9GG21331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21331333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21331333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21331333fooEv,_ZThn8_N3aaa9GG21331333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331333fooEv,_ZThn20_N3aaa9GG21331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21331333barEv,_ZThn20_N3aaa9GG21331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21331333fooEv,_ZThn28_N3aaa9GG21331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133133E[];
Class_Descriptor cd__ZN3aaa9GG2133133E = {  "_ZN3aaa9GG2133133E", // class name
  bases__ZN3aaa9GG2133133E, 6,
  &(vtc__ZN3aaa9GG2133133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133211  : ::aaa::EE213 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21332113fooEv
  ~GG2133211(); // tgen
  GG2133211(); // tgen
};
//SIG(1 _ZN3aaa9GG2133211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133211 ::foo(){vfunc_called(this, "_ZN3aaa9GG21332113fooEv");}
aaa::GG2133211 ::~GG2133211(){ note_dtor("_ZN3aaa9GG2133211E", this);} // tgen
aaa::GG2133211 ::GG2133211(){ note_ctor("_ZN3aaa9GG2133211E", this);} // tgen
}
static void Test__ZN3aaa9GG2133211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133211E, buf);
    ::aaa::GG2133211 *dp, &lv = *(dp=new (buf) ::aaa::GG2133211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133211E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2133211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2133211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2133211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133211E);
    dp->::aaa::GG2133211::~GG2133211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133211E(Test__ZN3aaa9GG2133211E, "_ZN3aaa9GG2133211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133211C1Ev();
extern void _ZN3aaa9GG2133211D1Ev();
Name_Map name_map__ZN3aaa9GG2133211E[] = {
  NSPAIR(_ZN3aaa9GG2133211C1Ev),
  NSPAIR(_ZN3aaa9GG2133211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2133211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133211E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21332113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21332113fooEv,_ZThn8_N3aaa9GG21332113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332113fooEv,_ZThn20_N3aaa9GG21332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21332113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21332113fooEv,_ZThn8_N3aaa9GG21332113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332113fooEv,_ZThn20_N3aaa9GG21332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133211E[];
Class_Descriptor cd__ZN3aaa9GG2133211E = {  "_ZN3aaa9GG2133211E", // class name
  bases__ZN3aaa9GG2133211E, 6,
  &(vtc__ZN3aaa9GG2133211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133212  : ::aaa::EE213 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21332123barEv
  ~GG2133212(); // tgen
  GG2133212(); // tgen
};
//SIG(1 _ZN3aaa9GG2133212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133212 ::bar(){vfunc_called(this, "_ZN3aaa9GG21332123barEv");}
aaa::GG2133212 ::~GG2133212(){ note_dtor("_ZN3aaa9GG2133212E", this);} // tgen
aaa::GG2133212 ::GG2133212(){ note_ctor("_ZN3aaa9GG2133212E", this);} // tgen
}
static void Test__ZN3aaa9GG2133212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133212E, buf);
    ::aaa::GG2133212 *dp, &lv = *(dp=new (buf) ::aaa::GG2133212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133212E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2133212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2133212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2133212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133212E);
    dp->::aaa::GG2133212::~GG2133212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133212E(Test__ZN3aaa9GG2133212E, "_ZN3aaa9GG2133212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133212C1Ev();
extern void _ZN3aaa9GG2133212D1Ev();
Name_Map name_map__ZN3aaa9GG2133212E[] = {
  NSPAIR(_ZN3aaa9GG2133212C1Ev),
  NSPAIR(_ZN3aaa9GG2133212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2133212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133212E[];
extern void _ZN3aaa9GG21332123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21332123barEv,_ZThn20_N3aaa9GG21332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21332123barEv,_ZThn28_N3aaa9GG21332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21332123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332123barEv,_ZThn20_N3aaa9GG21332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21332123barEv,_ZThn28_N3aaa9GG21332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133212E[];
Class_Descriptor cd__ZN3aaa9GG2133212E = {  "_ZN3aaa9GG2133212E", // class name
  bases__ZN3aaa9GG2133212E, 6,
  &(vtc__ZN3aaa9GG2133212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133213  : ::aaa::EE213 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21332133fooEv
  virtual void  bar(); // _ZN3aaa9GG21332133barEv
  ~GG2133213(); // tgen
  GG2133213(); // tgen
};
//SIG(1 _ZN3aaa9GG2133213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133213 ::foo(){vfunc_called(this, "_ZN3aaa9GG21332133fooEv");}
void  aaa::GG2133213 ::bar(){vfunc_called(this, "_ZN3aaa9GG21332133barEv");}
aaa::GG2133213 ::~GG2133213(){ note_dtor("_ZN3aaa9GG2133213E", this);} // tgen
aaa::GG2133213 ::GG2133213(){ note_ctor("_ZN3aaa9GG2133213E", this);} // tgen
}
static void Test__ZN3aaa9GG2133213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133213E, buf);
    ::aaa::GG2133213 *dp, &lv = *(dp=new (buf) ::aaa::GG2133213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133213E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2133213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2133213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2133213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133213E);
    dp->::aaa::GG2133213::~GG2133213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133213E(Test__ZN3aaa9GG2133213E, "_ZN3aaa9GG2133213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133213C1Ev();
extern void _ZN3aaa9GG2133213D1Ev();
Name_Map name_map__ZN3aaa9GG2133213E[] = {
  NSPAIR(_ZN3aaa9GG2133213C1Ev),
  NSPAIR(_ZN3aaa9GG2133213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2133213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133213E[];
extern void _ZN3aaa9GG21332133barEv();
extern void _ZN3aaa9GG21332133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21332133fooEv,_ZThn8_N3aaa9GG21332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332133fooEv,_ZThn20_N3aaa9GG21332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332133barEv,_ZThn20_N3aaa9GG21332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21332133barEv,_ZThn28_N3aaa9GG21332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21332133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21332133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21332133fooEv,_ZThn8_N3aaa9GG21332133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332133fooEv,_ZThn20_N3aaa9GG21332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332133barEv,_ZThn20_N3aaa9GG21332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21332133barEv,_ZThn28_N3aaa9GG21332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133213E[];
Class_Descriptor cd__ZN3aaa9GG2133213E = {  "_ZN3aaa9GG2133213E", // class name
  bases__ZN3aaa9GG2133213E, 6,
  &(vtc__ZN3aaa9GG2133213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133221  : ::aaa::EE213 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21332213fooEv
  ~GG2133221(); // tgen
  GG2133221(); // tgen
};
//SIG(1 _ZN3aaa9GG2133221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133221 ::foo(){vfunc_called(this, "_ZN3aaa9GG21332213fooEv");}
aaa::GG2133221 ::~GG2133221(){ note_dtor("_ZN3aaa9GG2133221E", this);} // tgen
aaa::GG2133221 ::GG2133221(){ note_ctor("_ZN3aaa9GG2133221E", this);} // tgen
}
static void Test__ZN3aaa9GG2133221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133221E, buf);
    ::aaa::GG2133221 *dp, &lv = *(dp=new (buf) ::aaa::GG2133221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133221E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2133221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2133221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2133221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133221E);
    dp->::aaa::GG2133221::~GG2133221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133221E(Test__ZN3aaa9GG2133221E, "_ZN3aaa9GG2133221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133221C1Ev();
extern void _ZN3aaa9GG2133221D1Ev();
Name_Map name_map__ZN3aaa9GG2133221E[] = {
  NSPAIR(_ZN3aaa9GG2133221C1Ev),
  NSPAIR(_ZN3aaa9GG2133221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2133221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133221E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21332213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21332213fooEv,_ZThn8_N3aaa9GG21332213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332213fooEv,_ZThn20_N3aaa9GG21332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21332213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21332213fooEv,_ZThn8_N3aaa9GG21332213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332213fooEv,_ZThn20_N3aaa9GG21332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133221E[];
Class_Descriptor cd__ZN3aaa9GG2133221E = {  "_ZN3aaa9GG2133221E", // class name
  bases__ZN3aaa9GG2133221E, 6,
  &(vtc__ZN3aaa9GG2133221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133222  : ::aaa::EE213 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21332223barEv
  ~GG2133222(); // tgen
  GG2133222(); // tgen
};
//SIG(1 _ZN3aaa9GG2133222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133222 ::bar(){vfunc_called(this, "_ZN3aaa9GG21332223barEv");}
aaa::GG2133222 ::~GG2133222(){ note_dtor("_ZN3aaa9GG2133222E", this);} // tgen
aaa::GG2133222 ::GG2133222(){ note_ctor("_ZN3aaa9GG2133222E", this);} // tgen
}
static void Test__ZN3aaa9GG2133222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133222E, buf);
    ::aaa::GG2133222 *dp, &lv = *(dp=new (buf) ::aaa::GG2133222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133222E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2133222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2133222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2133222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133222E);
    dp->::aaa::GG2133222::~GG2133222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133222E(Test__ZN3aaa9GG2133222E, "_ZN3aaa9GG2133222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133222C1Ev();
extern void _ZN3aaa9GG2133222D1Ev();
Name_Map name_map__ZN3aaa9GG2133222E[] = {
  NSPAIR(_ZN3aaa9GG2133222C1Ev),
  NSPAIR(_ZN3aaa9GG2133222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2133222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133222E[];
extern void _ZN3aaa9GG21332223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21332223barEv,_ZThn20_N3aaa9GG21332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21332223barEv,_ZThn28_N3aaa9GG21332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21332223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332223barEv,_ZThn20_N3aaa9GG21332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21332223barEv,_ZThn28_N3aaa9GG21332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133222E[];
Class_Descriptor cd__ZN3aaa9GG2133222E = {  "_ZN3aaa9GG2133222E", // class name
  bases__ZN3aaa9GG2133222E, 6,
  &(vtc__ZN3aaa9GG2133222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133223  : ::aaa::EE213 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21332233fooEv
  virtual void  bar(); // _ZN3aaa9GG21332233barEv
  ~GG2133223(); // tgen
  GG2133223(); // tgen
};
//SIG(1 _ZN3aaa9GG2133223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133223 ::foo(){vfunc_called(this, "_ZN3aaa9GG21332233fooEv");}
void  aaa::GG2133223 ::bar(){vfunc_called(this, "_ZN3aaa9GG21332233barEv");}
aaa::GG2133223 ::~GG2133223(){ note_dtor("_ZN3aaa9GG2133223E", this);} // tgen
aaa::GG2133223 ::GG2133223(){ note_ctor("_ZN3aaa9GG2133223E", this);} // tgen
}
static void Test__ZN3aaa9GG2133223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133223E, buf);
    ::aaa::GG2133223 *dp, &lv = *(dp=new (buf) ::aaa::GG2133223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133223E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2133223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2133223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2133223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133223E);
    dp->::aaa::GG2133223::~GG2133223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133223E(Test__ZN3aaa9GG2133223E, "_ZN3aaa9GG2133223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133223C1Ev();
extern void _ZN3aaa9GG2133223D1Ev();
Name_Map name_map__ZN3aaa9GG2133223E[] = {
  NSPAIR(_ZN3aaa9GG2133223C1Ev),
  NSPAIR(_ZN3aaa9GG2133223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2133223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133223E[];
extern void _ZN3aaa9GG21332233barEv();
extern void _ZN3aaa9GG21332233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21332233fooEv,_ZThn8_N3aaa9GG21332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332233fooEv,_ZThn20_N3aaa9GG21332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332233barEv,_ZThn20_N3aaa9GG21332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21332233barEv,_ZThn28_N3aaa9GG21332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21332233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21332233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21332233fooEv,_ZThn8_N3aaa9GG21332233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332233fooEv,_ZThn20_N3aaa9GG21332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332233barEv,_ZThn20_N3aaa9GG21332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21332233barEv,_ZThn28_N3aaa9GG21332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133223E[];
Class_Descriptor cd__ZN3aaa9GG2133223E = {  "_ZN3aaa9GG2133223E", // class name
  bases__ZN3aaa9GG2133223E, 6,
  &(vtc__ZN3aaa9GG2133223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133231  : ::aaa::EE213 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21332313fooEv
  ~GG2133231(); // tgen
  GG2133231(); // tgen
};
//SIG(1 _ZN3aaa9GG2133231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133231 ::foo(){vfunc_called(this, "_ZN3aaa9GG21332313fooEv");}
aaa::GG2133231 ::~GG2133231(){ note_dtor("_ZN3aaa9GG2133231E", this);} // tgen
aaa::GG2133231 ::GG2133231(){ note_ctor("_ZN3aaa9GG2133231E", this);} // tgen
}
static void Test__ZN3aaa9GG2133231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133231E, buf);
    ::aaa::GG2133231 *dp, &lv = *(dp=new (buf) ::aaa::GG2133231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133231E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2133231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2133231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2133231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133231E);
    dp->::aaa::GG2133231::~GG2133231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133231E(Test__ZN3aaa9GG2133231E, "_ZN3aaa9GG2133231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133231C1Ev();
extern void _ZN3aaa9GG2133231D1Ev();
Name_Map name_map__ZN3aaa9GG2133231E[] = {
  NSPAIR(_ZN3aaa9GG2133231C1Ev),
  NSPAIR(_ZN3aaa9GG2133231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2133231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133231E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21332313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21332313fooEv,_ZThn8_N3aaa9GG21332313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332313fooEv,_ZThn20_N3aaa9GG21332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21332313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21332313fooEv,_ZThn8_N3aaa9GG21332313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332313fooEv,_ZThn20_N3aaa9GG21332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133231E[];
Class_Descriptor cd__ZN3aaa9GG2133231E = {  "_ZN3aaa9GG2133231E", // class name
  bases__ZN3aaa9GG2133231E, 6,
  &(vtc__ZN3aaa9GG2133231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133232  : ::aaa::EE213 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21332323barEv
  ~GG2133232(); // tgen
  GG2133232(); // tgen
};
//SIG(1 _ZN3aaa9GG2133232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133232 ::bar(){vfunc_called(this, "_ZN3aaa9GG21332323barEv");}
aaa::GG2133232 ::~GG2133232(){ note_dtor("_ZN3aaa9GG2133232E", this);} // tgen
aaa::GG2133232 ::GG2133232(){ note_ctor("_ZN3aaa9GG2133232E", this);} // tgen
}
static void Test__ZN3aaa9GG2133232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133232E, buf);
    ::aaa::GG2133232 *dp, &lv = *(dp=new (buf) ::aaa::GG2133232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133232E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2133232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2133232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2133232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133232E);
    dp->::aaa::GG2133232::~GG2133232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133232E(Test__ZN3aaa9GG2133232E, "_ZN3aaa9GG2133232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133232C1Ev();
extern void _ZN3aaa9GG2133232D1Ev();
Name_Map name_map__ZN3aaa9GG2133232E[] = {
  NSPAIR(_ZN3aaa9GG2133232C1Ev),
  NSPAIR(_ZN3aaa9GG2133232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2133232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133232E[];
extern void _ZN3aaa9GG21332323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21332323barEv,_ZThn20_N3aaa9GG21332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21332323barEv,_ZThn28_N3aaa9GG21332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21332323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332323barEv,_ZThn20_N3aaa9GG21332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21332323barEv,_ZThn28_N3aaa9GG21332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133232E[];
Class_Descriptor cd__ZN3aaa9GG2133232E = {  "_ZN3aaa9GG2133232E", // class name
  bases__ZN3aaa9GG2133232E, 6,
  &(vtc__ZN3aaa9GG2133232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133233  : ::aaa::EE213 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21332333fooEv
  virtual void  bar(); // _ZN3aaa9GG21332333barEv
  ~GG2133233(); // tgen
  GG2133233(); // tgen
};
//SIG(1 _ZN3aaa9GG2133233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133233 ::foo(){vfunc_called(this, "_ZN3aaa9GG21332333fooEv");}
void  aaa::GG2133233 ::bar(){vfunc_called(this, "_ZN3aaa9GG21332333barEv");}
aaa::GG2133233 ::~GG2133233(){ note_dtor("_ZN3aaa9GG2133233E", this);} // tgen
aaa::GG2133233 ::GG2133233(){ note_ctor("_ZN3aaa9GG2133233E", this);} // tgen
}
static void Test__ZN3aaa9GG2133233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133233E, buf);
    ::aaa::GG2133233 *dp, &lv = *(dp=new (buf) ::aaa::GG2133233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133233E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2133233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2133233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2133233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133233E);
    dp->::aaa::GG2133233::~GG2133233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133233E(Test__ZN3aaa9GG2133233E, "_ZN3aaa9GG2133233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133233C1Ev();
extern void _ZN3aaa9GG2133233D1Ev();
Name_Map name_map__ZN3aaa9GG2133233E[] = {
  NSPAIR(_ZN3aaa9GG2133233C1Ev),
  NSPAIR(_ZN3aaa9GG2133233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2133233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133233E[];
extern void _ZN3aaa9GG21332333barEv();
extern void _ZN3aaa9GG21332333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21332333fooEv,_ZThn8_N3aaa9GG21332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332333fooEv,_ZThn20_N3aaa9GG21332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21332333barEv,_ZThn20_N3aaa9GG21332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21332333barEv,_ZThn28_N3aaa9GG21332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21332333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21332333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21332333fooEv,_ZThn8_N3aaa9GG21332333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332333fooEv,_ZThn20_N3aaa9GG21332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21332333barEv,_ZThn20_N3aaa9GG21332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21332333barEv,_ZThn28_N3aaa9GG21332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133233E[];
Class_Descriptor cd__ZN3aaa9GG2133233E = {  "_ZN3aaa9GG2133233E", // class name
  bases__ZN3aaa9GG2133233E, 6,
  &(vtc__ZN3aaa9GG2133233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133311  : ::aaa::EE213 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21333113fooEv
  ~GG2133311(); // tgen
  GG2133311(); // tgen
};
//SIG(1 _ZN3aaa9GG2133311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133311 ::foo(){vfunc_called(this, "_ZN3aaa9GG21333113fooEv");}
aaa::GG2133311 ::~GG2133311(){ note_dtor("_ZN3aaa9GG2133311E", this);} // tgen
aaa::GG2133311 ::GG2133311(){ note_ctor("_ZN3aaa9GG2133311E", this);} // tgen
}
static void Test__ZN3aaa9GG2133311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133311E, buf);
    ::aaa::GG2133311 *dp, &lv = *(dp=new (buf) ::aaa::GG2133311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133311E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2133311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2133311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2133311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133311E);
    dp->::aaa::GG2133311::~GG2133311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133311E(Test__ZN3aaa9GG2133311E, "_ZN3aaa9GG2133311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133311C1Ev();
extern void _ZN3aaa9GG2133311D1Ev();
Name_Map name_map__ZN3aaa9GG2133311E[] = {
  NSPAIR(_ZN3aaa9GG2133311C1Ev),
  NSPAIR(_ZN3aaa9GG2133311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2133311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133311E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21333113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21333113fooEv,_ZThn8_N3aaa9GG21333113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333113fooEv,_ZThn20_N3aaa9GG21333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21333113fooEv,_ZThn28_N3aaa9GG21333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21333113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21333113fooEv,_ZThn8_N3aaa9GG21333113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333113fooEv,_ZThn20_N3aaa9GG21333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333113fooEv,_ZThn28_N3aaa9GG21333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133311E[];
Class_Descriptor cd__ZN3aaa9GG2133311E = {  "_ZN3aaa9GG2133311E", // class name
  bases__ZN3aaa9GG2133311E, 6,
  &(vtc__ZN3aaa9GG2133311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133312  : ::aaa::EE213 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21333123barEv
  ~GG2133312(); // tgen
  GG2133312(); // tgen
};
//SIG(1 _ZN3aaa9GG2133312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133312 ::bar(){vfunc_called(this, "_ZN3aaa9GG21333123barEv");}
aaa::GG2133312 ::~GG2133312(){ note_dtor("_ZN3aaa9GG2133312E", this);} // tgen
aaa::GG2133312 ::GG2133312(){ note_ctor("_ZN3aaa9GG2133312E", this);} // tgen
}
static void Test__ZN3aaa9GG2133312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133312E, buf);
    ::aaa::GG2133312 *dp, &lv = *(dp=new (buf) ::aaa::GG2133312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133312E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2133312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2133312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2133312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133312E);
    dp->::aaa::GG2133312::~GG2133312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133312E(Test__ZN3aaa9GG2133312E, "_ZN3aaa9GG2133312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133312C1Ev();
extern void _ZN3aaa9GG2133312D1Ev();
Name_Map name_map__ZN3aaa9GG2133312E[] = {
  NSPAIR(_ZN3aaa9GG2133312C1Ev),
  NSPAIR(_ZN3aaa9GG2133312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2133312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133312E[];
extern void _ZN3aaa9GG21333123barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21333123barEv,_ZThn20_N3aaa9GG21333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21333123barEv,_ZThn28_N3aaa9GG21333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21333123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333123barEv,_ZThn20_N3aaa9GG21333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333123barEv,_ZThn28_N3aaa9GG21333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133312E[];
Class_Descriptor cd__ZN3aaa9GG2133312E = {  "_ZN3aaa9GG2133312E", // class name
  bases__ZN3aaa9GG2133312E, 6,
  &(vtc__ZN3aaa9GG2133312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133313  : ::aaa::EE213 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21333133fooEv
  virtual void  bar(); // _ZN3aaa9GG21333133barEv
  ~GG2133313(); // tgen
  GG2133313(); // tgen
};
//SIG(1 _ZN3aaa9GG2133313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133313 ::foo(){vfunc_called(this, "_ZN3aaa9GG21333133fooEv");}
void  aaa::GG2133313 ::bar(){vfunc_called(this, "_ZN3aaa9GG21333133barEv");}
aaa::GG2133313 ::~GG2133313(){ note_dtor("_ZN3aaa9GG2133313E", this);} // tgen
aaa::GG2133313 ::GG2133313(){ note_ctor("_ZN3aaa9GG2133313E", this);} // tgen
}
static void Test__ZN3aaa9GG2133313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133313E, buf);
    ::aaa::GG2133313 *dp, &lv = *(dp=new (buf) ::aaa::GG2133313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133313E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2133313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2133313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2133313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133313E);
    dp->::aaa::GG2133313::~GG2133313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133313E(Test__ZN3aaa9GG2133313E, "_ZN3aaa9GG2133313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133313C1Ev();
extern void _ZN3aaa9GG2133313D1Ev();
Name_Map name_map__ZN3aaa9GG2133313E[] = {
  NSPAIR(_ZN3aaa9GG2133313C1Ev),
  NSPAIR(_ZN3aaa9GG2133313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2133313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133313E[];
extern void _ZN3aaa9GG21333133barEv();
extern void _ZN3aaa9GG21333133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21333133fooEv,_ZThn8_N3aaa9GG21333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333133fooEv,_ZThn20_N3aaa9GG21333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333133barEv,_ZThn20_N3aaa9GG21333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21333133fooEv,_ZThn28_N3aaa9GG21333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21333133barEv,_ZThn28_N3aaa9GG21333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21333133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21333133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21333133fooEv,_ZThn8_N3aaa9GG21333133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333133fooEv,_ZThn20_N3aaa9GG21333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333133barEv,_ZThn20_N3aaa9GG21333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333133fooEv,_ZThn28_N3aaa9GG21333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333133barEv,_ZThn28_N3aaa9GG21333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133313E[];
Class_Descriptor cd__ZN3aaa9GG2133313E = {  "_ZN3aaa9GG2133313E", // class name
  bases__ZN3aaa9GG2133313E, 6,
  &(vtc__ZN3aaa9GG2133313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133321  : ::aaa::EE213 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21333213fooEv
  ~GG2133321(); // tgen
  GG2133321(); // tgen
};
//SIG(1 _ZN3aaa9GG2133321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133321 ::foo(){vfunc_called(this, "_ZN3aaa9GG21333213fooEv");}
aaa::GG2133321 ::~GG2133321(){ note_dtor("_ZN3aaa9GG2133321E", this);} // tgen
aaa::GG2133321 ::GG2133321(){ note_ctor("_ZN3aaa9GG2133321E", this);} // tgen
}
static void Test__ZN3aaa9GG2133321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133321E, buf);
    ::aaa::GG2133321 *dp, &lv = *(dp=new (buf) ::aaa::GG2133321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133321E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2133321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2133321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2133321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133321E);
    dp->::aaa::GG2133321::~GG2133321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133321E(Test__ZN3aaa9GG2133321E, "_ZN3aaa9GG2133321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133321C1Ev();
extern void _ZN3aaa9GG2133321D1Ev();
Name_Map name_map__ZN3aaa9GG2133321E[] = {
  NSPAIR(_ZN3aaa9GG2133321C1Ev),
  NSPAIR(_ZN3aaa9GG2133321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2133321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133321E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21333213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21333213fooEv,_ZThn8_N3aaa9GG21333213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333213fooEv,_ZThn20_N3aaa9GG21333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21333213fooEv,_ZThn28_N3aaa9GG21333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21333213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21333213fooEv,_ZThn8_N3aaa9GG21333213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333213fooEv,_ZThn20_N3aaa9GG21333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333213fooEv,_ZThn28_N3aaa9GG21333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133321E[];
Class_Descriptor cd__ZN3aaa9GG2133321E = {  "_ZN3aaa9GG2133321E", // class name
  bases__ZN3aaa9GG2133321E, 6,
  &(vtc__ZN3aaa9GG2133321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133322  : ::aaa::EE213 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21333223barEv
  ~GG2133322(); // tgen
  GG2133322(); // tgen
};
//SIG(1 _ZN3aaa9GG2133322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133322 ::bar(){vfunc_called(this, "_ZN3aaa9GG21333223barEv");}
aaa::GG2133322 ::~GG2133322(){ note_dtor("_ZN3aaa9GG2133322E", this);} // tgen
aaa::GG2133322 ::GG2133322(){ note_ctor("_ZN3aaa9GG2133322E", this);} // tgen
}
static void Test__ZN3aaa9GG2133322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133322E, buf);
    ::aaa::GG2133322 *dp, &lv = *(dp=new (buf) ::aaa::GG2133322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133322E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2133322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2133322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2133322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133322E);
    dp->::aaa::GG2133322::~GG2133322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133322E(Test__ZN3aaa9GG2133322E, "_ZN3aaa9GG2133322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133322C1Ev();
extern void _ZN3aaa9GG2133322D1Ev();
Name_Map name_map__ZN3aaa9GG2133322E[] = {
  NSPAIR(_ZN3aaa9GG2133322C1Ev),
  NSPAIR(_ZN3aaa9GG2133322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2133322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133322E[];
extern void _ZN3aaa9GG21333223barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21333223barEv,_ZThn20_N3aaa9GG21333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21333223barEv,_ZThn28_N3aaa9GG21333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21333223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333223barEv,_ZThn20_N3aaa9GG21333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333223barEv,_ZThn28_N3aaa9GG21333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133322E[];
Class_Descriptor cd__ZN3aaa9GG2133322E = {  "_ZN3aaa9GG2133322E", // class name
  bases__ZN3aaa9GG2133322E, 6,
  &(vtc__ZN3aaa9GG2133322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133323  : ::aaa::EE213 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21333233fooEv
  virtual void  bar(); // _ZN3aaa9GG21333233barEv
  ~GG2133323(); // tgen
  GG2133323(); // tgen
};
//SIG(1 _ZN3aaa9GG2133323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133323 ::foo(){vfunc_called(this, "_ZN3aaa9GG21333233fooEv");}
void  aaa::GG2133323 ::bar(){vfunc_called(this, "_ZN3aaa9GG21333233barEv");}
aaa::GG2133323 ::~GG2133323(){ note_dtor("_ZN3aaa9GG2133323E", this);} // tgen
aaa::GG2133323 ::GG2133323(){ note_ctor("_ZN3aaa9GG2133323E", this);} // tgen
}
static void Test__ZN3aaa9GG2133323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133323E, buf);
    ::aaa::GG2133323 *dp, &lv = *(dp=new (buf) ::aaa::GG2133323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133323E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2133323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2133323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2133323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133323E);
    dp->::aaa::GG2133323::~GG2133323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133323E(Test__ZN3aaa9GG2133323E, "_ZN3aaa9GG2133323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133323C1Ev();
extern void _ZN3aaa9GG2133323D1Ev();
Name_Map name_map__ZN3aaa9GG2133323E[] = {
  NSPAIR(_ZN3aaa9GG2133323C1Ev),
  NSPAIR(_ZN3aaa9GG2133323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2133323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133323E[];
extern void _ZN3aaa9GG21333233barEv();
extern void _ZN3aaa9GG21333233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21333233fooEv,_ZThn8_N3aaa9GG21333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333233fooEv,_ZThn20_N3aaa9GG21333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333233barEv,_ZThn20_N3aaa9GG21333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21333233fooEv,_ZThn28_N3aaa9GG21333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21333233barEv,_ZThn28_N3aaa9GG21333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21333233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21333233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21333233fooEv,_ZThn8_N3aaa9GG21333233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333233fooEv,_ZThn20_N3aaa9GG21333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333233barEv,_ZThn20_N3aaa9GG21333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333233fooEv,_ZThn28_N3aaa9GG21333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333233barEv,_ZThn28_N3aaa9GG21333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133323E[];
Class_Descriptor cd__ZN3aaa9GG2133323E = {  "_ZN3aaa9GG2133323E", // class name
  bases__ZN3aaa9GG2133323E, 6,
  &(vtc__ZN3aaa9GG2133323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133331  : ::aaa::EE213 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21333313fooEv
  ~GG2133331(); // tgen
  GG2133331(); // tgen
};
//SIG(1 _ZN3aaa9GG2133331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133331 ::foo(){vfunc_called(this, "_ZN3aaa9GG21333313fooEv");}
aaa::GG2133331 ::~GG2133331(){ note_dtor("_ZN3aaa9GG2133331E", this);} // tgen
aaa::GG2133331 ::GG2133331(){ note_ctor("_ZN3aaa9GG2133331E", this);} // tgen
}
static void Test__ZN3aaa9GG2133331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133331E, buf);
    ::aaa::GG2133331 *dp, &lv = *(dp=new (buf) ::aaa::GG2133331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133331E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2133331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2133331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2133331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133331E);
    dp->::aaa::GG2133331::~GG2133331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133331E(Test__ZN3aaa9GG2133331E, "_ZN3aaa9GG2133331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133331C1Ev();
extern void _ZN3aaa9GG2133331D1Ev();
Name_Map name_map__ZN3aaa9GG2133331E[] = {
  NSPAIR(_ZN3aaa9GG2133331C1Ev),
  NSPAIR(_ZN3aaa9GG2133331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2133331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133331E[];
extern void _ZN3aaa5EE2133barEv();
extern void _ZN3aaa9GG21333313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21333313fooEv,_ZThn8_N3aaa9GG21333313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333313fooEv,_ZThn20_N3aaa9GG21333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG21333313fooEv,_ZThn28_N3aaa9GG21333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21333313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21333313fooEv,_ZThn8_N3aaa9GG21333313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333313fooEv,_ZThn20_N3aaa9GG21333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333313fooEv,_ZThn28_N3aaa9GG21333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133331E[];
Class_Descriptor cd__ZN3aaa9GG2133331E = {  "_ZN3aaa9GG2133331E", // class name
  bases__ZN3aaa9GG2133331E, 6,
  &(vtc__ZN3aaa9GG2133331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133332  : ::aaa::EE213 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG21333323barEv
  ~GG2133332(); // tgen
  GG2133332(); // tgen
};
//SIG(1 _ZN3aaa9GG2133332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2133332 ::bar(){vfunc_called(this, "_ZN3aaa9GG21333323barEv");}
aaa::GG2133332 ::~GG2133332(){ note_dtor("_ZN3aaa9GG2133332E", this);} // tgen
aaa::GG2133332 ::GG2133332(){ note_ctor("_ZN3aaa9GG2133332E", this);} // tgen
}
static void Test__ZN3aaa9GG2133332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133332E, buf);
    ::aaa::GG2133332 *dp, &lv = *(dp=new (buf) ::aaa::GG2133332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133332E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2133332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2133332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2133332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133332E);
    dp->::aaa::GG2133332::~GG2133332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133332E(Test__ZN3aaa9GG2133332E, "_ZN3aaa9GG2133332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133332C1Ev();
extern void _ZN3aaa9GG2133332D1Ev();
Name_Map name_map__ZN3aaa9GG2133332E[] = {
  NSPAIR(_ZN3aaa9GG2133332C1Ev),
  NSPAIR(_ZN3aaa9GG2133332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2133332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133332E[];
extern void _ZN3aaa9GG21333323barEv();
extern void _ZN3aaa5EE2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG21333323barEv,_ZThn20_N3aaa9GG21333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21333323barEv,_ZThn28_N3aaa9GG21333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21333323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2133fooEv,_ZThn8_N3aaa5EE2133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333323barEv,_ZThn20_N3aaa9GG21333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333323barEv,_ZThn28_N3aaa9GG21333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133332E[];
Class_Descriptor cd__ZN3aaa9GG2133332E = {  "_ZN3aaa9GG2133332E", // class name
  bases__ZN3aaa9GG2133332E, 6,
  &(vtc__ZN3aaa9GG2133332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2133333  : ::aaa::EE213 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG21333333fooEv
  virtual void  bar(); // _ZN3aaa9GG21333333barEv
  ~GG2133333(); // tgen
  GG2133333(); // tgen
};
//SIG(1 _ZN3aaa9GG2133333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2133333 ::foo(){vfunc_called(this, "_ZN3aaa9GG21333333fooEv");}
void  aaa::GG2133333 ::bar(){vfunc_called(this, "_ZN3aaa9GG21333333barEv");}
aaa::GG2133333 ::~GG2133333(){ note_dtor("_ZN3aaa9GG2133333E", this);} // tgen
aaa::GG2133333 ::GG2133333(){ note_ctor("_ZN3aaa9GG2133333E", this);} // tgen
}
static void Test__ZN3aaa9GG2133333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2133333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2133333E, buf);
    ::aaa::GG2133333 *dp, &lv = *(dp=new (buf) ::aaa::GG2133333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2133333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2133333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE213*), 0, "_ZN3aaa9GG2133333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE213*), ABISELECT(16,8), "_ZN3aaa9GG2133333E");
    check_base_class_offset(lv, (::aaa::EE213*), 0, "_ZN3aaa9GG2133333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2133333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2133333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2133333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2133333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2133333E);
    dp->::aaa::GG2133333::~GG2133333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2133333E(Test__ZN3aaa9GG2133333E, "_ZN3aaa9GG2133333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2133333C1Ev();
extern void _ZN3aaa9GG2133333D1Ev();
Name_Map name_map__ZN3aaa9GG2133333E[] = {
  NSPAIR(_ZN3aaa9GG2133333C1Ev),
  NSPAIR(_ZN3aaa9GG2133333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE213E;
extern VTBL_ENTRY _ZTIN3aaa5EE213E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE213E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2133333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE213E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2133333E[];
extern void _ZN3aaa9GG21333333barEv();
extern void _ZN3aaa9GG21333333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG21333333fooEv,_ZThn8_N3aaa9GG21333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333333fooEv,_ZThn20_N3aaa9GG21333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG21333333barEv,_ZThn20_N3aaa9GG21333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21333333fooEv,_ZThn28_N3aaa9GG21333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG21333333barEv,_ZThn28_N3aaa9GG21333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2133333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG21333333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG21333333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG21333333fooEv,_ZThn8_N3aaa9GG21333333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333333fooEv,_ZThn20_N3aaa9GG21333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG21333333barEv,_ZThn20_N3aaa9GG21333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333333fooEv,_ZThn28_N3aaa9GG21333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG21333333barEv,_ZThn28_N3aaa9GG21333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2133333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2133333E[];
Class_Descriptor cd__ZN3aaa9GG2133333E = {  "_ZN3aaa9GG2133333E", // class name
  bases__ZN3aaa9GG2133333E, 6,
  &(vtc__ZN3aaa9GG2133333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2133333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2133333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211111  : ::aaa::EE221 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22111113fooEv
  ~GG2211111(); // tgen
  GG2211111(); // tgen
};
//SIG(1 _ZN3aaa9GG2211111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22111113fooEv");}
aaa::GG2211111 ::~GG2211111(){ note_dtor("_ZN3aaa9GG2211111E", this);} // tgen
aaa::GG2211111 ::GG2211111(){ note_ctor("_ZN3aaa9GG2211111E", this);} // tgen
}
static void Test__ZN3aaa9GG2211111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211111E, buf);
    ::aaa::GG2211111 *dp, &lv = *(dp=new (buf) ::aaa::GG2211111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211111E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2211111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2211111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2211111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211111E);
    dp->::aaa::GG2211111::~GG2211111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211111E(Test__ZN3aaa9GG2211111E, "_ZN3aaa9GG2211111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211111C1Ev();
extern void _ZN3aaa9GG2211111D1Ev();
Name_Map name_map__ZN3aaa9GG2211111E[] = {
  NSPAIR(_ZN3aaa9GG2211111C1Ev),
  NSPAIR(_ZN3aaa9GG2211111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2211111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22111113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22111113fooEv,_ZThn20_N3aaa9GG22111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22111113fooEv,_ZThn28_N3aaa9GG22111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22111113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111113fooEv,_ZThn20_N3aaa9GG22111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22111113fooEv,_ZThn28_N3aaa9GG22111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211111E[];
Class_Descriptor cd__ZN3aaa9GG2211111E = {  "_ZN3aaa9GG2211111E", // class name
  bases__ZN3aaa9GG2211111E, 6,
  &(vtc__ZN3aaa9GG2211111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211112  : ::aaa::EE221 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22111123barEv
  ~GG2211112(); // tgen
  GG2211112(); // tgen
};
//SIG(1 _ZN3aaa9GG2211112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22111123barEv");}
aaa::GG2211112 ::~GG2211112(){ note_dtor("_ZN3aaa9GG2211112E", this);} // tgen
aaa::GG2211112 ::GG2211112(){ note_ctor("_ZN3aaa9GG2211112E", this);} // tgen
}
static void Test__ZN3aaa9GG2211112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211112E, buf);
    ::aaa::GG2211112 *dp, &lv = *(dp=new (buf) ::aaa::GG2211112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211112E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2211112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2211112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2211112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211112E);
    dp->::aaa::GG2211112::~GG2211112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211112E(Test__ZN3aaa9GG2211112E, "_ZN3aaa9GG2211112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211112C1Ev();
extern void _ZN3aaa9GG2211112D1Ev();
Name_Map name_map__ZN3aaa9GG2211112E[] = {
  NSPAIR(_ZN3aaa9GG2211112C1Ev),
  NSPAIR(_ZN3aaa9GG2211112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2211112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211112E[];
extern void _ZN3aaa9GG22111123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22111123barEv,_ZThn8_N3aaa9GG22111123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22111123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22111123barEv,_ZThn8_N3aaa9GG22111123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211112E[];
Class_Descriptor cd__ZN3aaa9GG2211112E = {  "_ZN3aaa9GG2211112E", // class name
  bases__ZN3aaa9GG2211112E, 6,
  &(vtc__ZN3aaa9GG2211112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211113  : ::aaa::EE221 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22111133fooEv
  virtual void  bar(); // _ZN3aaa9GG22111133barEv
  ~GG2211113(); // tgen
  GG2211113(); // tgen
};
//SIG(1 _ZN3aaa9GG2211113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22111133fooEv");}
void  aaa::GG2211113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22111133barEv");}
aaa::GG2211113 ::~GG2211113(){ note_dtor("_ZN3aaa9GG2211113E", this);} // tgen
aaa::GG2211113 ::GG2211113(){ note_ctor("_ZN3aaa9GG2211113E", this);} // tgen
}
static void Test__ZN3aaa9GG2211113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211113E, buf);
    ::aaa::GG2211113 *dp, &lv = *(dp=new (buf) ::aaa::GG2211113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211113E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2211113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2211113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2211113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211113E);
    dp->::aaa::GG2211113::~GG2211113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211113E(Test__ZN3aaa9GG2211113E, "_ZN3aaa9GG2211113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211113C1Ev();
extern void _ZN3aaa9GG2211113D1Ev();
Name_Map name_map__ZN3aaa9GG2211113E[] = {
  NSPAIR(_ZN3aaa9GG2211113C1Ev),
  NSPAIR(_ZN3aaa9GG2211113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2211113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211113E[];
extern void _ZN3aaa9GG22111133barEv();
extern void _ZN3aaa9GG22111133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22111133barEv,_ZThn8_N3aaa9GG22111133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22111133fooEv,_ZThn20_N3aaa9GG22111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22111133fooEv,_ZThn28_N3aaa9GG22111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22111133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22111133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22111133barEv,_ZThn8_N3aaa9GG22111133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111133fooEv,_ZThn20_N3aaa9GG22111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22111133fooEv,_ZThn28_N3aaa9GG22111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211113E[];
Class_Descriptor cd__ZN3aaa9GG2211113E = {  "_ZN3aaa9GG2211113E", // class name
  bases__ZN3aaa9GG2211113E, 6,
  &(vtc__ZN3aaa9GG2211113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211121  : ::aaa::EE221 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22111213fooEv
  ~GG2211121(); // tgen
  GG2211121(); // tgen
};
//SIG(1 _ZN3aaa9GG2211121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22111213fooEv");}
aaa::GG2211121 ::~GG2211121(){ note_dtor("_ZN3aaa9GG2211121E", this);} // tgen
aaa::GG2211121 ::GG2211121(){ note_ctor("_ZN3aaa9GG2211121E", this);} // tgen
}
static void Test__ZN3aaa9GG2211121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211121E, buf);
    ::aaa::GG2211121 *dp, &lv = *(dp=new (buf) ::aaa::GG2211121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211121E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2211121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2211121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2211121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211121E);
    dp->::aaa::GG2211121::~GG2211121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211121E(Test__ZN3aaa9GG2211121E, "_ZN3aaa9GG2211121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211121C1Ev();
extern void _ZN3aaa9GG2211121D1Ev();
Name_Map name_map__ZN3aaa9GG2211121E[] = {
  NSPAIR(_ZN3aaa9GG2211121C1Ev),
  NSPAIR(_ZN3aaa9GG2211121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2211121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22111213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22111213fooEv,_ZThn20_N3aaa9GG22111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22111213fooEv,_ZThn28_N3aaa9GG22111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22111213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111213fooEv,_ZThn20_N3aaa9GG22111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22111213fooEv,_ZThn28_N3aaa9GG22111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211121E[];
Class_Descriptor cd__ZN3aaa9GG2211121E = {  "_ZN3aaa9GG2211121E", // class name
  bases__ZN3aaa9GG2211121E, 6,
  &(vtc__ZN3aaa9GG2211121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211122  : ::aaa::EE221 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22111223barEv
  ~GG2211122(); // tgen
  GG2211122(); // tgen
};
//SIG(1 _ZN3aaa9GG2211122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22111223barEv");}
aaa::GG2211122 ::~GG2211122(){ note_dtor("_ZN3aaa9GG2211122E", this);} // tgen
aaa::GG2211122 ::GG2211122(){ note_ctor("_ZN3aaa9GG2211122E", this);} // tgen
}
static void Test__ZN3aaa9GG2211122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211122E, buf);
    ::aaa::GG2211122 *dp, &lv = *(dp=new (buf) ::aaa::GG2211122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211122E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2211122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2211122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2211122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211122E);
    dp->::aaa::GG2211122::~GG2211122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211122E(Test__ZN3aaa9GG2211122E, "_ZN3aaa9GG2211122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211122C1Ev();
extern void _ZN3aaa9GG2211122D1Ev();
Name_Map name_map__ZN3aaa9GG2211122E[] = {
  NSPAIR(_ZN3aaa9GG2211122C1Ev),
  NSPAIR(_ZN3aaa9GG2211122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2211122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211122E[];
extern void _ZN3aaa9GG22111223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22111223barEv,_ZThn8_N3aaa9GG22111223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22111223barEv,_ZThn20_N3aaa9GG22111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22111223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22111223barEv,_ZThn8_N3aaa9GG22111223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111223barEv,_ZThn20_N3aaa9GG22111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211122E[];
Class_Descriptor cd__ZN3aaa9GG2211122E = {  "_ZN3aaa9GG2211122E", // class name
  bases__ZN3aaa9GG2211122E, 6,
  &(vtc__ZN3aaa9GG2211122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211123  : ::aaa::EE221 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22111233fooEv
  virtual void  bar(); // _ZN3aaa9GG22111233barEv
  ~GG2211123(); // tgen
  GG2211123(); // tgen
};
//SIG(1 _ZN3aaa9GG2211123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22111233fooEv");}
void  aaa::GG2211123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22111233barEv");}
aaa::GG2211123 ::~GG2211123(){ note_dtor("_ZN3aaa9GG2211123E", this);} // tgen
aaa::GG2211123 ::GG2211123(){ note_ctor("_ZN3aaa9GG2211123E", this);} // tgen
}
static void Test__ZN3aaa9GG2211123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211123E, buf);
    ::aaa::GG2211123 *dp, &lv = *(dp=new (buf) ::aaa::GG2211123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211123E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2211123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2211123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2211123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211123E);
    dp->::aaa::GG2211123::~GG2211123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211123E(Test__ZN3aaa9GG2211123E, "_ZN3aaa9GG2211123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211123C1Ev();
extern void _ZN3aaa9GG2211123D1Ev();
Name_Map name_map__ZN3aaa9GG2211123E[] = {
  NSPAIR(_ZN3aaa9GG2211123C1Ev),
  NSPAIR(_ZN3aaa9GG2211123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2211123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211123E[];
extern void _ZN3aaa9GG22111233barEv();
extern void _ZN3aaa9GG22111233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22111233barEv,_ZThn8_N3aaa9GG22111233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22111233fooEv,_ZThn20_N3aaa9GG22111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22111233barEv,_ZThn20_N3aaa9GG22111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22111233fooEv,_ZThn28_N3aaa9GG22111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22111233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22111233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22111233barEv,_ZThn8_N3aaa9GG22111233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111233fooEv,_ZThn20_N3aaa9GG22111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111233barEv,_ZThn20_N3aaa9GG22111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22111233fooEv,_ZThn28_N3aaa9GG22111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211123E[];
Class_Descriptor cd__ZN3aaa9GG2211123E = {  "_ZN3aaa9GG2211123E", // class name
  bases__ZN3aaa9GG2211123E, 6,
  &(vtc__ZN3aaa9GG2211123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211131  : ::aaa::EE221 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22111313fooEv
  ~GG2211131(); // tgen
  GG2211131(); // tgen
};
//SIG(1 _ZN3aaa9GG2211131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22111313fooEv");}
aaa::GG2211131 ::~GG2211131(){ note_dtor("_ZN3aaa9GG2211131E", this);} // tgen
aaa::GG2211131 ::GG2211131(){ note_ctor("_ZN3aaa9GG2211131E", this);} // tgen
}
static void Test__ZN3aaa9GG2211131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211131E, buf);
    ::aaa::GG2211131 *dp, &lv = *(dp=new (buf) ::aaa::GG2211131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211131E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2211131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2211131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2211131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211131E);
    dp->::aaa::GG2211131::~GG2211131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211131E(Test__ZN3aaa9GG2211131E, "_ZN3aaa9GG2211131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211131C1Ev();
extern void _ZN3aaa9GG2211131D1Ev();
Name_Map name_map__ZN3aaa9GG2211131E[] = {
  NSPAIR(_ZN3aaa9GG2211131C1Ev),
  NSPAIR(_ZN3aaa9GG2211131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2211131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22111313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22111313fooEv,_ZThn20_N3aaa9GG22111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22111313fooEv,_ZThn28_N3aaa9GG22111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22111313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111313fooEv,_ZThn20_N3aaa9GG22111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22111313fooEv,_ZThn28_N3aaa9GG22111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211131E[];
Class_Descriptor cd__ZN3aaa9GG2211131E = {  "_ZN3aaa9GG2211131E", // class name
  bases__ZN3aaa9GG2211131E, 6,
  &(vtc__ZN3aaa9GG2211131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211132  : ::aaa::EE221 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22111323barEv
  ~GG2211132(); // tgen
  GG2211132(); // tgen
};
//SIG(1 _ZN3aaa9GG2211132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22111323barEv");}
aaa::GG2211132 ::~GG2211132(){ note_dtor("_ZN3aaa9GG2211132E", this);} // tgen
aaa::GG2211132 ::GG2211132(){ note_ctor("_ZN3aaa9GG2211132E", this);} // tgen
}
static void Test__ZN3aaa9GG2211132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211132E, buf);
    ::aaa::GG2211132 *dp, &lv = *(dp=new (buf) ::aaa::GG2211132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211132E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2211132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2211132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2211132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211132E);
    dp->::aaa::GG2211132::~GG2211132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211132E(Test__ZN3aaa9GG2211132E, "_ZN3aaa9GG2211132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211132C1Ev();
extern void _ZN3aaa9GG2211132D1Ev();
Name_Map name_map__ZN3aaa9GG2211132E[] = {
  NSPAIR(_ZN3aaa9GG2211132C1Ev),
  NSPAIR(_ZN3aaa9GG2211132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2211132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211132E[];
extern void _ZN3aaa9GG22111323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22111323barEv,_ZThn8_N3aaa9GG22111323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22111323barEv,_ZThn20_N3aaa9GG22111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22111323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22111323barEv,_ZThn8_N3aaa9GG22111323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111323barEv,_ZThn20_N3aaa9GG22111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211132E[];
Class_Descriptor cd__ZN3aaa9GG2211132E = {  "_ZN3aaa9GG2211132E", // class name
  bases__ZN3aaa9GG2211132E, 6,
  &(vtc__ZN3aaa9GG2211132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211133  : ::aaa::EE221 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22111333fooEv
  virtual void  bar(); // _ZN3aaa9GG22111333barEv
  ~GG2211133(); // tgen
  GG2211133(); // tgen
};
//SIG(1 _ZN3aaa9GG2211133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22111333fooEv");}
void  aaa::GG2211133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22111333barEv");}
aaa::GG2211133 ::~GG2211133(){ note_dtor("_ZN3aaa9GG2211133E", this);} // tgen
aaa::GG2211133 ::GG2211133(){ note_ctor("_ZN3aaa9GG2211133E", this);} // tgen
}
static void Test__ZN3aaa9GG2211133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211133E, buf);
    ::aaa::GG2211133 *dp, &lv = *(dp=new (buf) ::aaa::GG2211133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211133E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2211133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2211133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2211133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211133E);
    dp->::aaa::GG2211133::~GG2211133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211133E(Test__ZN3aaa9GG2211133E, "_ZN3aaa9GG2211133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211133C1Ev();
extern void _ZN3aaa9GG2211133D1Ev();
Name_Map name_map__ZN3aaa9GG2211133E[] = {
  NSPAIR(_ZN3aaa9GG2211133C1Ev),
  NSPAIR(_ZN3aaa9GG2211133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2211133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211133E[];
extern void _ZN3aaa9GG22111333barEv();
extern void _ZN3aaa9GG22111333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22111333barEv,_ZThn8_N3aaa9GG22111333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22111333fooEv,_ZThn20_N3aaa9GG22111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22111333barEv,_ZThn20_N3aaa9GG22111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22111333fooEv,_ZThn28_N3aaa9GG22111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22111333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22111333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22111333barEv,_ZThn8_N3aaa9GG22111333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111333fooEv,_ZThn20_N3aaa9GG22111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22111333barEv,_ZThn20_N3aaa9GG22111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22111333fooEv,_ZThn28_N3aaa9GG22111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211133E[];
Class_Descriptor cd__ZN3aaa9GG2211133E = {  "_ZN3aaa9GG2211133E", // class name
  bases__ZN3aaa9GG2211133E, 6,
  &(vtc__ZN3aaa9GG2211133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211211  : ::aaa::EE221 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22112113fooEv
  ~GG2211211(); // tgen
  GG2211211(); // tgen
};
//SIG(1 _ZN3aaa9GG2211211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22112113fooEv");}
aaa::GG2211211 ::~GG2211211(){ note_dtor("_ZN3aaa9GG2211211E", this);} // tgen
aaa::GG2211211 ::GG2211211(){ note_ctor("_ZN3aaa9GG2211211E", this);} // tgen
}
static void Test__ZN3aaa9GG2211211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211211E, buf);
    ::aaa::GG2211211 *dp, &lv = *(dp=new (buf) ::aaa::GG2211211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211211E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2211211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2211211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2211211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211211E);
    dp->::aaa::GG2211211::~GG2211211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211211E(Test__ZN3aaa9GG2211211E, "_ZN3aaa9GG2211211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211211C1Ev();
extern void _ZN3aaa9GG2211211D1Ev();
Name_Map name_map__ZN3aaa9GG2211211E[] = {
  NSPAIR(_ZN3aaa9GG2211211C1Ev),
  NSPAIR(_ZN3aaa9GG2211211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2211211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22112113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22112113fooEv,_ZThn20_N3aaa9GG22112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22112113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112113fooEv,_ZThn20_N3aaa9GG22112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211211E[];
Class_Descriptor cd__ZN3aaa9GG2211211E = {  "_ZN3aaa9GG2211211E", // class name
  bases__ZN3aaa9GG2211211E, 6,
  &(vtc__ZN3aaa9GG2211211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211212  : ::aaa::EE221 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22112123barEv
  ~GG2211212(); // tgen
  GG2211212(); // tgen
};
//SIG(1 _ZN3aaa9GG2211212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22112123barEv");}
aaa::GG2211212 ::~GG2211212(){ note_dtor("_ZN3aaa9GG2211212E", this);} // tgen
aaa::GG2211212 ::GG2211212(){ note_ctor("_ZN3aaa9GG2211212E", this);} // tgen
}
static void Test__ZN3aaa9GG2211212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211212E, buf);
    ::aaa::GG2211212 *dp, &lv = *(dp=new (buf) ::aaa::GG2211212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211212E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2211212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2211212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2211212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211212E);
    dp->::aaa::GG2211212::~GG2211212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211212E(Test__ZN3aaa9GG2211212E, "_ZN3aaa9GG2211212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211212C1Ev();
extern void _ZN3aaa9GG2211212D1Ev();
Name_Map name_map__ZN3aaa9GG2211212E[] = {
  NSPAIR(_ZN3aaa9GG2211212C1Ev),
  NSPAIR(_ZN3aaa9GG2211212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2211212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211212E[];
extern void _ZN3aaa9GG22112123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22112123barEv,_ZThn8_N3aaa9GG22112123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22112123barEv,_ZThn28_N3aaa9GG22112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22112123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22112123barEv,_ZThn8_N3aaa9GG22112123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22112123barEv,_ZThn28_N3aaa9GG22112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211212E[];
Class_Descriptor cd__ZN3aaa9GG2211212E = {  "_ZN3aaa9GG2211212E", // class name
  bases__ZN3aaa9GG2211212E, 6,
  &(vtc__ZN3aaa9GG2211212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211213  : ::aaa::EE221 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22112133fooEv
  virtual void  bar(); // _ZN3aaa9GG22112133barEv
  ~GG2211213(); // tgen
  GG2211213(); // tgen
};
//SIG(1 _ZN3aaa9GG2211213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22112133fooEv");}
void  aaa::GG2211213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22112133barEv");}
aaa::GG2211213 ::~GG2211213(){ note_dtor("_ZN3aaa9GG2211213E", this);} // tgen
aaa::GG2211213 ::GG2211213(){ note_ctor("_ZN3aaa9GG2211213E", this);} // tgen
}
static void Test__ZN3aaa9GG2211213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211213E, buf);
    ::aaa::GG2211213 *dp, &lv = *(dp=new (buf) ::aaa::GG2211213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211213E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2211213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2211213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2211213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211213E);
    dp->::aaa::GG2211213::~GG2211213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211213E(Test__ZN3aaa9GG2211213E, "_ZN3aaa9GG2211213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211213C1Ev();
extern void _ZN3aaa9GG2211213D1Ev();
Name_Map name_map__ZN3aaa9GG2211213E[] = {
  NSPAIR(_ZN3aaa9GG2211213C1Ev),
  NSPAIR(_ZN3aaa9GG2211213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2211213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211213E[];
extern void _ZN3aaa9GG22112133barEv();
extern void _ZN3aaa9GG22112133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22112133barEv,_ZThn8_N3aaa9GG22112133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22112133fooEv,_ZThn20_N3aaa9GG22112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22112133barEv,_ZThn28_N3aaa9GG22112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22112133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22112133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22112133barEv,_ZThn8_N3aaa9GG22112133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112133fooEv,_ZThn20_N3aaa9GG22112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22112133barEv,_ZThn28_N3aaa9GG22112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211213E[];
Class_Descriptor cd__ZN3aaa9GG2211213E = {  "_ZN3aaa9GG2211213E", // class name
  bases__ZN3aaa9GG2211213E, 6,
  &(vtc__ZN3aaa9GG2211213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211221  : ::aaa::EE221 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22112213fooEv
  ~GG2211221(); // tgen
  GG2211221(); // tgen
};
//SIG(1 _ZN3aaa9GG2211221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22112213fooEv");}
aaa::GG2211221 ::~GG2211221(){ note_dtor("_ZN3aaa9GG2211221E", this);} // tgen
aaa::GG2211221 ::GG2211221(){ note_ctor("_ZN3aaa9GG2211221E", this);} // tgen
}
static void Test__ZN3aaa9GG2211221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211221E, buf);
    ::aaa::GG2211221 *dp, &lv = *(dp=new (buf) ::aaa::GG2211221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211221E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2211221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2211221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2211221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211221E);
    dp->::aaa::GG2211221::~GG2211221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211221E(Test__ZN3aaa9GG2211221E, "_ZN3aaa9GG2211221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211221C1Ev();
extern void _ZN3aaa9GG2211221D1Ev();
Name_Map name_map__ZN3aaa9GG2211221E[] = {
  NSPAIR(_ZN3aaa9GG2211221C1Ev),
  NSPAIR(_ZN3aaa9GG2211221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2211221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22112213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22112213fooEv,_ZThn20_N3aaa9GG22112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22112213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112213fooEv,_ZThn20_N3aaa9GG22112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211221E[];
Class_Descriptor cd__ZN3aaa9GG2211221E = {  "_ZN3aaa9GG2211221E", // class name
  bases__ZN3aaa9GG2211221E, 6,
  &(vtc__ZN3aaa9GG2211221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211222  : ::aaa::EE221 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22112223barEv
  ~GG2211222(); // tgen
  GG2211222(); // tgen
};
//SIG(1 _ZN3aaa9GG2211222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22112223barEv");}
aaa::GG2211222 ::~GG2211222(){ note_dtor("_ZN3aaa9GG2211222E", this);} // tgen
aaa::GG2211222 ::GG2211222(){ note_ctor("_ZN3aaa9GG2211222E", this);} // tgen
}
static void Test__ZN3aaa9GG2211222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211222E, buf);
    ::aaa::GG2211222 *dp, &lv = *(dp=new (buf) ::aaa::GG2211222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211222E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2211222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2211222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2211222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211222E);
    dp->::aaa::GG2211222::~GG2211222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211222E(Test__ZN3aaa9GG2211222E, "_ZN3aaa9GG2211222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211222C1Ev();
extern void _ZN3aaa9GG2211222D1Ev();
Name_Map name_map__ZN3aaa9GG2211222E[] = {
  NSPAIR(_ZN3aaa9GG2211222C1Ev),
  NSPAIR(_ZN3aaa9GG2211222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2211222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211222E[];
extern void _ZN3aaa9GG22112223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22112223barEv,_ZThn8_N3aaa9GG22112223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22112223barEv,_ZThn20_N3aaa9GG22112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22112223barEv,_ZThn28_N3aaa9GG22112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22112223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22112223barEv,_ZThn8_N3aaa9GG22112223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112223barEv,_ZThn20_N3aaa9GG22112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22112223barEv,_ZThn28_N3aaa9GG22112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211222E[];
Class_Descriptor cd__ZN3aaa9GG2211222E = {  "_ZN3aaa9GG2211222E", // class name
  bases__ZN3aaa9GG2211222E, 6,
  &(vtc__ZN3aaa9GG2211222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211223  : ::aaa::EE221 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22112233fooEv
  virtual void  bar(); // _ZN3aaa9GG22112233barEv
  ~GG2211223(); // tgen
  GG2211223(); // tgen
};
//SIG(1 _ZN3aaa9GG2211223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22112233fooEv");}
void  aaa::GG2211223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22112233barEv");}
aaa::GG2211223 ::~GG2211223(){ note_dtor("_ZN3aaa9GG2211223E", this);} // tgen
aaa::GG2211223 ::GG2211223(){ note_ctor("_ZN3aaa9GG2211223E", this);} // tgen
}
static void Test__ZN3aaa9GG2211223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211223E, buf);
    ::aaa::GG2211223 *dp, &lv = *(dp=new (buf) ::aaa::GG2211223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211223E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2211223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2211223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2211223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211223E);
    dp->::aaa::GG2211223::~GG2211223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211223E(Test__ZN3aaa9GG2211223E, "_ZN3aaa9GG2211223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211223C1Ev();
extern void _ZN3aaa9GG2211223D1Ev();
Name_Map name_map__ZN3aaa9GG2211223E[] = {
  NSPAIR(_ZN3aaa9GG2211223C1Ev),
  NSPAIR(_ZN3aaa9GG2211223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2211223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211223E[];
extern void _ZN3aaa9GG22112233barEv();
extern void _ZN3aaa9GG22112233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22112233barEv,_ZThn8_N3aaa9GG22112233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22112233fooEv,_ZThn20_N3aaa9GG22112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22112233barEv,_ZThn20_N3aaa9GG22112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22112233barEv,_ZThn28_N3aaa9GG22112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22112233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22112233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22112233barEv,_ZThn8_N3aaa9GG22112233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112233fooEv,_ZThn20_N3aaa9GG22112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112233barEv,_ZThn20_N3aaa9GG22112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22112233barEv,_ZThn28_N3aaa9GG22112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211223E[];
Class_Descriptor cd__ZN3aaa9GG2211223E = {  "_ZN3aaa9GG2211223E", // class name
  bases__ZN3aaa9GG2211223E, 6,
  &(vtc__ZN3aaa9GG2211223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211231  : ::aaa::EE221 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22112313fooEv
  ~GG2211231(); // tgen
  GG2211231(); // tgen
};
//SIG(1 _ZN3aaa9GG2211231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22112313fooEv");}
aaa::GG2211231 ::~GG2211231(){ note_dtor("_ZN3aaa9GG2211231E", this);} // tgen
aaa::GG2211231 ::GG2211231(){ note_ctor("_ZN3aaa9GG2211231E", this);} // tgen
}
static void Test__ZN3aaa9GG2211231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211231E, buf);
    ::aaa::GG2211231 *dp, &lv = *(dp=new (buf) ::aaa::GG2211231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211231E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2211231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2211231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2211231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211231E);
    dp->::aaa::GG2211231::~GG2211231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211231E(Test__ZN3aaa9GG2211231E, "_ZN3aaa9GG2211231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211231C1Ev();
extern void _ZN3aaa9GG2211231D1Ev();
Name_Map name_map__ZN3aaa9GG2211231E[] = {
  NSPAIR(_ZN3aaa9GG2211231C1Ev),
  NSPAIR(_ZN3aaa9GG2211231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2211231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22112313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22112313fooEv,_ZThn20_N3aaa9GG22112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22112313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112313fooEv,_ZThn20_N3aaa9GG22112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211231E[];
Class_Descriptor cd__ZN3aaa9GG2211231E = {  "_ZN3aaa9GG2211231E", // class name
  bases__ZN3aaa9GG2211231E, 6,
  &(vtc__ZN3aaa9GG2211231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211232  : ::aaa::EE221 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22112323barEv
  ~GG2211232(); // tgen
  GG2211232(); // tgen
};
//SIG(1 _ZN3aaa9GG2211232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22112323barEv");}
aaa::GG2211232 ::~GG2211232(){ note_dtor("_ZN3aaa9GG2211232E", this);} // tgen
aaa::GG2211232 ::GG2211232(){ note_ctor("_ZN3aaa9GG2211232E", this);} // tgen
}
static void Test__ZN3aaa9GG2211232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211232E, buf);
    ::aaa::GG2211232 *dp, &lv = *(dp=new (buf) ::aaa::GG2211232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211232E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2211232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2211232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2211232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211232E);
    dp->::aaa::GG2211232::~GG2211232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211232E(Test__ZN3aaa9GG2211232E, "_ZN3aaa9GG2211232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211232C1Ev();
extern void _ZN3aaa9GG2211232D1Ev();
Name_Map name_map__ZN3aaa9GG2211232E[] = {
  NSPAIR(_ZN3aaa9GG2211232C1Ev),
  NSPAIR(_ZN3aaa9GG2211232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2211232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211232E[];
extern void _ZN3aaa9GG22112323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22112323barEv,_ZThn8_N3aaa9GG22112323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22112323barEv,_ZThn20_N3aaa9GG22112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22112323barEv,_ZThn28_N3aaa9GG22112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22112323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22112323barEv,_ZThn8_N3aaa9GG22112323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112323barEv,_ZThn20_N3aaa9GG22112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22112323barEv,_ZThn28_N3aaa9GG22112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211232E[];
Class_Descriptor cd__ZN3aaa9GG2211232E = {  "_ZN3aaa9GG2211232E", // class name
  bases__ZN3aaa9GG2211232E, 6,
  &(vtc__ZN3aaa9GG2211232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211233  : ::aaa::EE221 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22112333fooEv
  virtual void  bar(); // _ZN3aaa9GG22112333barEv
  ~GG2211233(); // tgen
  GG2211233(); // tgen
};
//SIG(1 _ZN3aaa9GG2211233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22112333fooEv");}
void  aaa::GG2211233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22112333barEv");}
aaa::GG2211233 ::~GG2211233(){ note_dtor("_ZN3aaa9GG2211233E", this);} // tgen
aaa::GG2211233 ::GG2211233(){ note_ctor("_ZN3aaa9GG2211233E", this);} // tgen
}
static void Test__ZN3aaa9GG2211233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211233E, buf);
    ::aaa::GG2211233 *dp, &lv = *(dp=new (buf) ::aaa::GG2211233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211233E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2211233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2211233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2211233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211233E);
    dp->::aaa::GG2211233::~GG2211233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211233E(Test__ZN3aaa9GG2211233E, "_ZN3aaa9GG2211233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211233C1Ev();
extern void _ZN3aaa9GG2211233D1Ev();
Name_Map name_map__ZN3aaa9GG2211233E[] = {
  NSPAIR(_ZN3aaa9GG2211233C1Ev),
  NSPAIR(_ZN3aaa9GG2211233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2211233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211233E[];
extern void _ZN3aaa9GG22112333barEv();
extern void _ZN3aaa9GG22112333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22112333barEv,_ZThn8_N3aaa9GG22112333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22112333fooEv,_ZThn20_N3aaa9GG22112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22112333barEv,_ZThn20_N3aaa9GG22112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22112333barEv,_ZThn28_N3aaa9GG22112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22112333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22112333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22112333barEv,_ZThn8_N3aaa9GG22112333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112333fooEv,_ZThn20_N3aaa9GG22112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22112333barEv,_ZThn20_N3aaa9GG22112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22112333barEv,_ZThn28_N3aaa9GG22112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211233E[];
Class_Descriptor cd__ZN3aaa9GG2211233E = {  "_ZN3aaa9GG2211233E", // class name
  bases__ZN3aaa9GG2211233E, 6,
  &(vtc__ZN3aaa9GG2211233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211311  : ::aaa::EE221 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22113113fooEv
  ~GG2211311(); // tgen
  GG2211311(); // tgen
};
//SIG(1 _ZN3aaa9GG2211311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22113113fooEv");}
aaa::GG2211311 ::~GG2211311(){ note_dtor("_ZN3aaa9GG2211311E", this);} // tgen
aaa::GG2211311 ::GG2211311(){ note_ctor("_ZN3aaa9GG2211311E", this);} // tgen
}
static void Test__ZN3aaa9GG2211311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211311E, buf);
    ::aaa::GG2211311 *dp, &lv = *(dp=new (buf) ::aaa::GG2211311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211311E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2211311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2211311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2211311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211311E);
    dp->::aaa::GG2211311::~GG2211311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211311E(Test__ZN3aaa9GG2211311E, "_ZN3aaa9GG2211311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211311C1Ev();
extern void _ZN3aaa9GG2211311D1Ev();
Name_Map name_map__ZN3aaa9GG2211311E[] = {
  NSPAIR(_ZN3aaa9GG2211311C1Ev),
  NSPAIR(_ZN3aaa9GG2211311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2211311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22113113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22113113fooEv,_ZThn20_N3aaa9GG22113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113113fooEv,_ZThn28_N3aaa9GG22113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22113113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113113fooEv,_ZThn20_N3aaa9GG22113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113113fooEv,_ZThn28_N3aaa9GG22113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211311E[];
Class_Descriptor cd__ZN3aaa9GG2211311E = {  "_ZN3aaa9GG2211311E", // class name
  bases__ZN3aaa9GG2211311E, 6,
  &(vtc__ZN3aaa9GG2211311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211312  : ::aaa::EE221 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22113123barEv
  ~GG2211312(); // tgen
  GG2211312(); // tgen
};
//SIG(1 _ZN3aaa9GG2211312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22113123barEv");}
aaa::GG2211312 ::~GG2211312(){ note_dtor("_ZN3aaa9GG2211312E", this);} // tgen
aaa::GG2211312 ::GG2211312(){ note_ctor("_ZN3aaa9GG2211312E", this);} // tgen
}
static void Test__ZN3aaa9GG2211312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211312E, buf);
    ::aaa::GG2211312 *dp, &lv = *(dp=new (buf) ::aaa::GG2211312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211312E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2211312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2211312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2211312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211312E);
    dp->::aaa::GG2211312::~GG2211312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211312E(Test__ZN3aaa9GG2211312E, "_ZN3aaa9GG2211312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211312C1Ev();
extern void _ZN3aaa9GG2211312D1Ev();
Name_Map name_map__ZN3aaa9GG2211312E[] = {
  NSPAIR(_ZN3aaa9GG2211312C1Ev),
  NSPAIR(_ZN3aaa9GG2211312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2211312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211312E[];
extern void _ZN3aaa9GG22113123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22113123barEv,_ZThn8_N3aaa9GG22113123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113123barEv,_ZThn28_N3aaa9GG22113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22113123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22113123barEv,_ZThn8_N3aaa9GG22113123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113123barEv,_ZThn28_N3aaa9GG22113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211312E[];
Class_Descriptor cd__ZN3aaa9GG2211312E = {  "_ZN3aaa9GG2211312E", // class name
  bases__ZN3aaa9GG2211312E, 6,
  &(vtc__ZN3aaa9GG2211312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211313  : ::aaa::EE221 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22113133fooEv
  virtual void  bar(); // _ZN3aaa9GG22113133barEv
  ~GG2211313(); // tgen
  GG2211313(); // tgen
};
//SIG(1 _ZN3aaa9GG2211313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22113133fooEv");}
void  aaa::GG2211313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22113133barEv");}
aaa::GG2211313 ::~GG2211313(){ note_dtor("_ZN3aaa9GG2211313E", this);} // tgen
aaa::GG2211313 ::GG2211313(){ note_ctor("_ZN3aaa9GG2211313E", this);} // tgen
}
static void Test__ZN3aaa9GG2211313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211313E, buf);
    ::aaa::GG2211313 *dp, &lv = *(dp=new (buf) ::aaa::GG2211313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211313E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2211313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2211313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2211313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211313E);
    dp->::aaa::GG2211313::~GG2211313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211313E(Test__ZN3aaa9GG2211313E, "_ZN3aaa9GG2211313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211313C1Ev();
extern void _ZN3aaa9GG2211313D1Ev();
Name_Map name_map__ZN3aaa9GG2211313E[] = {
  NSPAIR(_ZN3aaa9GG2211313C1Ev),
  NSPAIR(_ZN3aaa9GG2211313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2211313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211313E[];
extern void _ZN3aaa9GG22113133barEv();
extern void _ZN3aaa9GG22113133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22113133barEv,_ZThn8_N3aaa9GG22113133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22113133fooEv,_ZThn20_N3aaa9GG22113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113133fooEv,_ZThn28_N3aaa9GG22113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113133barEv,_ZThn28_N3aaa9GG22113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22113133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22113133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22113133barEv,_ZThn8_N3aaa9GG22113133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113133fooEv,_ZThn20_N3aaa9GG22113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113133fooEv,_ZThn28_N3aaa9GG22113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113133barEv,_ZThn28_N3aaa9GG22113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211313E[];
Class_Descriptor cd__ZN3aaa9GG2211313E = {  "_ZN3aaa9GG2211313E", // class name
  bases__ZN3aaa9GG2211313E, 6,
  &(vtc__ZN3aaa9GG2211313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211321  : ::aaa::EE221 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22113213fooEv
  ~GG2211321(); // tgen
  GG2211321(); // tgen
};
//SIG(1 _ZN3aaa9GG2211321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22113213fooEv");}
aaa::GG2211321 ::~GG2211321(){ note_dtor("_ZN3aaa9GG2211321E", this);} // tgen
aaa::GG2211321 ::GG2211321(){ note_ctor("_ZN3aaa9GG2211321E", this);} // tgen
}
static void Test__ZN3aaa9GG2211321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211321E, buf);
    ::aaa::GG2211321 *dp, &lv = *(dp=new (buf) ::aaa::GG2211321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211321E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2211321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2211321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2211321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211321E);
    dp->::aaa::GG2211321::~GG2211321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211321E(Test__ZN3aaa9GG2211321E, "_ZN3aaa9GG2211321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211321C1Ev();
extern void _ZN3aaa9GG2211321D1Ev();
Name_Map name_map__ZN3aaa9GG2211321E[] = {
  NSPAIR(_ZN3aaa9GG2211321C1Ev),
  NSPAIR(_ZN3aaa9GG2211321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2211321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22113213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22113213fooEv,_ZThn20_N3aaa9GG22113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22113213fooEv,_ZThn28_N3aaa9GG22113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22113213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113213fooEv,_ZThn20_N3aaa9GG22113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113213fooEv,_ZThn28_N3aaa9GG22113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211321E[];
Class_Descriptor cd__ZN3aaa9GG2211321E = {  "_ZN3aaa9GG2211321E", // class name
  bases__ZN3aaa9GG2211321E, 6,
  &(vtc__ZN3aaa9GG2211321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211322  : ::aaa::EE221 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22113223barEv
  ~GG2211322(); // tgen
  GG2211322(); // tgen
};
//SIG(1 _ZN3aaa9GG2211322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22113223barEv");}
aaa::GG2211322 ::~GG2211322(){ note_dtor("_ZN3aaa9GG2211322E", this);} // tgen
aaa::GG2211322 ::GG2211322(){ note_ctor("_ZN3aaa9GG2211322E", this);} // tgen
}
static void Test__ZN3aaa9GG2211322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211322E, buf);
    ::aaa::GG2211322 *dp, &lv = *(dp=new (buf) ::aaa::GG2211322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211322E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2211322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2211322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2211322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211322E);
    dp->::aaa::GG2211322::~GG2211322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211322E(Test__ZN3aaa9GG2211322E, "_ZN3aaa9GG2211322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211322C1Ev();
extern void _ZN3aaa9GG2211322D1Ev();
Name_Map name_map__ZN3aaa9GG2211322E[] = {
  NSPAIR(_ZN3aaa9GG2211322C1Ev),
  NSPAIR(_ZN3aaa9GG2211322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2211322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211322E[];
extern void _ZN3aaa9GG22113223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22113223barEv,_ZThn8_N3aaa9GG22113223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22113223barEv,_ZThn20_N3aaa9GG22113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22113223barEv,_ZThn28_N3aaa9GG22113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22113223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22113223barEv,_ZThn8_N3aaa9GG22113223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113223barEv,_ZThn20_N3aaa9GG22113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113223barEv,_ZThn28_N3aaa9GG22113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211322E[];
Class_Descriptor cd__ZN3aaa9GG2211322E = {  "_ZN3aaa9GG2211322E", // class name
  bases__ZN3aaa9GG2211322E, 6,
  &(vtc__ZN3aaa9GG2211322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211323  : ::aaa::EE221 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22113233fooEv
  virtual void  bar(); // _ZN3aaa9GG22113233barEv
  ~GG2211323(); // tgen
  GG2211323(); // tgen
};
//SIG(1 _ZN3aaa9GG2211323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22113233fooEv");}
void  aaa::GG2211323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22113233barEv");}
aaa::GG2211323 ::~GG2211323(){ note_dtor("_ZN3aaa9GG2211323E", this);} // tgen
aaa::GG2211323 ::GG2211323(){ note_ctor("_ZN3aaa9GG2211323E", this);} // tgen
}
static void Test__ZN3aaa9GG2211323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211323E, buf);
    ::aaa::GG2211323 *dp, &lv = *(dp=new (buf) ::aaa::GG2211323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211323E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2211323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2211323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2211323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211323E);
    dp->::aaa::GG2211323::~GG2211323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211323E(Test__ZN3aaa9GG2211323E, "_ZN3aaa9GG2211323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211323C1Ev();
extern void _ZN3aaa9GG2211323D1Ev();
Name_Map name_map__ZN3aaa9GG2211323E[] = {
  NSPAIR(_ZN3aaa9GG2211323C1Ev),
  NSPAIR(_ZN3aaa9GG2211323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2211323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211323E[];
extern void _ZN3aaa9GG22113233barEv();
extern void _ZN3aaa9GG22113233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22113233barEv,_ZThn8_N3aaa9GG22113233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22113233fooEv,_ZThn20_N3aaa9GG22113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22113233barEv,_ZThn20_N3aaa9GG22113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113233fooEv,_ZThn28_N3aaa9GG22113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113233barEv,_ZThn28_N3aaa9GG22113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22113233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22113233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22113233barEv,_ZThn8_N3aaa9GG22113233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113233fooEv,_ZThn20_N3aaa9GG22113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113233barEv,_ZThn20_N3aaa9GG22113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113233fooEv,_ZThn28_N3aaa9GG22113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113233barEv,_ZThn28_N3aaa9GG22113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211323E[];
Class_Descriptor cd__ZN3aaa9GG2211323E = {  "_ZN3aaa9GG2211323E", // class name
  bases__ZN3aaa9GG2211323E, 6,
  &(vtc__ZN3aaa9GG2211323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211331  : ::aaa::EE221 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22113313fooEv
  ~GG2211331(); // tgen
  GG2211331(); // tgen
};
//SIG(1 _ZN3aaa9GG2211331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22113313fooEv");}
aaa::GG2211331 ::~GG2211331(){ note_dtor("_ZN3aaa9GG2211331E", this);} // tgen
aaa::GG2211331 ::GG2211331(){ note_ctor("_ZN3aaa9GG2211331E", this);} // tgen
}
static void Test__ZN3aaa9GG2211331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211331E, buf);
    ::aaa::GG2211331 *dp, &lv = *(dp=new (buf) ::aaa::GG2211331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211331E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2211331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2211331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2211331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211331E);
    dp->::aaa::GG2211331::~GG2211331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211331E(Test__ZN3aaa9GG2211331E, "_ZN3aaa9GG2211331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211331C1Ev();
extern void _ZN3aaa9GG2211331D1Ev();
Name_Map name_map__ZN3aaa9GG2211331E[] = {
  NSPAIR(_ZN3aaa9GG2211331C1Ev),
  NSPAIR(_ZN3aaa9GG2211331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2211331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22113313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22113313fooEv,_ZThn20_N3aaa9GG22113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22113313fooEv,_ZThn28_N3aaa9GG22113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22113313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113313fooEv,_ZThn20_N3aaa9GG22113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113313fooEv,_ZThn28_N3aaa9GG22113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211331E[];
Class_Descriptor cd__ZN3aaa9GG2211331E = {  "_ZN3aaa9GG2211331E", // class name
  bases__ZN3aaa9GG2211331E, 6,
  &(vtc__ZN3aaa9GG2211331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211332  : ::aaa::EE221 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22113323barEv
  ~GG2211332(); // tgen
  GG2211332(); // tgen
};
//SIG(1 _ZN3aaa9GG2211332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2211332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22113323barEv");}
aaa::GG2211332 ::~GG2211332(){ note_dtor("_ZN3aaa9GG2211332E", this);} // tgen
aaa::GG2211332 ::GG2211332(){ note_ctor("_ZN3aaa9GG2211332E", this);} // tgen
}
static void Test__ZN3aaa9GG2211332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211332E, buf);
    ::aaa::GG2211332 *dp, &lv = *(dp=new (buf) ::aaa::GG2211332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211332E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2211332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2211332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2211332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211332E);
    dp->::aaa::GG2211332::~GG2211332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211332E(Test__ZN3aaa9GG2211332E, "_ZN3aaa9GG2211332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211332C1Ev();
extern void _ZN3aaa9GG2211332D1Ev();
Name_Map name_map__ZN3aaa9GG2211332E[] = {
  NSPAIR(_ZN3aaa9GG2211332C1Ev),
  NSPAIR(_ZN3aaa9GG2211332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2211332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211332E[];
extern void _ZN3aaa9GG22113323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22113323barEv,_ZThn8_N3aaa9GG22113323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22113323barEv,_ZThn20_N3aaa9GG22113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113323barEv,_ZThn28_N3aaa9GG22113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22113323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22113323barEv,_ZThn8_N3aaa9GG22113323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113323barEv,_ZThn20_N3aaa9GG22113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113323barEv,_ZThn28_N3aaa9GG22113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211332E[];
Class_Descriptor cd__ZN3aaa9GG2211332E = {  "_ZN3aaa9GG2211332E", // class name
  bases__ZN3aaa9GG2211332E, 6,
  &(vtc__ZN3aaa9GG2211332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2211333  : ::aaa::EE221 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22113333fooEv
  virtual void  bar(); // _ZN3aaa9GG22113333barEv
  ~GG2211333(); // tgen
  GG2211333(); // tgen
};
//SIG(1 _ZN3aaa9GG2211333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2211333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22113333fooEv");}
void  aaa::GG2211333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22113333barEv");}
aaa::GG2211333 ::~GG2211333(){ note_dtor("_ZN3aaa9GG2211333E", this);} // tgen
aaa::GG2211333 ::GG2211333(){ note_ctor("_ZN3aaa9GG2211333E", this);} // tgen
}
static void Test__ZN3aaa9GG2211333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2211333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2211333E, buf);
    ::aaa::GG2211333 *dp, &lv = *(dp=new (buf) ::aaa::GG2211333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2211333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2211333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2211333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2211333E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2211333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2211333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2211333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2211333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2211333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2211333E);
    dp->::aaa::GG2211333::~GG2211333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2211333E(Test__ZN3aaa9GG2211333E, "_ZN3aaa9GG2211333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2211333C1Ev();
extern void _ZN3aaa9GG2211333D1Ev();
Name_Map name_map__ZN3aaa9GG2211333E[] = {
  NSPAIR(_ZN3aaa9GG2211333C1Ev),
  NSPAIR(_ZN3aaa9GG2211333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2211333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2211333E[];
extern void _ZN3aaa9GG22113333barEv();
extern void _ZN3aaa9GG22113333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22113333barEv,_ZThn8_N3aaa9GG22113333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22113333fooEv,_ZThn20_N3aaa9GG22113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22113333barEv,_ZThn20_N3aaa9GG22113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113333fooEv,_ZThn28_N3aaa9GG22113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22113333barEv,_ZThn28_N3aaa9GG22113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2211333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22113333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22113333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22113333barEv,_ZThn8_N3aaa9GG22113333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113333fooEv,_ZThn20_N3aaa9GG22113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22113333barEv,_ZThn20_N3aaa9GG22113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113333fooEv,_ZThn28_N3aaa9GG22113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22113333barEv,_ZThn28_N3aaa9GG22113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2211333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2211333E[];
Class_Descriptor cd__ZN3aaa9GG2211333E = {  "_ZN3aaa9GG2211333E", // class name
  bases__ZN3aaa9GG2211333E, 6,
  &(vtc__ZN3aaa9GG2211333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2211333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2211333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212111  : ::aaa::EE221 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22121113fooEv
  ~GG2212111(); // tgen
  GG2212111(); // tgen
};
//SIG(1 _ZN3aaa9GG2212111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22121113fooEv");}
aaa::GG2212111 ::~GG2212111(){ note_dtor("_ZN3aaa9GG2212111E", this);} // tgen
aaa::GG2212111 ::GG2212111(){ note_ctor("_ZN3aaa9GG2212111E", this);} // tgen
}
static void Test__ZN3aaa9GG2212111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212111E, buf);
    ::aaa::GG2212111 *dp, &lv = *(dp=new (buf) ::aaa::GG2212111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212111E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2212111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2212111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2212111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212111E);
    dp->::aaa::GG2212111::~GG2212111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212111E(Test__ZN3aaa9GG2212111E, "_ZN3aaa9GG2212111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212111C1Ev();
extern void _ZN3aaa9GG2212111D1Ev();
Name_Map name_map__ZN3aaa9GG2212111E[] = {
  NSPAIR(_ZN3aaa9GG2212111C1Ev),
  NSPAIR(_ZN3aaa9GG2212111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2212111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22121113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22121113fooEv,_ZThn20_N3aaa9GG22121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22121113fooEv,_ZThn28_N3aaa9GG22121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22121113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121113fooEv,_ZThn20_N3aaa9GG22121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22121113fooEv,_ZThn28_N3aaa9GG22121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212111E[];
Class_Descriptor cd__ZN3aaa9GG2212111E = {  "_ZN3aaa9GG2212111E", // class name
  bases__ZN3aaa9GG2212111E, 6,
  &(vtc__ZN3aaa9GG2212111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212112  : ::aaa::EE221 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22121123barEv
  ~GG2212112(); // tgen
  GG2212112(); // tgen
};
//SIG(1 _ZN3aaa9GG2212112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22121123barEv");}
aaa::GG2212112 ::~GG2212112(){ note_dtor("_ZN3aaa9GG2212112E", this);} // tgen
aaa::GG2212112 ::GG2212112(){ note_ctor("_ZN3aaa9GG2212112E", this);} // tgen
}
static void Test__ZN3aaa9GG2212112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212112E, buf);
    ::aaa::GG2212112 *dp, &lv = *(dp=new (buf) ::aaa::GG2212112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212112E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2212112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2212112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2212112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212112E);
    dp->::aaa::GG2212112::~GG2212112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212112E(Test__ZN3aaa9GG2212112E, "_ZN3aaa9GG2212112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212112C1Ev();
extern void _ZN3aaa9GG2212112D1Ev();
Name_Map name_map__ZN3aaa9GG2212112E[] = {
  NSPAIR(_ZN3aaa9GG2212112C1Ev),
  NSPAIR(_ZN3aaa9GG2212112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2212112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212112E[];
extern void _ZN3aaa9GG22121123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22121123barEv,_ZThn8_N3aaa9GG22121123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22121123barEv,_ZThn20_N3aaa9GG22121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22121123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22121123barEv,_ZThn8_N3aaa9GG22121123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121123barEv,_ZThn20_N3aaa9GG22121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212112E[];
Class_Descriptor cd__ZN3aaa9GG2212112E = {  "_ZN3aaa9GG2212112E", // class name
  bases__ZN3aaa9GG2212112E, 6,
  &(vtc__ZN3aaa9GG2212112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212113  : ::aaa::EE221 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22121133fooEv
  virtual void  bar(); // _ZN3aaa9GG22121133barEv
  ~GG2212113(); // tgen
  GG2212113(); // tgen
};
//SIG(1 _ZN3aaa9GG2212113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22121133fooEv");}
void  aaa::GG2212113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22121133barEv");}
aaa::GG2212113 ::~GG2212113(){ note_dtor("_ZN3aaa9GG2212113E", this);} // tgen
aaa::GG2212113 ::GG2212113(){ note_ctor("_ZN3aaa9GG2212113E", this);} // tgen
}
static void Test__ZN3aaa9GG2212113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212113E, buf);
    ::aaa::GG2212113 *dp, &lv = *(dp=new (buf) ::aaa::GG2212113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212113E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2212113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2212113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2212113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212113E);
    dp->::aaa::GG2212113::~GG2212113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212113E(Test__ZN3aaa9GG2212113E, "_ZN3aaa9GG2212113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212113C1Ev();
extern void _ZN3aaa9GG2212113D1Ev();
Name_Map name_map__ZN3aaa9GG2212113E[] = {
  NSPAIR(_ZN3aaa9GG2212113C1Ev),
  NSPAIR(_ZN3aaa9GG2212113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2212113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212113E[];
extern void _ZN3aaa9GG22121133barEv();
extern void _ZN3aaa9GG22121133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22121133barEv,_ZThn8_N3aaa9GG22121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22121133barEv,_ZThn20_N3aaa9GG22121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22121133fooEv,_ZThn20_N3aaa9GG22121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22121133fooEv,_ZThn28_N3aaa9GG22121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22121133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22121133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22121133barEv,_ZThn8_N3aaa9GG22121133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121133barEv,_ZThn20_N3aaa9GG22121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121133fooEv,_ZThn20_N3aaa9GG22121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22121133fooEv,_ZThn28_N3aaa9GG22121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212113E[];
Class_Descriptor cd__ZN3aaa9GG2212113E = {  "_ZN3aaa9GG2212113E", // class name
  bases__ZN3aaa9GG2212113E, 6,
  &(vtc__ZN3aaa9GG2212113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212121  : ::aaa::EE221 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22121213fooEv
  ~GG2212121(); // tgen
  GG2212121(); // tgen
};
//SIG(1 _ZN3aaa9GG2212121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22121213fooEv");}
aaa::GG2212121 ::~GG2212121(){ note_dtor("_ZN3aaa9GG2212121E", this);} // tgen
aaa::GG2212121 ::GG2212121(){ note_ctor("_ZN3aaa9GG2212121E", this);} // tgen
}
static void Test__ZN3aaa9GG2212121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212121E, buf);
    ::aaa::GG2212121 *dp, &lv = *(dp=new (buf) ::aaa::GG2212121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212121E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2212121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2212121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2212121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212121E);
    dp->::aaa::GG2212121::~GG2212121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212121E(Test__ZN3aaa9GG2212121E, "_ZN3aaa9GG2212121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212121C1Ev();
extern void _ZN3aaa9GG2212121D1Ev();
Name_Map name_map__ZN3aaa9GG2212121E[] = {
  NSPAIR(_ZN3aaa9GG2212121C1Ev),
  NSPAIR(_ZN3aaa9GG2212121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2212121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22121213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22121213fooEv,_ZThn28_N3aaa9GG22121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22121213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22121213fooEv,_ZThn28_N3aaa9GG22121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212121E[];
Class_Descriptor cd__ZN3aaa9GG2212121E = {  "_ZN3aaa9GG2212121E", // class name
  bases__ZN3aaa9GG2212121E, 6,
  &(vtc__ZN3aaa9GG2212121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212122  : ::aaa::EE221 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22121223barEv
  ~GG2212122(); // tgen
  GG2212122(); // tgen
};
//SIG(1 _ZN3aaa9GG2212122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22121223barEv");}
aaa::GG2212122 ::~GG2212122(){ note_dtor("_ZN3aaa9GG2212122E", this);} // tgen
aaa::GG2212122 ::GG2212122(){ note_ctor("_ZN3aaa9GG2212122E", this);} // tgen
}
static void Test__ZN3aaa9GG2212122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212122E, buf);
    ::aaa::GG2212122 *dp, &lv = *(dp=new (buf) ::aaa::GG2212122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212122E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2212122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2212122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2212122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212122E);
    dp->::aaa::GG2212122::~GG2212122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212122E(Test__ZN3aaa9GG2212122E, "_ZN3aaa9GG2212122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212122C1Ev();
extern void _ZN3aaa9GG2212122D1Ev();
Name_Map name_map__ZN3aaa9GG2212122E[] = {
  NSPAIR(_ZN3aaa9GG2212122C1Ev),
  NSPAIR(_ZN3aaa9GG2212122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2212122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212122E[];
extern void _ZN3aaa9GG22121223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22121223barEv,_ZThn8_N3aaa9GG22121223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22121223barEv,_ZThn20_N3aaa9GG22121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22121223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22121223barEv,_ZThn8_N3aaa9GG22121223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121223barEv,_ZThn20_N3aaa9GG22121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212122E[];
Class_Descriptor cd__ZN3aaa9GG2212122E = {  "_ZN3aaa9GG2212122E", // class name
  bases__ZN3aaa9GG2212122E, 6,
  &(vtc__ZN3aaa9GG2212122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212123  : ::aaa::EE221 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22121233fooEv
  virtual void  bar(); // _ZN3aaa9GG22121233barEv
  ~GG2212123(); // tgen
  GG2212123(); // tgen
};
//SIG(1 _ZN3aaa9GG2212123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22121233fooEv");}
void  aaa::GG2212123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22121233barEv");}
aaa::GG2212123 ::~GG2212123(){ note_dtor("_ZN3aaa9GG2212123E", this);} // tgen
aaa::GG2212123 ::GG2212123(){ note_ctor("_ZN3aaa9GG2212123E", this);} // tgen
}
static void Test__ZN3aaa9GG2212123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212123E, buf);
    ::aaa::GG2212123 *dp, &lv = *(dp=new (buf) ::aaa::GG2212123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212123E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2212123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2212123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2212123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212123E);
    dp->::aaa::GG2212123::~GG2212123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212123E(Test__ZN3aaa9GG2212123E, "_ZN3aaa9GG2212123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212123C1Ev();
extern void _ZN3aaa9GG2212123D1Ev();
Name_Map name_map__ZN3aaa9GG2212123E[] = {
  NSPAIR(_ZN3aaa9GG2212123C1Ev),
  NSPAIR(_ZN3aaa9GG2212123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2212123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212123E[];
extern void _ZN3aaa9GG22121233barEv();
extern void _ZN3aaa9GG22121233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22121233barEv,_ZThn8_N3aaa9GG22121233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22121233barEv,_ZThn20_N3aaa9GG22121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22121233fooEv,_ZThn28_N3aaa9GG22121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22121233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22121233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22121233barEv,_ZThn8_N3aaa9GG22121233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121233barEv,_ZThn20_N3aaa9GG22121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22121233fooEv,_ZThn28_N3aaa9GG22121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212123E[];
Class_Descriptor cd__ZN3aaa9GG2212123E = {  "_ZN3aaa9GG2212123E", // class name
  bases__ZN3aaa9GG2212123E, 6,
  &(vtc__ZN3aaa9GG2212123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212131  : ::aaa::EE221 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22121313fooEv
  ~GG2212131(); // tgen
  GG2212131(); // tgen
};
//SIG(1 _ZN3aaa9GG2212131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22121313fooEv");}
aaa::GG2212131 ::~GG2212131(){ note_dtor("_ZN3aaa9GG2212131E", this);} // tgen
aaa::GG2212131 ::GG2212131(){ note_ctor("_ZN3aaa9GG2212131E", this);} // tgen
}
static void Test__ZN3aaa9GG2212131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212131E, buf);
    ::aaa::GG2212131 *dp, &lv = *(dp=new (buf) ::aaa::GG2212131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212131E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2212131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2212131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2212131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212131E);
    dp->::aaa::GG2212131::~GG2212131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212131E(Test__ZN3aaa9GG2212131E, "_ZN3aaa9GG2212131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212131C1Ev();
extern void _ZN3aaa9GG2212131D1Ev();
Name_Map name_map__ZN3aaa9GG2212131E[] = {
  NSPAIR(_ZN3aaa9GG2212131C1Ev),
  NSPAIR(_ZN3aaa9GG2212131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2212131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22121313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22121313fooEv,_ZThn20_N3aaa9GG22121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22121313fooEv,_ZThn28_N3aaa9GG22121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22121313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121313fooEv,_ZThn20_N3aaa9GG22121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22121313fooEv,_ZThn28_N3aaa9GG22121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212131E[];
Class_Descriptor cd__ZN3aaa9GG2212131E = {  "_ZN3aaa9GG2212131E", // class name
  bases__ZN3aaa9GG2212131E, 6,
  &(vtc__ZN3aaa9GG2212131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212132  : ::aaa::EE221 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22121323barEv
  ~GG2212132(); // tgen
  GG2212132(); // tgen
};
//SIG(1 _ZN3aaa9GG2212132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22121323barEv");}
aaa::GG2212132 ::~GG2212132(){ note_dtor("_ZN3aaa9GG2212132E", this);} // tgen
aaa::GG2212132 ::GG2212132(){ note_ctor("_ZN3aaa9GG2212132E", this);} // tgen
}
static void Test__ZN3aaa9GG2212132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212132E, buf);
    ::aaa::GG2212132 *dp, &lv = *(dp=new (buf) ::aaa::GG2212132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212132E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2212132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2212132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2212132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212132E);
    dp->::aaa::GG2212132::~GG2212132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212132E(Test__ZN3aaa9GG2212132E, "_ZN3aaa9GG2212132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212132C1Ev();
extern void _ZN3aaa9GG2212132D1Ev();
Name_Map name_map__ZN3aaa9GG2212132E[] = {
  NSPAIR(_ZN3aaa9GG2212132C1Ev),
  NSPAIR(_ZN3aaa9GG2212132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2212132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212132E[];
extern void _ZN3aaa9GG22121323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22121323barEv,_ZThn8_N3aaa9GG22121323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22121323barEv,_ZThn20_N3aaa9GG22121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22121323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22121323barEv,_ZThn8_N3aaa9GG22121323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121323barEv,_ZThn20_N3aaa9GG22121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212132E[];
Class_Descriptor cd__ZN3aaa9GG2212132E = {  "_ZN3aaa9GG2212132E", // class name
  bases__ZN3aaa9GG2212132E, 6,
  &(vtc__ZN3aaa9GG2212132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212133  : ::aaa::EE221 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22121333fooEv
  virtual void  bar(); // _ZN3aaa9GG22121333barEv
  ~GG2212133(); // tgen
  GG2212133(); // tgen
};
//SIG(1 _ZN3aaa9GG2212133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22121333fooEv");}
void  aaa::GG2212133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22121333barEv");}
aaa::GG2212133 ::~GG2212133(){ note_dtor("_ZN3aaa9GG2212133E", this);} // tgen
aaa::GG2212133 ::GG2212133(){ note_ctor("_ZN3aaa9GG2212133E", this);} // tgen
}
static void Test__ZN3aaa9GG2212133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212133E, buf);
    ::aaa::GG2212133 *dp, &lv = *(dp=new (buf) ::aaa::GG2212133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212133E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2212133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2212133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2212133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212133E);
    dp->::aaa::GG2212133::~GG2212133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212133E(Test__ZN3aaa9GG2212133E, "_ZN3aaa9GG2212133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212133C1Ev();
extern void _ZN3aaa9GG2212133D1Ev();
Name_Map name_map__ZN3aaa9GG2212133E[] = {
  NSPAIR(_ZN3aaa9GG2212133C1Ev),
  NSPAIR(_ZN3aaa9GG2212133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2212133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212133E[];
extern void _ZN3aaa9GG22121333barEv();
extern void _ZN3aaa9GG22121333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22121333barEv,_ZThn8_N3aaa9GG22121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22121333barEv,_ZThn20_N3aaa9GG22121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22121333fooEv,_ZThn20_N3aaa9GG22121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22121333fooEv,_ZThn28_N3aaa9GG22121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22121333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22121333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22121333barEv,_ZThn8_N3aaa9GG22121333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121333barEv,_ZThn20_N3aaa9GG22121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22121333fooEv,_ZThn20_N3aaa9GG22121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22121333fooEv,_ZThn28_N3aaa9GG22121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212133E[];
Class_Descriptor cd__ZN3aaa9GG2212133E = {  "_ZN3aaa9GG2212133E", // class name
  bases__ZN3aaa9GG2212133E, 6,
  &(vtc__ZN3aaa9GG2212133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212211  : ::aaa::EE221 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22122113fooEv
  ~GG2212211(); // tgen
  GG2212211(); // tgen
};
//SIG(1 _ZN3aaa9GG2212211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22122113fooEv");}
aaa::GG2212211 ::~GG2212211(){ note_dtor("_ZN3aaa9GG2212211E", this);} // tgen
aaa::GG2212211 ::GG2212211(){ note_ctor("_ZN3aaa9GG2212211E", this);} // tgen
}
static void Test__ZN3aaa9GG2212211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212211E, buf);
    ::aaa::GG2212211 *dp, &lv = *(dp=new (buf) ::aaa::GG2212211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212211E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2212211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2212211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2212211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212211E);
    dp->::aaa::GG2212211::~GG2212211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212211E(Test__ZN3aaa9GG2212211E, "_ZN3aaa9GG2212211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212211C1Ev();
extern void _ZN3aaa9GG2212211D1Ev();
Name_Map name_map__ZN3aaa9GG2212211E[] = {
  NSPAIR(_ZN3aaa9GG2212211C1Ev),
  NSPAIR(_ZN3aaa9GG2212211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2212211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22122113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22122113fooEv,_ZThn20_N3aaa9GG22122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22122113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122113fooEv,_ZThn20_N3aaa9GG22122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212211E[];
Class_Descriptor cd__ZN3aaa9GG2212211E = {  "_ZN3aaa9GG2212211E", // class name
  bases__ZN3aaa9GG2212211E, 6,
  &(vtc__ZN3aaa9GG2212211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212212  : ::aaa::EE221 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22122123barEv
  ~GG2212212(); // tgen
  GG2212212(); // tgen
};
//SIG(1 _ZN3aaa9GG2212212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22122123barEv");}
aaa::GG2212212 ::~GG2212212(){ note_dtor("_ZN3aaa9GG2212212E", this);} // tgen
aaa::GG2212212 ::GG2212212(){ note_ctor("_ZN3aaa9GG2212212E", this);} // tgen
}
static void Test__ZN3aaa9GG2212212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212212E, buf);
    ::aaa::GG2212212 *dp, &lv = *(dp=new (buf) ::aaa::GG2212212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212212E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2212212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2212212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2212212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212212E);
    dp->::aaa::GG2212212::~GG2212212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212212E(Test__ZN3aaa9GG2212212E, "_ZN3aaa9GG2212212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212212C1Ev();
extern void _ZN3aaa9GG2212212D1Ev();
Name_Map name_map__ZN3aaa9GG2212212E[] = {
  NSPAIR(_ZN3aaa9GG2212212C1Ev),
  NSPAIR(_ZN3aaa9GG2212212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2212212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212212E[];
extern void _ZN3aaa9GG22122123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22122123barEv,_ZThn8_N3aaa9GG22122123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22122123barEv,_ZThn20_N3aaa9GG22122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22122123barEv,_ZThn28_N3aaa9GG22122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22122123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22122123barEv,_ZThn8_N3aaa9GG22122123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122123barEv,_ZThn20_N3aaa9GG22122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22122123barEv,_ZThn28_N3aaa9GG22122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212212E[];
Class_Descriptor cd__ZN3aaa9GG2212212E = {  "_ZN3aaa9GG2212212E", // class name
  bases__ZN3aaa9GG2212212E, 6,
  &(vtc__ZN3aaa9GG2212212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212213  : ::aaa::EE221 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22122133fooEv
  virtual void  bar(); // _ZN3aaa9GG22122133barEv
  ~GG2212213(); // tgen
  GG2212213(); // tgen
};
//SIG(1 _ZN3aaa9GG2212213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22122133fooEv");}
void  aaa::GG2212213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22122133barEv");}
aaa::GG2212213 ::~GG2212213(){ note_dtor("_ZN3aaa9GG2212213E", this);} // tgen
aaa::GG2212213 ::GG2212213(){ note_ctor("_ZN3aaa9GG2212213E", this);} // tgen
}
static void Test__ZN3aaa9GG2212213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212213E, buf);
    ::aaa::GG2212213 *dp, &lv = *(dp=new (buf) ::aaa::GG2212213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212213E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2212213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2212213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2212213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212213E);
    dp->::aaa::GG2212213::~GG2212213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212213E(Test__ZN3aaa9GG2212213E, "_ZN3aaa9GG2212213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212213C1Ev();
extern void _ZN3aaa9GG2212213D1Ev();
Name_Map name_map__ZN3aaa9GG2212213E[] = {
  NSPAIR(_ZN3aaa9GG2212213C1Ev),
  NSPAIR(_ZN3aaa9GG2212213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2212213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212213E[];
extern void _ZN3aaa9GG22122133barEv();
extern void _ZN3aaa9GG22122133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22122133barEv,_ZThn8_N3aaa9GG22122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22122133barEv,_ZThn20_N3aaa9GG22122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22122133fooEv,_ZThn20_N3aaa9GG22122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22122133barEv,_ZThn28_N3aaa9GG22122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22122133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22122133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22122133barEv,_ZThn8_N3aaa9GG22122133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122133barEv,_ZThn20_N3aaa9GG22122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122133fooEv,_ZThn20_N3aaa9GG22122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22122133barEv,_ZThn28_N3aaa9GG22122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212213E[];
Class_Descriptor cd__ZN3aaa9GG2212213E = {  "_ZN3aaa9GG2212213E", // class name
  bases__ZN3aaa9GG2212213E, 6,
  &(vtc__ZN3aaa9GG2212213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212221  : ::aaa::EE221 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22122213fooEv
  ~GG2212221(); // tgen
  GG2212221(); // tgen
};
//SIG(1 _ZN3aaa9GG2212221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22122213fooEv");}
aaa::GG2212221 ::~GG2212221(){ note_dtor("_ZN3aaa9GG2212221E", this);} // tgen
aaa::GG2212221 ::GG2212221(){ note_ctor("_ZN3aaa9GG2212221E", this);} // tgen
}
static void Test__ZN3aaa9GG2212221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212221E, buf);
    ::aaa::GG2212221 *dp, &lv = *(dp=new (buf) ::aaa::GG2212221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212221E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2212221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2212221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2212221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212221E);
    dp->::aaa::GG2212221::~GG2212221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212221E(Test__ZN3aaa9GG2212221E, "_ZN3aaa9GG2212221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212221C1Ev();
extern void _ZN3aaa9GG2212221D1Ev();
Name_Map name_map__ZN3aaa9GG2212221E[] = {
  NSPAIR(_ZN3aaa9GG2212221C1Ev),
  NSPAIR(_ZN3aaa9GG2212221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2212221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22122213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22122213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212221E[];
Class_Descriptor cd__ZN3aaa9GG2212221E = {  "_ZN3aaa9GG2212221E", // class name
  bases__ZN3aaa9GG2212221E, 6,
  &(vtc__ZN3aaa9GG2212221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212222  : ::aaa::EE221 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22122223barEv
  ~GG2212222(); // tgen
  GG2212222(); // tgen
};
//SIG(1 _ZN3aaa9GG2212222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22122223barEv");}
aaa::GG2212222 ::~GG2212222(){ note_dtor("_ZN3aaa9GG2212222E", this);} // tgen
aaa::GG2212222 ::GG2212222(){ note_ctor("_ZN3aaa9GG2212222E", this);} // tgen
}
static void Test__ZN3aaa9GG2212222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212222E, buf);
    ::aaa::GG2212222 *dp, &lv = *(dp=new (buf) ::aaa::GG2212222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212222E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2212222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2212222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2212222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212222E);
    dp->::aaa::GG2212222::~GG2212222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212222E(Test__ZN3aaa9GG2212222E, "_ZN3aaa9GG2212222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212222C1Ev();
extern void _ZN3aaa9GG2212222D1Ev();
Name_Map name_map__ZN3aaa9GG2212222E[] = {
  NSPAIR(_ZN3aaa9GG2212222C1Ev),
  NSPAIR(_ZN3aaa9GG2212222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2212222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212222E[];
extern void _ZN3aaa9GG22122223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22122223barEv,_ZThn8_N3aaa9GG22122223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22122223barEv,_ZThn20_N3aaa9GG22122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22122223barEv,_ZThn28_N3aaa9GG22122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22122223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22122223barEv,_ZThn8_N3aaa9GG22122223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122223barEv,_ZThn20_N3aaa9GG22122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22122223barEv,_ZThn28_N3aaa9GG22122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212222E[];
Class_Descriptor cd__ZN3aaa9GG2212222E = {  "_ZN3aaa9GG2212222E", // class name
  bases__ZN3aaa9GG2212222E, 6,
  &(vtc__ZN3aaa9GG2212222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212223  : ::aaa::EE221 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22122233fooEv
  virtual void  bar(); // _ZN3aaa9GG22122233barEv
  ~GG2212223(); // tgen
  GG2212223(); // tgen
};
//SIG(1 _ZN3aaa9GG2212223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22122233fooEv");}
void  aaa::GG2212223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22122233barEv");}
aaa::GG2212223 ::~GG2212223(){ note_dtor("_ZN3aaa9GG2212223E", this);} // tgen
aaa::GG2212223 ::GG2212223(){ note_ctor("_ZN3aaa9GG2212223E", this);} // tgen
}
static void Test__ZN3aaa9GG2212223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212223E, buf);
    ::aaa::GG2212223 *dp, &lv = *(dp=new (buf) ::aaa::GG2212223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212223E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2212223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2212223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2212223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212223E);
    dp->::aaa::GG2212223::~GG2212223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212223E(Test__ZN3aaa9GG2212223E, "_ZN3aaa9GG2212223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212223C1Ev();
extern void _ZN3aaa9GG2212223D1Ev();
Name_Map name_map__ZN3aaa9GG2212223E[] = {
  NSPAIR(_ZN3aaa9GG2212223C1Ev),
  NSPAIR(_ZN3aaa9GG2212223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2212223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212223E[];
extern void _ZN3aaa9GG22122233barEv();
extern void _ZN3aaa9GG22122233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22122233barEv,_ZThn8_N3aaa9GG22122233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22122233barEv,_ZThn20_N3aaa9GG22122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22122233barEv,_ZThn28_N3aaa9GG22122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22122233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22122233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22122233barEv,_ZThn8_N3aaa9GG22122233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122233barEv,_ZThn20_N3aaa9GG22122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22122233barEv,_ZThn28_N3aaa9GG22122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212223E[];
Class_Descriptor cd__ZN3aaa9GG2212223E = {  "_ZN3aaa9GG2212223E", // class name
  bases__ZN3aaa9GG2212223E, 6,
  &(vtc__ZN3aaa9GG2212223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212231  : ::aaa::EE221 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22122313fooEv
  ~GG2212231(); // tgen
  GG2212231(); // tgen
};
//SIG(1 _ZN3aaa9GG2212231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22122313fooEv");}
aaa::GG2212231 ::~GG2212231(){ note_dtor("_ZN3aaa9GG2212231E", this);} // tgen
aaa::GG2212231 ::GG2212231(){ note_ctor("_ZN3aaa9GG2212231E", this);} // tgen
}
static void Test__ZN3aaa9GG2212231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212231E, buf);
    ::aaa::GG2212231 *dp, &lv = *(dp=new (buf) ::aaa::GG2212231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212231E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2212231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2212231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2212231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212231E);
    dp->::aaa::GG2212231::~GG2212231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212231E(Test__ZN3aaa9GG2212231E, "_ZN3aaa9GG2212231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212231C1Ev();
extern void _ZN3aaa9GG2212231D1Ev();
Name_Map name_map__ZN3aaa9GG2212231E[] = {
  NSPAIR(_ZN3aaa9GG2212231C1Ev),
  NSPAIR(_ZN3aaa9GG2212231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2212231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22122313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22122313fooEv,_ZThn20_N3aaa9GG22122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22122313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122313fooEv,_ZThn20_N3aaa9GG22122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212231E[];
Class_Descriptor cd__ZN3aaa9GG2212231E = {  "_ZN3aaa9GG2212231E", // class name
  bases__ZN3aaa9GG2212231E, 6,
  &(vtc__ZN3aaa9GG2212231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212232  : ::aaa::EE221 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22122323barEv
  ~GG2212232(); // tgen
  GG2212232(); // tgen
};
//SIG(1 _ZN3aaa9GG2212232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22122323barEv");}
aaa::GG2212232 ::~GG2212232(){ note_dtor("_ZN3aaa9GG2212232E", this);} // tgen
aaa::GG2212232 ::GG2212232(){ note_ctor("_ZN3aaa9GG2212232E", this);} // tgen
}
static void Test__ZN3aaa9GG2212232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212232E, buf);
    ::aaa::GG2212232 *dp, &lv = *(dp=new (buf) ::aaa::GG2212232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212232E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2212232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2212232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2212232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212232E);
    dp->::aaa::GG2212232::~GG2212232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212232E(Test__ZN3aaa9GG2212232E, "_ZN3aaa9GG2212232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212232C1Ev();
extern void _ZN3aaa9GG2212232D1Ev();
Name_Map name_map__ZN3aaa9GG2212232E[] = {
  NSPAIR(_ZN3aaa9GG2212232C1Ev),
  NSPAIR(_ZN3aaa9GG2212232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2212232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212232E[];
extern void _ZN3aaa9GG22122323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22122323barEv,_ZThn8_N3aaa9GG22122323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22122323barEv,_ZThn20_N3aaa9GG22122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22122323barEv,_ZThn28_N3aaa9GG22122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22122323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22122323barEv,_ZThn8_N3aaa9GG22122323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122323barEv,_ZThn20_N3aaa9GG22122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22122323barEv,_ZThn28_N3aaa9GG22122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212232E[];
Class_Descriptor cd__ZN3aaa9GG2212232E = {  "_ZN3aaa9GG2212232E", // class name
  bases__ZN3aaa9GG2212232E, 6,
  &(vtc__ZN3aaa9GG2212232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212233  : ::aaa::EE221 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22122333fooEv
  virtual void  bar(); // _ZN3aaa9GG22122333barEv
  ~GG2212233(); // tgen
  GG2212233(); // tgen
};
//SIG(1 _ZN3aaa9GG2212233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22122333fooEv");}
void  aaa::GG2212233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22122333barEv");}
aaa::GG2212233 ::~GG2212233(){ note_dtor("_ZN3aaa9GG2212233E", this);} // tgen
aaa::GG2212233 ::GG2212233(){ note_ctor("_ZN3aaa9GG2212233E", this);} // tgen
}
static void Test__ZN3aaa9GG2212233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212233E, buf);
    ::aaa::GG2212233 *dp, &lv = *(dp=new (buf) ::aaa::GG2212233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212233E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2212233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2212233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2212233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212233E);
    dp->::aaa::GG2212233::~GG2212233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212233E(Test__ZN3aaa9GG2212233E, "_ZN3aaa9GG2212233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212233C1Ev();
extern void _ZN3aaa9GG2212233D1Ev();
Name_Map name_map__ZN3aaa9GG2212233E[] = {
  NSPAIR(_ZN3aaa9GG2212233C1Ev),
  NSPAIR(_ZN3aaa9GG2212233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2212233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212233E[];
extern void _ZN3aaa9GG22122333barEv();
extern void _ZN3aaa9GG22122333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22122333barEv,_ZThn8_N3aaa9GG22122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22122333barEv,_ZThn20_N3aaa9GG22122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22122333fooEv,_ZThn20_N3aaa9GG22122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22122333barEv,_ZThn28_N3aaa9GG22122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22122333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22122333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22122333barEv,_ZThn8_N3aaa9GG22122333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122333barEv,_ZThn20_N3aaa9GG22122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22122333fooEv,_ZThn20_N3aaa9GG22122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22122333barEv,_ZThn28_N3aaa9GG22122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212233E[];
Class_Descriptor cd__ZN3aaa9GG2212233E = {  "_ZN3aaa9GG2212233E", // class name
  bases__ZN3aaa9GG2212233E, 6,
  &(vtc__ZN3aaa9GG2212233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212311  : ::aaa::EE221 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22123113fooEv
  ~GG2212311(); // tgen
  GG2212311(); // tgen
};
//SIG(1 _ZN3aaa9GG2212311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22123113fooEv");}
aaa::GG2212311 ::~GG2212311(){ note_dtor("_ZN3aaa9GG2212311E", this);} // tgen
aaa::GG2212311 ::GG2212311(){ note_ctor("_ZN3aaa9GG2212311E", this);} // tgen
}
static void Test__ZN3aaa9GG2212311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212311E, buf);
    ::aaa::GG2212311 *dp, &lv = *(dp=new (buf) ::aaa::GG2212311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212311E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2212311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2212311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2212311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212311E);
    dp->::aaa::GG2212311::~GG2212311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212311E(Test__ZN3aaa9GG2212311E, "_ZN3aaa9GG2212311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212311C1Ev();
extern void _ZN3aaa9GG2212311D1Ev();
Name_Map name_map__ZN3aaa9GG2212311E[] = {
  NSPAIR(_ZN3aaa9GG2212311C1Ev),
  NSPAIR(_ZN3aaa9GG2212311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2212311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22123113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22123113fooEv,_ZThn20_N3aaa9GG22123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123113fooEv,_ZThn28_N3aaa9GG22123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22123113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123113fooEv,_ZThn20_N3aaa9GG22123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123113fooEv,_ZThn28_N3aaa9GG22123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212311E[];
Class_Descriptor cd__ZN3aaa9GG2212311E = {  "_ZN3aaa9GG2212311E", // class name
  bases__ZN3aaa9GG2212311E, 6,
  &(vtc__ZN3aaa9GG2212311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212312  : ::aaa::EE221 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22123123barEv
  ~GG2212312(); // tgen
  GG2212312(); // tgen
};
//SIG(1 _ZN3aaa9GG2212312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22123123barEv");}
aaa::GG2212312 ::~GG2212312(){ note_dtor("_ZN3aaa9GG2212312E", this);} // tgen
aaa::GG2212312 ::GG2212312(){ note_ctor("_ZN3aaa9GG2212312E", this);} // tgen
}
static void Test__ZN3aaa9GG2212312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212312E, buf);
    ::aaa::GG2212312 *dp, &lv = *(dp=new (buf) ::aaa::GG2212312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212312E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2212312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2212312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2212312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212312E);
    dp->::aaa::GG2212312::~GG2212312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212312E(Test__ZN3aaa9GG2212312E, "_ZN3aaa9GG2212312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212312C1Ev();
extern void _ZN3aaa9GG2212312D1Ev();
Name_Map name_map__ZN3aaa9GG2212312E[] = {
  NSPAIR(_ZN3aaa9GG2212312C1Ev),
  NSPAIR(_ZN3aaa9GG2212312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2212312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212312E[];
extern void _ZN3aaa9GG22123123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22123123barEv,_ZThn8_N3aaa9GG22123123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22123123barEv,_ZThn20_N3aaa9GG22123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123123barEv,_ZThn28_N3aaa9GG22123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22123123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22123123barEv,_ZThn8_N3aaa9GG22123123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123123barEv,_ZThn20_N3aaa9GG22123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123123barEv,_ZThn28_N3aaa9GG22123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212312E[];
Class_Descriptor cd__ZN3aaa9GG2212312E = {  "_ZN3aaa9GG2212312E", // class name
  bases__ZN3aaa9GG2212312E, 6,
  &(vtc__ZN3aaa9GG2212312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212313  : ::aaa::EE221 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22123133fooEv
  virtual void  bar(); // _ZN3aaa9GG22123133barEv
  ~GG2212313(); // tgen
  GG2212313(); // tgen
};
//SIG(1 _ZN3aaa9GG2212313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22123133fooEv");}
void  aaa::GG2212313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22123133barEv");}
aaa::GG2212313 ::~GG2212313(){ note_dtor("_ZN3aaa9GG2212313E", this);} // tgen
aaa::GG2212313 ::GG2212313(){ note_ctor("_ZN3aaa9GG2212313E", this);} // tgen
}
static void Test__ZN3aaa9GG2212313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212313E, buf);
    ::aaa::GG2212313 *dp, &lv = *(dp=new (buf) ::aaa::GG2212313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212313E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2212313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2212313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2212313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212313E);
    dp->::aaa::GG2212313::~GG2212313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212313E(Test__ZN3aaa9GG2212313E, "_ZN3aaa9GG2212313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212313C1Ev();
extern void _ZN3aaa9GG2212313D1Ev();
Name_Map name_map__ZN3aaa9GG2212313E[] = {
  NSPAIR(_ZN3aaa9GG2212313C1Ev),
  NSPAIR(_ZN3aaa9GG2212313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2212313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212313E[];
extern void _ZN3aaa9GG22123133barEv();
extern void _ZN3aaa9GG22123133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22123133barEv,_ZThn8_N3aaa9GG22123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22123133barEv,_ZThn20_N3aaa9GG22123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22123133fooEv,_ZThn20_N3aaa9GG22123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123133fooEv,_ZThn28_N3aaa9GG22123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123133barEv,_ZThn28_N3aaa9GG22123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22123133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22123133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22123133barEv,_ZThn8_N3aaa9GG22123133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123133barEv,_ZThn20_N3aaa9GG22123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123133fooEv,_ZThn20_N3aaa9GG22123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123133fooEv,_ZThn28_N3aaa9GG22123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123133barEv,_ZThn28_N3aaa9GG22123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212313E[];
Class_Descriptor cd__ZN3aaa9GG2212313E = {  "_ZN3aaa9GG2212313E", // class name
  bases__ZN3aaa9GG2212313E, 6,
  &(vtc__ZN3aaa9GG2212313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212321  : ::aaa::EE221 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22123213fooEv
  ~GG2212321(); // tgen
  GG2212321(); // tgen
};
//SIG(1 _ZN3aaa9GG2212321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22123213fooEv");}
aaa::GG2212321 ::~GG2212321(){ note_dtor("_ZN3aaa9GG2212321E", this);} // tgen
aaa::GG2212321 ::GG2212321(){ note_ctor("_ZN3aaa9GG2212321E", this);} // tgen
}
static void Test__ZN3aaa9GG2212321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212321E, buf);
    ::aaa::GG2212321 *dp, &lv = *(dp=new (buf) ::aaa::GG2212321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212321E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2212321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2212321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2212321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212321E);
    dp->::aaa::GG2212321::~GG2212321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212321E(Test__ZN3aaa9GG2212321E, "_ZN3aaa9GG2212321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212321C1Ev();
extern void _ZN3aaa9GG2212321D1Ev();
Name_Map name_map__ZN3aaa9GG2212321E[] = {
  NSPAIR(_ZN3aaa9GG2212321C1Ev),
  NSPAIR(_ZN3aaa9GG2212321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2212321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22123213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22123213fooEv,_ZThn28_N3aaa9GG22123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22123213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123213fooEv,_ZThn28_N3aaa9GG22123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212321E[];
Class_Descriptor cd__ZN3aaa9GG2212321E = {  "_ZN3aaa9GG2212321E", // class name
  bases__ZN3aaa9GG2212321E, 6,
  &(vtc__ZN3aaa9GG2212321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212322  : ::aaa::EE221 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22123223barEv
  ~GG2212322(); // tgen
  GG2212322(); // tgen
};
//SIG(1 _ZN3aaa9GG2212322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22123223barEv");}
aaa::GG2212322 ::~GG2212322(){ note_dtor("_ZN3aaa9GG2212322E", this);} // tgen
aaa::GG2212322 ::GG2212322(){ note_ctor("_ZN3aaa9GG2212322E", this);} // tgen
}
static void Test__ZN3aaa9GG2212322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212322E, buf);
    ::aaa::GG2212322 *dp, &lv = *(dp=new (buf) ::aaa::GG2212322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212322E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2212322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2212322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2212322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212322E);
    dp->::aaa::GG2212322::~GG2212322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212322E(Test__ZN3aaa9GG2212322E, "_ZN3aaa9GG2212322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212322C1Ev();
extern void _ZN3aaa9GG2212322D1Ev();
Name_Map name_map__ZN3aaa9GG2212322E[] = {
  NSPAIR(_ZN3aaa9GG2212322C1Ev),
  NSPAIR(_ZN3aaa9GG2212322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2212322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212322E[];
extern void _ZN3aaa9GG22123223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22123223barEv,_ZThn8_N3aaa9GG22123223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22123223barEv,_ZThn20_N3aaa9GG22123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22123223barEv,_ZThn28_N3aaa9GG22123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22123223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22123223barEv,_ZThn8_N3aaa9GG22123223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123223barEv,_ZThn20_N3aaa9GG22123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123223barEv,_ZThn28_N3aaa9GG22123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212322E[];
Class_Descriptor cd__ZN3aaa9GG2212322E = {  "_ZN3aaa9GG2212322E", // class name
  bases__ZN3aaa9GG2212322E, 6,
  &(vtc__ZN3aaa9GG2212322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212323  : ::aaa::EE221 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22123233fooEv
  virtual void  bar(); // _ZN3aaa9GG22123233barEv
  ~GG2212323(); // tgen
  GG2212323(); // tgen
};
//SIG(1 _ZN3aaa9GG2212323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22123233fooEv");}
void  aaa::GG2212323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22123233barEv");}
aaa::GG2212323 ::~GG2212323(){ note_dtor("_ZN3aaa9GG2212323E", this);} // tgen
aaa::GG2212323 ::GG2212323(){ note_ctor("_ZN3aaa9GG2212323E", this);} // tgen
}
static void Test__ZN3aaa9GG2212323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212323E, buf);
    ::aaa::GG2212323 *dp, &lv = *(dp=new (buf) ::aaa::GG2212323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212323E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2212323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2212323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2212323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212323E);
    dp->::aaa::GG2212323::~GG2212323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212323E(Test__ZN3aaa9GG2212323E, "_ZN3aaa9GG2212323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212323C1Ev();
extern void _ZN3aaa9GG2212323D1Ev();
Name_Map name_map__ZN3aaa9GG2212323E[] = {
  NSPAIR(_ZN3aaa9GG2212323C1Ev),
  NSPAIR(_ZN3aaa9GG2212323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2212323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212323E[];
extern void _ZN3aaa9GG22123233barEv();
extern void _ZN3aaa9GG22123233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22123233barEv,_ZThn8_N3aaa9GG22123233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22123233barEv,_ZThn20_N3aaa9GG22123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123233fooEv,_ZThn28_N3aaa9GG22123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123233barEv,_ZThn28_N3aaa9GG22123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22123233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22123233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22123233barEv,_ZThn8_N3aaa9GG22123233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123233barEv,_ZThn20_N3aaa9GG22123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123233fooEv,_ZThn28_N3aaa9GG22123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123233barEv,_ZThn28_N3aaa9GG22123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212323E[];
Class_Descriptor cd__ZN3aaa9GG2212323E = {  "_ZN3aaa9GG2212323E", // class name
  bases__ZN3aaa9GG2212323E, 6,
  &(vtc__ZN3aaa9GG2212323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212331  : ::aaa::EE221 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22123313fooEv
  ~GG2212331(); // tgen
  GG2212331(); // tgen
};
//SIG(1 _ZN3aaa9GG2212331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22123313fooEv");}
aaa::GG2212331 ::~GG2212331(){ note_dtor("_ZN3aaa9GG2212331E", this);} // tgen
aaa::GG2212331 ::GG2212331(){ note_ctor("_ZN3aaa9GG2212331E", this);} // tgen
}
static void Test__ZN3aaa9GG2212331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212331E, buf);
    ::aaa::GG2212331 *dp, &lv = *(dp=new (buf) ::aaa::GG2212331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212331E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2212331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2212331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2212331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212331E);
    dp->::aaa::GG2212331::~GG2212331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212331E(Test__ZN3aaa9GG2212331E, "_ZN3aaa9GG2212331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212331C1Ev();
extern void _ZN3aaa9GG2212331D1Ev();
Name_Map name_map__ZN3aaa9GG2212331E[] = {
  NSPAIR(_ZN3aaa9GG2212331C1Ev),
  NSPAIR(_ZN3aaa9GG2212331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2212331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22123313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22123313fooEv,_ZThn20_N3aaa9GG22123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123313fooEv,_ZThn28_N3aaa9GG22123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22123313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123313fooEv,_ZThn20_N3aaa9GG22123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123313fooEv,_ZThn28_N3aaa9GG22123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212331E[];
Class_Descriptor cd__ZN3aaa9GG2212331E = {  "_ZN3aaa9GG2212331E", // class name
  bases__ZN3aaa9GG2212331E, 6,
  &(vtc__ZN3aaa9GG2212331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212332  : ::aaa::EE221 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22123323barEv
  ~GG2212332(); // tgen
  GG2212332(); // tgen
};
//SIG(1 _ZN3aaa9GG2212332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2212332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22123323barEv");}
aaa::GG2212332 ::~GG2212332(){ note_dtor("_ZN3aaa9GG2212332E", this);} // tgen
aaa::GG2212332 ::GG2212332(){ note_ctor("_ZN3aaa9GG2212332E", this);} // tgen
}
static void Test__ZN3aaa9GG2212332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212332E, buf);
    ::aaa::GG2212332 *dp, &lv = *(dp=new (buf) ::aaa::GG2212332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212332E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2212332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2212332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2212332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212332E);
    dp->::aaa::GG2212332::~GG2212332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212332E(Test__ZN3aaa9GG2212332E, "_ZN3aaa9GG2212332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212332C1Ev();
extern void _ZN3aaa9GG2212332D1Ev();
Name_Map name_map__ZN3aaa9GG2212332E[] = {
  NSPAIR(_ZN3aaa9GG2212332C1Ev),
  NSPAIR(_ZN3aaa9GG2212332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2212332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212332E[];
extern void _ZN3aaa9GG22123323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22123323barEv,_ZThn8_N3aaa9GG22123323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22123323barEv,_ZThn20_N3aaa9GG22123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123323barEv,_ZThn28_N3aaa9GG22123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22123323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22123323barEv,_ZThn8_N3aaa9GG22123323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123323barEv,_ZThn20_N3aaa9GG22123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123323barEv,_ZThn28_N3aaa9GG22123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212332E[];
Class_Descriptor cd__ZN3aaa9GG2212332E = {  "_ZN3aaa9GG2212332E", // class name
  bases__ZN3aaa9GG2212332E, 6,
  &(vtc__ZN3aaa9GG2212332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2212333  : ::aaa::EE221 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22123333fooEv
  virtual void  bar(); // _ZN3aaa9GG22123333barEv
  ~GG2212333(); // tgen
  GG2212333(); // tgen
};
//SIG(1 _ZN3aaa9GG2212333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2212333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22123333fooEv");}
void  aaa::GG2212333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22123333barEv");}
aaa::GG2212333 ::~GG2212333(){ note_dtor("_ZN3aaa9GG2212333E", this);} // tgen
aaa::GG2212333 ::GG2212333(){ note_ctor("_ZN3aaa9GG2212333E", this);} // tgen
}
static void Test__ZN3aaa9GG2212333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2212333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2212333E, buf);
    ::aaa::GG2212333 *dp, &lv = *(dp=new (buf) ::aaa::GG2212333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2212333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2212333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2212333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2212333E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2212333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2212333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2212333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2212333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2212333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2212333E);
    dp->::aaa::GG2212333::~GG2212333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2212333E(Test__ZN3aaa9GG2212333E, "_ZN3aaa9GG2212333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2212333C1Ev();
extern void _ZN3aaa9GG2212333D1Ev();
Name_Map name_map__ZN3aaa9GG2212333E[] = {
  NSPAIR(_ZN3aaa9GG2212333C1Ev),
  NSPAIR(_ZN3aaa9GG2212333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2212333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2212333E[];
extern void _ZN3aaa9GG22123333barEv();
extern void _ZN3aaa9GG22123333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22123333barEv,_ZThn8_N3aaa9GG22123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22123333barEv,_ZThn20_N3aaa9GG22123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22123333fooEv,_ZThn20_N3aaa9GG22123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123333fooEv,_ZThn28_N3aaa9GG22123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22123333barEv,_ZThn28_N3aaa9GG22123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2212333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22123333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22123333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22123333barEv,_ZThn8_N3aaa9GG22123333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123333barEv,_ZThn20_N3aaa9GG22123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22123333fooEv,_ZThn20_N3aaa9GG22123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123333fooEv,_ZThn28_N3aaa9GG22123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22123333barEv,_ZThn28_N3aaa9GG22123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2212333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2212333E[];
Class_Descriptor cd__ZN3aaa9GG2212333E = {  "_ZN3aaa9GG2212333E", // class name
  bases__ZN3aaa9GG2212333E, 6,
  &(vtc__ZN3aaa9GG2212333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2212333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2212333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213111  : ::aaa::EE221 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22131113fooEv
  ~GG2213111(); // tgen
  GG2213111(); // tgen
};
//SIG(1 _ZN3aaa9GG2213111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22131113fooEv");}
aaa::GG2213111 ::~GG2213111(){ note_dtor("_ZN3aaa9GG2213111E", this);} // tgen
aaa::GG2213111 ::GG2213111(){ note_ctor("_ZN3aaa9GG2213111E", this);} // tgen
}
static void Test__ZN3aaa9GG2213111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213111E, buf);
    ::aaa::GG2213111 *dp, &lv = *(dp=new (buf) ::aaa::GG2213111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213111E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2213111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2213111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2213111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213111E);
    dp->::aaa::GG2213111::~GG2213111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213111E(Test__ZN3aaa9GG2213111E, "_ZN3aaa9GG2213111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213111C1Ev();
extern void _ZN3aaa9GG2213111D1Ev();
Name_Map name_map__ZN3aaa9GG2213111E[] = {
  NSPAIR(_ZN3aaa9GG2213111C1Ev),
  NSPAIR(_ZN3aaa9GG2213111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2213111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22131113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22131113fooEv,_ZThn20_N3aaa9GG22131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22131113fooEv,_ZThn28_N3aaa9GG22131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22131113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131113fooEv,_ZThn20_N3aaa9GG22131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22131113fooEv,_ZThn28_N3aaa9GG22131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213111E[];
Class_Descriptor cd__ZN3aaa9GG2213111E = {  "_ZN3aaa9GG2213111E", // class name
  bases__ZN3aaa9GG2213111E, 6,
  &(vtc__ZN3aaa9GG2213111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213112  : ::aaa::EE221 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22131123barEv
  ~GG2213112(); // tgen
  GG2213112(); // tgen
};
//SIG(1 _ZN3aaa9GG2213112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22131123barEv");}
aaa::GG2213112 ::~GG2213112(){ note_dtor("_ZN3aaa9GG2213112E", this);} // tgen
aaa::GG2213112 ::GG2213112(){ note_ctor("_ZN3aaa9GG2213112E", this);} // tgen
}
static void Test__ZN3aaa9GG2213112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213112E, buf);
    ::aaa::GG2213112 *dp, &lv = *(dp=new (buf) ::aaa::GG2213112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213112E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2213112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2213112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2213112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213112E);
    dp->::aaa::GG2213112::~GG2213112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213112E(Test__ZN3aaa9GG2213112E, "_ZN3aaa9GG2213112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213112C1Ev();
extern void _ZN3aaa9GG2213112D1Ev();
Name_Map name_map__ZN3aaa9GG2213112E[] = {
  NSPAIR(_ZN3aaa9GG2213112C1Ev),
  NSPAIR(_ZN3aaa9GG2213112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2213112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213112E[];
extern void _ZN3aaa9GG22131123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22131123barEv,_ZThn8_N3aaa9GG22131123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22131123barEv,_ZThn20_N3aaa9GG22131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22131123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22131123barEv,_ZThn8_N3aaa9GG22131123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131123barEv,_ZThn20_N3aaa9GG22131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213112E[];
Class_Descriptor cd__ZN3aaa9GG2213112E = {  "_ZN3aaa9GG2213112E", // class name
  bases__ZN3aaa9GG2213112E, 6,
  &(vtc__ZN3aaa9GG2213112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213113  : ::aaa::EE221 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22131133fooEv
  virtual void  bar(); // _ZN3aaa9GG22131133barEv
  ~GG2213113(); // tgen
  GG2213113(); // tgen
};
//SIG(1 _ZN3aaa9GG2213113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22131133fooEv");}
void  aaa::GG2213113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22131133barEv");}
aaa::GG2213113 ::~GG2213113(){ note_dtor("_ZN3aaa9GG2213113E", this);} // tgen
aaa::GG2213113 ::GG2213113(){ note_ctor("_ZN3aaa9GG2213113E", this);} // tgen
}
static void Test__ZN3aaa9GG2213113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213113E, buf);
    ::aaa::GG2213113 *dp, &lv = *(dp=new (buf) ::aaa::GG2213113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213113E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2213113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2213113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2213113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213113E);
    dp->::aaa::GG2213113::~GG2213113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213113E(Test__ZN3aaa9GG2213113E, "_ZN3aaa9GG2213113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213113C1Ev();
extern void _ZN3aaa9GG2213113D1Ev();
Name_Map name_map__ZN3aaa9GG2213113E[] = {
  NSPAIR(_ZN3aaa9GG2213113C1Ev),
  NSPAIR(_ZN3aaa9GG2213113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2213113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213113E[];
extern void _ZN3aaa9GG22131133barEv();
extern void _ZN3aaa9GG22131133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22131133barEv,_ZThn8_N3aaa9GG22131133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22131133fooEv,_ZThn20_N3aaa9GG22131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22131133barEv,_ZThn20_N3aaa9GG22131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22131133fooEv,_ZThn28_N3aaa9GG22131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22131133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22131133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22131133barEv,_ZThn8_N3aaa9GG22131133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131133fooEv,_ZThn20_N3aaa9GG22131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131133barEv,_ZThn20_N3aaa9GG22131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22131133fooEv,_ZThn28_N3aaa9GG22131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213113E[];
Class_Descriptor cd__ZN3aaa9GG2213113E = {  "_ZN3aaa9GG2213113E", // class name
  bases__ZN3aaa9GG2213113E, 6,
  &(vtc__ZN3aaa9GG2213113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213121  : ::aaa::EE221 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22131213fooEv
  ~GG2213121(); // tgen
  GG2213121(); // tgen
};
//SIG(1 _ZN3aaa9GG2213121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22131213fooEv");}
aaa::GG2213121 ::~GG2213121(){ note_dtor("_ZN3aaa9GG2213121E", this);} // tgen
aaa::GG2213121 ::GG2213121(){ note_ctor("_ZN3aaa9GG2213121E", this);} // tgen
}
static void Test__ZN3aaa9GG2213121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213121E, buf);
    ::aaa::GG2213121 *dp, &lv = *(dp=new (buf) ::aaa::GG2213121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213121E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2213121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2213121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2213121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213121E);
    dp->::aaa::GG2213121::~GG2213121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213121E(Test__ZN3aaa9GG2213121E, "_ZN3aaa9GG2213121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213121C1Ev();
extern void _ZN3aaa9GG2213121D1Ev();
Name_Map name_map__ZN3aaa9GG2213121E[] = {
  NSPAIR(_ZN3aaa9GG2213121C1Ev),
  NSPAIR(_ZN3aaa9GG2213121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2213121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22131213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22131213fooEv,_ZThn20_N3aaa9GG22131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22131213fooEv,_ZThn28_N3aaa9GG22131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22131213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131213fooEv,_ZThn20_N3aaa9GG22131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22131213fooEv,_ZThn28_N3aaa9GG22131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213121E[];
Class_Descriptor cd__ZN3aaa9GG2213121E = {  "_ZN3aaa9GG2213121E", // class name
  bases__ZN3aaa9GG2213121E, 6,
  &(vtc__ZN3aaa9GG2213121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213122  : ::aaa::EE221 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22131223barEv
  ~GG2213122(); // tgen
  GG2213122(); // tgen
};
//SIG(1 _ZN3aaa9GG2213122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22131223barEv");}
aaa::GG2213122 ::~GG2213122(){ note_dtor("_ZN3aaa9GG2213122E", this);} // tgen
aaa::GG2213122 ::GG2213122(){ note_ctor("_ZN3aaa9GG2213122E", this);} // tgen
}
static void Test__ZN3aaa9GG2213122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213122E, buf);
    ::aaa::GG2213122 *dp, &lv = *(dp=new (buf) ::aaa::GG2213122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213122E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2213122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2213122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2213122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213122E);
    dp->::aaa::GG2213122::~GG2213122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213122E(Test__ZN3aaa9GG2213122E, "_ZN3aaa9GG2213122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213122C1Ev();
extern void _ZN3aaa9GG2213122D1Ev();
Name_Map name_map__ZN3aaa9GG2213122E[] = {
  NSPAIR(_ZN3aaa9GG2213122C1Ev),
  NSPAIR(_ZN3aaa9GG2213122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2213122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213122E[];
extern void _ZN3aaa9GG22131223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22131223barEv,_ZThn8_N3aaa9GG22131223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22131223barEv,_ZThn20_N3aaa9GG22131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22131223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22131223barEv,_ZThn8_N3aaa9GG22131223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131223barEv,_ZThn20_N3aaa9GG22131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213122E[];
Class_Descriptor cd__ZN3aaa9GG2213122E = {  "_ZN3aaa9GG2213122E", // class name
  bases__ZN3aaa9GG2213122E, 6,
  &(vtc__ZN3aaa9GG2213122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213123  : ::aaa::EE221 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22131233fooEv
  virtual void  bar(); // _ZN3aaa9GG22131233barEv
  ~GG2213123(); // tgen
  GG2213123(); // tgen
};
//SIG(1 _ZN3aaa9GG2213123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22131233fooEv");}
void  aaa::GG2213123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22131233barEv");}
aaa::GG2213123 ::~GG2213123(){ note_dtor("_ZN3aaa9GG2213123E", this);} // tgen
aaa::GG2213123 ::GG2213123(){ note_ctor("_ZN3aaa9GG2213123E", this);} // tgen
}
static void Test__ZN3aaa9GG2213123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213123E, buf);
    ::aaa::GG2213123 *dp, &lv = *(dp=new (buf) ::aaa::GG2213123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213123E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2213123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2213123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2213123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213123E);
    dp->::aaa::GG2213123::~GG2213123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213123E(Test__ZN3aaa9GG2213123E, "_ZN3aaa9GG2213123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213123C1Ev();
extern void _ZN3aaa9GG2213123D1Ev();
Name_Map name_map__ZN3aaa9GG2213123E[] = {
  NSPAIR(_ZN3aaa9GG2213123C1Ev),
  NSPAIR(_ZN3aaa9GG2213123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2213123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213123E[];
extern void _ZN3aaa9GG22131233barEv();
extern void _ZN3aaa9GG22131233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22131233barEv,_ZThn8_N3aaa9GG22131233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22131233fooEv,_ZThn20_N3aaa9GG22131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22131233barEv,_ZThn20_N3aaa9GG22131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22131233fooEv,_ZThn28_N3aaa9GG22131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22131233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22131233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22131233barEv,_ZThn8_N3aaa9GG22131233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131233fooEv,_ZThn20_N3aaa9GG22131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131233barEv,_ZThn20_N3aaa9GG22131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22131233fooEv,_ZThn28_N3aaa9GG22131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213123E[];
Class_Descriptor cd__ZN3aaa9GG2213123E = {  "_ZN3aaa9GG2213123E", // class name
  bases__ZN3aaa9GG2213123E, 6,
  &(vtc__ZN3aaa9GG2213123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213131  : ::aaa::EE221 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22131313fooEv
  ~GG2213131(); // tgen
  GG2213131(); // tgen
};
//SIG(1 _ZN3aaa9GG2213131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22131313fooEv");}
aaa::GG2213131 ::~GG2213131(){ note_dtor("_ZN3aaa9GG2213131E", this);} // tgen
aaa::GG2213131 ::GG2213131(){ note_ctor("_ZN3aaa9GG2213131E", this);} // tgen
}
static void Test__ZN3aaa9GG2213131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213131E, buf);
    ::aaa::GG2213131 *dp, &lv = *(dp=new (buf) ::aaa::GG2213131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213131E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2213131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2213131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2213131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213131E);
    dp->::aaa::GG2213131::~GG2213131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213131E(Test__ZN3aaa9GG2213131E, "_ZN3aaa9GG2213131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213131C1Ev();
extern void _ZN3aaa9GG2213131D1Ev();
Name_Map name_map__ZN3aaa9GG2213131E[] = {
  NSPAIR(_ZN3aaa9GG2213131C1Ev),
  NSPAIR(_ZN3aaa9GG2213131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2213131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22131313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22131313fooEv,_ZThn20_N3aaa9GG22131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22131313fooEv,_ZThn28_N3aaa9GG22131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22131313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131313fooEv,_ZThn20_N3aaa9GG22131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22131313fooEv,_ZThn28_N3aaa9GG22131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213131E[];
Class_Descriptor cd__ZN3aaa9GG2213131E = {  "_ZN3aaa9GG2213131E", // class name
  bases__ZN3aaa9GG2213131E, 6,
  &(vtc__ZN3aaa9GG2213131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213132  : ::aaa::EE221 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22131323barEv
  ~GG2213132(); // tgen
  GG2213132(); // tgen
};
//SIG(1 _ZN3aaa9GG2213132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22131323barEv");}
aaa::GG2213132 ::~GG2213132(){ note_dtor("_ZN3aaa9GG2213132E", this);} // tgen
aaa::GG2213132 ::GG2213132(){ note_ctor("_ZN3aaa9GG2213132E", this);} // tgen
}
static void Test__ZN3aaa9GG2213132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213132E, buf);
    ::aaa::GG2213132 *dp, &lv = *(dp=new (buf) ::aaa::GG2213132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213132E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2213132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2213132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2213132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213132E);
    dp->::aaa::GG2213132::~GG2213132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213132E(Test__ZN3aaa9GG2213132E, "_ZN3aaa9GG2213132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213132C1Ev();
extern void _ZN3aaa9GG2213132D1Ev();
Name_Map name_map__ZN3aaa9GG2213132E[] = {
  NSPAIR(_ZN3aaa9GG2213132C1Ev),
  NSPAIR(_ZN3aaa9GG2213132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2213132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213132E[];
extern void _ZN3aaa9GG22131323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22131323barEv,_ZThn8_N3aaa9GG22131323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22131323barEv,_ZThn20_N3aaa9GG22131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22131323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22131323barEv,_ZThn8_N3aaa9GG22131323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131323barEv,_ZThn20_N3aaa9GG22131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213132E[];
Class_Descriptor cd__ZN3aaa9GG2213132E = {  "_ZN3aaa9GG2213132E", // class name
  bases__ZN3aaa9GG2213132E, 6,
  &(vtc__ZN3aaa9GG2213132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213133  : ::aaa::EE221 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22131333fooEv
  virtual void  bar(); // _ZN3aaa9GG22131333barEv
  ~GG2213133(); // tgen
  GG2213133(); // tgen
};
//SIG(1 _ZN3aaa9GG2213133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22131333fooEv");}
void  aaa::GG2213133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22131333barEv");}
aaa::GG2213133 ::~GG2213133(){ note_dtor("_ZN3aaa9GG2213133E", this);} // tgen
aaa::GG2213133 ::GG2213133(){ note_ctor("_ZN3aaa9GG2213133E", this);} // tgen
}
static void Test__ZN3aaa9GG2213133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213133E, buf);
    ::aaa::GG2213133 *dp, &lv = *(dp=new (buf) ::aaa::GG2213133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213133E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2213133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2213133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2213133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213133E);
    dp->::aaa::GG2213133::~GG2213133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213133E(Test__ZN3aaa9GG2213133E, "_ZN3aaa9GG2213133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213133C1Ev();
extern void _ZN3aaa9GG2213133D1Ev();
Name_Map name_map__ZN3aaa9GG2213133E[] = {
  NSPAIR(_ZN3aaa9GG2213133C1Ev),
  NSPAIR(_ZN3aaa9GG2213133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2213133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213133E[];
extern void _ZN3aaa9GG22131333barEv();
extern void _ZN3aaa9GG22131333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22131333barEv,_ZThn8_N3aaa9GG22131333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22131333fooEv,_ZThn20_N3aaa9GG22131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22131333barEv,_ZThn20_N3aaa9GG22131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22131333fooEv,_ZThn28_N3aaa9GG22131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22131333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22131333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22131333barEv,_ZThn8_N3aaa9GG22131333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131333fooEv,_ZThn20_N3aaa9GG22131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22131333barEv,_ZThn20_N3aaa9GG22131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22131333fooEv,_ZThn28_N3aaa9GG22131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213133E[];
Class_Descriptor cd__ZN3aaa9GG2213133E = {  "_ZN3aaa9GG2213133E", // class name
  bases__ZN3aaa9GG2213133E, 6,
  &(vtc__ZN3aaa9GG2213133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213211  : ::aaa::EE221 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22132113fooEv
  ~GG2213211(); // tgen
  GG2213211(); // tgen
};
//SIG(1 _ZN3aaa9GG2213211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22132113fooEv");}
aaa::GG2213211 ::~GG2213211(){ note_dtor("_ZN3aaa9GG2213211E", this);} // tgen
aaa::GG2213211 ::GG2213211(){ note_ctor("_ZN3aaa9GG2213211E", this);} // tgen
}
static void Test__ZN3aaa9GG2213211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213211E, buf);
    ::aaa::GG2213211 *dp, &lv = *(dp=new (buf) ::aaa::GG2213211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213211E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2213211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2213211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2213211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213211E);
    dp->::aaa::GG2213211::~GG2213211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213211E(Test__ZN3aaa9GG2213211E, "_ZN3aaa9GG2213211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213211C1Ev();
extern void _ZN3aaa9GG2213211D1Ev();
Name_Map name_map__ZN3aaa9GG2213211E[] = {
  NSPAIR(_ZN3aaa9GG2213211C1Ev),
  NSPAIR(_ZN3aaa9GG2213211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2213211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22132113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22132113fooEv,_ZThn20_N3aaa9GG22132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22132113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132113fooEv,_ZThn20_N3aaa9GG22132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213211E[];
Class_Descriptor cd__ZN3aaa9GG2213211E = {  "_ZN3aaa9GG2213211E", // class name
  bases__ZN3aaa9GG2213211E, 6,
  &(vtc__ZN3aaa9GG2213211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213212  : ::aaa::EE221 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22132123barEv
  ~GG2213212(); // tgen
  GG2213212(); // tgen
};
//SIG(1 _ZN3aaa9GG2213212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22132123barEv");}
aaa::GG2213212 ::~GG2213212(){ note_dtor("_ZN3aaa9GG2213212E", this);} // tgen
aaa::GG2213212 ::GG2213212(){ note_ctor("_ZN3aaa9GG2213212E", this);} // tgen
}
static void Test__ZN3aaa9GG2213212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213212E, buf);
    ::aaa::GG2213212 *dp, &lv = *(dp=new (buf) ::aaa::GG2213212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213212E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2213212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2213212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2213212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213212E);
    dp->::aaa::GG2213212::~GG2213212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213212E(Test__ZN3aaa9GG2213212E, "_ZN3aaa9GG2213212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213212C1Ev();
extern void _ZN3aaa9GG2213212D1Ev();
Name_Map name_map__ZN3aaa9GG2213212E[] = {
  NSPAIR(_ZN3aaa9GG2213212C1Ev),
  NSPAIR(_ZN3aaa9GG2213212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2213212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213212E[];
extern void _ZN3aaa9GG22132123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22132123barEv,_ZThn8_N3aaa9GG22132123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22132123barEv,_ZThn20_N3aaa9GG22132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22132123barEv,_ZThn28_N3aaa9GG22132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22132123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22132123barEv,_ZThn8_N3aaa9GG22132123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132123barEv,_ZThn20_N3aaa9GG22132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22132123barEv,_ZThn28_N3aaa9GG22132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213212E[];
Class_Descriptor cd__ZN3aaa9GG2213212E = {  "_ZN3aaa9GG2213212E", // class name
  bases__ZN3aaa9GG2213212E, 6,
  &(vtc__ZN3aaa9GG2213212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213213  : ::aaa::EE221 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22132133fooEv
  virtual void  bar(); // _ZN3aaa9GG22132133barEv
  ~GG2213213(); // tgen
  GG2213213(); // tgen
};
//SIG(1 _ZN3aaa9GG2213213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22132133fooEv");}
void  aaa::GG2213213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22132133barEv");}
aaa::GG2213213 ::~GG2213213(){ note_dtor("_ZN3aaa9GG2213213E", this);} // tgen
aaa::GG2213213 ::GG2213213(){ note_ctor("_ZN3aaa9GG2213213E", this);} // tgen
}
static void Test__ZN3aaa9GG2213213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213213E, buf);
    ::aaa::GG2213213 *dp, &lv = *(dp=new (buf) ::aaa::GG2213213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213213E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2213213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2213213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2213213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213213E);
    dp->::aaa::GG2213213::~GG2213213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213213E(Test__ZN3aaa9GG2213213E, "_ZN3aaa9GG2213213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213213C1Ev();
extern void _ZN3aaa9GG2213213D1Ev();
Name_Map name_map__ZN3aaa9GG2213213E[] = {
  NSPAIR(_ZN3aaa9GG2213213C1Ev),
  NSPAIR(_ZN3aaa9GG2213213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2213213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213213E[];
extern void _ZN3aaa9GG22132133barEv();
extern void _ZN3aaa9GG22132133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22132133barEv,_ZThn8_N3aaa9GG22132133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22132133fooEv,_ZThn20_N3aaa9GG22132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22132133barEv,_ZThn20_N3aaa9GG22132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22132133barEv,_ZThn28_N3aaa9GG22132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22132133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22132133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22132133barEv,_ZThn8_N3aaa9GG22132133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132133fooEv,_ZThn20_N3aaa9GG22132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132133barEv,_ZThn20_N3aaa9GG22132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22132133barEv,_ZThn28_N3aaa9GG22132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213213E[];
Class_Descriptor cd__ZN3aaa9GG2213213E = {  "_ZN3aaa9GG2213213E", // class name
  bases__ZN3aaa9GG2213213E, 6,
  &(vtc__ZN3aaa9GG2213213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213221  : ::aaa::EE221 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22132213fooEv
  ~GG2213221(); // tgen
  GG2213221(); // tgen
};
//SIG(1 _ZN3aaa9GG2213221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22132213fooEv");}
aaa::GG2213221 ::~GG2213221(){ note_dtor("_ZN3aaa9GG2213221E", this);} // tgen
aaa::GG2213221 ::GG2213221(){ note_ctor("_ZN3aaa9GG2213221E", this);} // tgen
}
static void Test__ZN3aaa9GG2213221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213221E, buf);
    ::aaa::GG2213221 *dp, &lv = *(dp=new (buf) ::aaa::GG2213221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213221E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2213221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2213221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2213221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213221E);
    dp->::aaa::GG2213221::~GG2213221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213221E(Test__ZN3aaa9GG2213221E, "_ZN3aaa9GG2213221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213221C1Ev();
extern void _ZN3aaa9GG2213221D1Ev();
Name_Map name_map__ZN3aaa9GG2213221E[] = {
  NSPAIR(_ZN3aaa9GG2213221C1Ev),
  NSPAIR(_ZN3aaa9GG2213221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2213221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22132213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22132213fooEv,_ZThn20_N3aaa9GG22132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22132213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132213fooEv,_ZThn20_N3aaa9GG22132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213221E[];
Class_Descriptor cd__ZN3aaa9GG2213221E = {  "_ZN3aaa9GG2213221E", // class name
  bases__ZN3aaa9GG2213221E, 6,
  &(vtc__ZN3aaa9GG2213221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213222  : ::aaa::EE221 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22132223barEv
  ~GG2213222(); // tgen
  GG2213222(); // tgen
};
//SIG(1 _ZN3aaa9GG2213222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22132223barEv");}
aaa::GG2213222 ::~GG2213222(){ note_dtor("_ZN3aaa9GG2213222E", this);} // tgen
aaa::GG2213222 ::GG2213222(){ note_ctor("_ZN3aaa9GG2213222E", this);} // tgen
}
static void Test__ZN3aaa9GG2213222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213222E, buf);
    ::aaa::GG2213222 *dp, &lv = *(dp=new (buf) ::aaa::GG2213222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213222E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2213222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2213222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2213222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213222E);
    dp->::aaa::GG2213222::~GG2213222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213222E(Test__ZN3aaa9GG2213222E, "_ZN3aaa9GG2213222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213222C1Ev();
extern void _ZN3aaa9GG2213222D1Ev();
Name_Map name_map__ZN3aaa9GG2213222E[] = {
  NSPAIR(_ZN3aaa9GG2213222C1Ev),
  NSPAIR(_ZN3aaa9GG2213222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2213222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213222E[];
extern void _ZN3aaa9GG22132223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22132223barEv,_ZThn8_N3aaa9GG22132223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22132223barEv,_ZThn20_N3aaa9GG22132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22132223barEv,_ZThn28_N3aaa9GG22132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22132223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22132223barEv,_ZThn8_N3aaa9GG22132223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132223barEv,_ZThn20_N3aaa9GG22132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22132223barEv,_ZThn28_N3aaa9GG22132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213222E[];
Class_Descriptor cd__ZN3aaa9GG2213222E = {  "_ZN3aaa9GG2213222E", // class name
  bases__ZN3aaa9GG2213222E, 6,
  &(vtc__ZN3aaa9GG2213222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213223  : ::aaa::EE221 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22132233fooEv
  virtual void  bar(); // _ZN3aaa9GG22132233barEv
  ~GG2213223(); // tgen
  GG2213223(); // tgen
};
//SIG(1 _ZN3aaa9GG2213223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22132233fooEv");}
void  aaa::GG2213223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22132233barEv");}
aaa::GG2213223 ::~GG2213223(){ note_dtor("_ZN3aaa9GG2213223E", this);} // tgen
aaa::GG2213223 ::GG2213223(){ note_ctor("_ZN3aaa9GG2213223E", this);} // tgen
}
static void Test__ZN3aaa9GG2213223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213223E, buf);
    ::aaa::GG2213223 *dp, &lv = *(dp=new (buf) ::aaa::GG2213223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213223E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2213223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2213223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2213223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213223E);
    dp->::aaa::GG2213223::~GG2213223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213223E(Test__ZN3aaa9GG2213223E, "_ZN3aaa9GG2213223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213223C1Ev();
extern void _ZN3aaa9GG2213223D1Ev();
Name_Map name_map__ZN3aaa9GG2213223E[] = {
  NSPAIR(_ZN3aaa9GG2213223C1Ev),
  NSPAIR(_ZN3aaa9GG2213223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2213223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213223E[];
extern void _ZN3aaa9GG22132233barEv();
extern void _ZN3aaa9GG22132233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22132233barEv,_ZThn8_N3aaa9GG22132233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22132233fooEv,_ZThn20_N3aaa9GG22132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22132233barEv,_ZThn20_N3aaa9GG22132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22132233barEv,_ZThn28_N3aaa9GG22132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22132233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22132233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22132233barEv,_ZThn8_N3aaa9GG22132233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132233fooEv,_ZThn20_N3aaa9GG22132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132233barEv,_ZThn20_N3aaa9GG22132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22132233barEv,_ZThn28_N3aaa9GG22132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213223E[];
Class_Descriptor cd__ZN3aaa9GG2213223E = {  "_ZN3aaa9GG2213223E", // class name
  bases__ZN3aaa9GG2213223E, 6,
  &(vtc__ZN3aaa9GG2213223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213231  : ::aaa::EE221 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22132313fooEv
  ~GG2213231(); // tgen
  GG2213231(); // tgen
};
//SIG(1 _ZN3aaa9GG2213231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22132313fooEv");}
aaa::GG2213231 ::~GG2213231(){ note_dtor("_ZN3aaa9GG2213231E", this);} // tgen
aaa::GG2213231 ::GG2213231(){ note_ctor("_ZN3aaa9GG2213231E", this);} // tgen
}
static void Test__ZN3aaa9GG2213231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213231E, buf);
    ::aaa::GG2213231 *dp, &lv = *(dp=new (buf) ::aaa::GG2213231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213231E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2213231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2213231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2213231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213231E);
    dp->::aaa::GG2213231::~GG2213231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213231E(Test__ZN3aaa9GG2213231E, "_ZN3aaa9GG2213231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213231C1Ev();
extern void _ZN3aaa9GG2213231D1Ev();
Name_Map name_map__ZN3aaa9GG2213231E[] = {
  NSPAIR(_ZN3aaa9GG2213231C1Ev),
  NSPAIR(_ZN3aaa9GG2213231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2213231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22132313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22132313fooEv,_ZThn20_N3aaa9GG22132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22132313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132313fooEv,_ZThn20_N3aaa9GG22132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213231E[];
Class_Descriptor cd__ZN3aaa9GG2213231E = {  "_ZN3aaa9GG2213231E", // class name
  bases__ZN3aaa9GG2213231E, 6,
  &(vtc__ZN3aaa9GG2213231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213232  : ::aaa::EE221 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22132323barEv
  ~GG2213232(); // tgen
  GG2213232(); // tgen
};
//SIG(1 _ZN3aaa9GG2213232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22132323barEv");}
aaa::GG2213232 ::~GG2213232(){ note_dtor("_ZN3aaa9GG2213232E", this);} // tgen
aaa::GG2213232 ::GG2213232(){ note_ctor("_ZN3aaa9GG2213232E", this);} // tgen
}
static void Test__ZN3aaa9GG2213232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213232E, buf);
    ::aaa::GG2213232 *dp, &lv = *(dp=new (buf) ::aaa::GG2213232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213232E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2213232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2213232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2213232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213232E);
    dp->::aaa::GG2213232::~GG2213232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213232E(Test__ZN3aaa9GG2213232E, "_ZN3aaa9GG2213232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213232C1Ev();
extern void _ZN3aaa9GG2213232D1Ev();
Name_Map name_map__ZN3aaa9GG2213232E[] = {
  NSPAIR(_ZN3aaa9GG2213232C1Ev),
  NSPAIR(_ZN3aaa9GG2213232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2213232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213232E[];
extern void _ZN3aaa9GG22132323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22132323barEv,_ZThn8_N3aaa9GG22132323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22132323barEv,_ZThn20_N3aaa9GG22132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22132323barEv,_ZThn28_N3aaa9GG22132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22132323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22132323barEv,_ZThn8_N3aaa9GG22132323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132323barEv,_ZThn20_N3aaa9GG22132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22132323barEv,_ZThn28_N3aaa9GG22132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213232E[];
Class_Descriptor cd__ZN3aaa9GG2213232E = {  "_ZN3aaa9GG2213232E", // class name
  bases__ZN3aaa9GG2213232E, 6,
  &(vtc__ZN3aaa9GG2213232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213233  : ::aaa::EE221 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22132333fooEv
  virtual void  bar(); // _ZN3aaa9GG22132333barEv
  ~GG2213233(); // tgen
  GG2213233(); // tgen
};
//SIG(1 _ZN3aaa9GG2213233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22132333fooEv");}
void  aaa::GG2213233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22132333barEv");}
aaa::GG2213233 ::~GG2213233(){ note_dtor("_ZN3aaa9GG2213233E", this);} // tgen
aaa::GG2213233 ::GG2213233(){ note_ctor("_ZN3aaa9GG2213233E", this);} // tgen
}
static void Test__ZN3aaa9GG2213233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213233E, buf);
    ::aaa::GG2213233 *dp, &lv = *(dp=new (buf) ::aaa::GG2213233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213233E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2213233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2213233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2213233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213233E);
    dp->::aaa::GG2213233::~GG2213233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213233E(Test__ZN3aaa9GG2213233E, "_ZN3aaa9GG2213233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213233C1Ev();
extern void _ZN3aaa9GG2213233D1Ev();
Name_Map name_map__ZN3aaa9GG2213233E[] = {
  NSPAIR(_ZN3aaa9GG2213233C1Ev),
  NSPAIR(_ZN3aaa9GG2213233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2213233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213233E[];
extern void _ZN3aaa9GG22132333barEv();
extern void _ZN3aaa9GG22132333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22132333barEv,_ZThn8_N3aaa9GG22132333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22132333fooEv,_ZThn20_N3aaa9GG22132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22132333barEv,_ZThn20_N3aaa9GG22132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22132333barEv,_ZThn28_N3aaa9GG22132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22132333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22132333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22132333barEv,_ZThn8_N3aaa9GG22132333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132333fooEv,_ZThn20_N3aaa9GG22132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22132333barEv,_ZThn20_N3aaa9GG22132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22132333barEv,_ZThn28_N3aaa9GG22132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213233E[];
Class_Descriptor cd__ZN3aaa9GG2213233E = {  "_ZN3aaa9GG2213233E", // class name
  bases__ZN3aaa9GG2213233E, 6,
  &(vtc__ZN3aaa9GG2213233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213311  : ::aaa::EE221 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22133113fooEv
  ~GG2213311(); // tgen
  GG2213311(); // tgen
};
//SIG(1 _ZN3aaa9GG2213311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 v5 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22133113fooEv");}
aaa::GG2213311 ::~GG2213311(){ note_dtor("_ZN3aaa9GG2213311E", this);} // tgen
aaa::GG2213311 ::GG2213311(){ note_ctor("_ZN3aaa9GG2213311E", this);} // tgen
}
static void Test__ZN3aaa9GG2213311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213311E, buf);
    ::aaa::GG2213311 *dp, &lv = *(dp=new (buf) ::aaa::GG2213311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213311E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2213311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2213311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2213311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213311E);
    dp->::aaa::GG2213311::~GG2213311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213311E(Test__ZN3aaa9GG2213311E, "_ZN3aaa9GG2213311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213311C1Ev();
extern void _ZN3aaa9GG2213311D1Ev();
Name_Map name_map__ZN3aaa9GG2213311E[] = {
  NSPAIR(_ZN3aaa9GG2213311C1Ev),
  NSPAIR(_ZN3aaa9GG2213311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2213311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22133113fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22133113fooEv,_ZThn20_N3aaa9GG22133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22133113fooEv,_ZThn28_N3aaa9GG22133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22133113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133113fooEv,_ZThn20_N3aaa9GG22133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133113fooEv,_ZThn28_N3aaa9GG22133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213311E[];
Class_Descriptor cd__ZN3aaa9GG2213311E = {  "_ZN3aaa9GG2213311E", // class name
  bases__ZN3aaa9GG2213311E, 6,
  &(vtc__ZN3aaa9GG2213311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213312  : ::aaa::EE221 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22133123barEv
  ~GG2213312(); // tgen
  GG2213312(); // tgen
};
//SIG(1 _ZN3aaa9GG2213312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22133123barEv");}
aaa::GG2213312 ::~GG2213312(){ note_dtor("_ZN3aaa9GG2213312E", this);} // tgen
aaa::GG2213312 ::GG2213312(){ note_ctor("_ZN3aaa9GG2213312E", this);} // tgen
}
static void Test__ZN3aaa9GG2213312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213312E, buf);
    ::aaa::GG2213312 *dp, &lv = *(dp=new (buf) ::aaa::GG2213312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213312E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2213312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2213312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2213312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213312E);
    dp->::aaa::GG2213312::~GG2213312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213312E(Test__ZN3aaa9GG2213312E, "_ZN3aaa9GG2213312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213312C1Ev();
extern void _ZN3aaa9GG2213312D1Ev();
Name_Map name_map__ZN3aaa9GG2213312E[] = {
  NSPAIR(_ZN3aaa9GG2213312C1Ev),
  NSPAIR(_ZN3aaa9GG2213312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2213312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213312E[];
extern void _ZN3aaa9GG22133123barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22133123barEv,_ZThn8_N3aaa9GG22133123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22133123barEv,_ZThn20_N3aaa9GG22133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22133123barEv,_ZThn28_N3aaa9GG22133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22133123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22133123barEv,_ZThn8_N3aaa9GG22133123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133123barEv,_ZThn20_N3aaa9GG22133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133123barEv,_ZThn28_N3aaa9GG22133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213312E[];
Class_Descriptor cd__ZN3aaa9GG2213312E = {  "_ZN3aaa9GG2213312E", // class name
  bases__ZN3aaa9GG2213312E, 6,
  &(vtc__ZN3aaa9GG2213312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213313  : ::aaa::EE221 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22133133fooEv
  virtual void  bar(); // _ZN3aaa9GG22133133barEv
  ~GG2213313(); // tgen
  GG2213313(); // tgen
};
//SIG(1 _ZN3aaa9GG2213313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22133133fooEv");}
void  aaa::GG2213313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22133133barEv");}
aaa::GG2213313 ::~GG2213313(){ note_dtor("_ZN3aaa9GG2213313E", this);} // tgen
aaa::GG2213313 ::GG2213313(){ note_ctor("_ZN3aaa9GG2213313E", this);} // tgen
}
static void Test__ZN3aaa9GG2213313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213313E, buf);
    ::aaa::GG2213313 *dp, &lv = *(dp=new (buf) ::aaa::GG2213313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213313E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2213313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2213313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2213313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213313E);
    dp->::aaa::GG2213313::~GG2213313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213313E(Test__ZN3aaa9GG2213313E, "_ZN3aaa9GG2213313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213313C1Ev();
extern void _ZN3aaa9GG2213313D1Ev();
Name_Map name_map__ZN3aaa9GG2213313E[] = {
  NSPAIR(_ZN3aaa9GG2213313C1Ev),
  NSPAIR(_ZN3aaa9GG2213313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2213313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213313E[];
extern void _ZN3aaa9GG22133133barEv();
extern void _ZN3aaa9GG22133133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22133133barEv,_ZThn8_N3aaa9GG22133133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22133133fooEv,_ZThn20_N3aaa9GG22133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22133133barEv,_ZThn20_N3aaa9GG22133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22133133fooEv,_ZThn28_N3aaa9GG22133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22133133barEv,_ZThn28_N3aaa9GG22133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22133133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22133133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22133133barEv,_ZThn8_N3aaa9GG22133133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133133fooEv,_ZThn20_N3aaa9GG22133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133133barEv,_ZThn20_N3aaa9GG22133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133133fooEv,_ZThn28_N3aaa9GG22133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133133barEv,_ZThn28_N3aaa9GG22133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213313E[];
Class_Descriptor cd__ZN3aaa9GG2213313E = {  "_ZN3aaa9GG2213313E", // class name
  bases__ZN3aaa9GG2213313E, 6,
  &(vtc__ZN3aaa9GG2213313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213321  : ::aaa::EE221 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22133213fooEv
  ~GG2213321(); // tgen
  GG2213321(); // tgen
};
//SIG(1 _ZN3aaa9GG2213321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22133213fooEv");}
aaa::GG2213321 ::~GG2213321(){ note_dtor("_ZN3aaa9GG2213321E", this);} // tgen
aaa::GG2213321 ::GG2213321(){ note_ctor("_ZN3aaa9GG2213321E", this);} // tgen
}
static void Test__ZN3aaa9GG2213321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213321E, buf);
    ::aaa::GG2213321 *dp, &lv = *(dp=new (buf) ::aaa::GG2213321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213321E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2213321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2213321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2213321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213321E);
    dp->::aaa::GG2213321::~GG2213321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213321E(Test__ZN3aaa9GG2213321E, "_ZN3aaa9GG2213321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213321C1Ev();
extern void _ZN3aaa9GG2213321D1Ev();
Name_Map name_map__ZN3aaa9GG2213321E[] = {
  NSPAIR(_ZN3aaa9GG2213321C1Ev),
  NSPAIR(_ZN3aaa9GG2213321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2213321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22133213fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22133213fooEv,_ZThn20_N3aaa9GG22133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22133213fooEv,_ZThn28_N3aaa9GG22133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22133213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133213fooEv,_ZThn20_N3aaa9GG22133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133213fooEv,_ZThn28_N3aaa9GG22133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213321E[];
Class_Descriptor cd__ZN3aaa9GG2213321E = {  "_ZN3aaa9GG2213321E", // class name
  bases__ZN3aaa9GG2213321E, 6,
  &(vtc__ZN3aaa9GG2213321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213322  : ::aaa::EE221 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22133223barEv
  ~GG2213322(); // tgen
  GG2213322(); // tgen
};
//SIG(1 _ZN3aaa9GG2213322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22133223barEv");}
aaa::GG2213322 ::~GG2213322(){ note_dtor("_ZN3aaa9GG2213322E", this);} // tgen
aaa::GG2213322 ::GG2213322(){ note_ctor("_ZN3aaa9GG2213322E", this);} // tgen
}
static void Test__ZN3aaa9GG2213322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213322E, buf);
    ::aaa::GG2213322 *dp, &lv = *(dp=new (buf) ::aaa::GG2213322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213322E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2213322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2213322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2213322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213322E);
    dp->::aaa::GG2213322::~GG2213322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213322E(Test__ZN3aaa9GG2213322E, "_ZN3aaa9GG2213322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213322C1Ev();
extern void _ZN3aaa9GG2213322D1Ev();
Name_Map name_map__ZN3aaa9GG2213322E[] = {
  NSPAIR(_ZN3aaa9GG2213322C1Ev),
  NSPAIR(_ZN3aaa9GG2213322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2213322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213322E[];
extern void _ZN3aaa9GG22133223barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22133223barEv,_ZThn8_N3aaa9GG22133223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22133223barEv,_ZThn20_N3aaa9GG22133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22133223barEv,_ZThn28_N3aaa9GG22133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22133223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22133223barEv,_ZThn8_N3aaa9GG22133223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133223barEv,_ZThn20_N3aaa9GG22133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133223barEv,_ZThn28_N3aaa9GG22133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213322E[];
Class_Descriptor cd__ZN3aaa9GG2213322E = {  "_ZN3aaa9GG2213322E", // class name
  bases__ZN3aaa9GG2213322E, 6,
  &(vtc__ZN3aaa9GG2213322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213323  : ::aaa::EE221 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22133233fooEv
  virtual void  bar(); // _ZN3aaa9GG22133233barEv
  ~GG2213323(); // tgen
  GG2213323(); // tgen
};
//SIG(1 _ZN3aaa9GG2213323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22133233fooEv");}
void  aaa::GG2213323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22133233barEv");}
aaa::GG2213323 ::~GG2213323(){ note_dtor("_ZN3aaa9GG2213323E", this);} // tgen
aaa::GG2213323 ::GG2213323(){ note_ctor("_ZN3aaa9GG2213323E", this);} // tgen
}
static void Test__ZN3aaa9GG2213323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213323E, buf);
    ::aaa::GG2213323 *dp, &lv = *(dp=new (buf) ::aaa::GG2213323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213323E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2213323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2213323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2213323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213323E);
    dp->::aaa::GG2213323::~GG2213323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213323E(Test__ZN3aaa9GG2213323E, "_ZN3aaa9GG2213323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213323C1Ev();
extern void _ZN3aaa9GG2213323D1Ev();
Name_Map name_map__ZN3aaa9GG2213323E[] = {
  NSPAIR(_ZN3aaa9GG2213323C1Ev),
  NSPAIR(_ZN3aaa9GG2213323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2213323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213323E[];
extern void _ZN3aaa9GG22133233barEv();
extern void _ZN3aaa9GG22133233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22133233barEv,_ZThn8_N3aaa9GG22133233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22133233fooEv,_ZThn20_N3aaa9GG22133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22133233barEv,_ZThn20_N3aaa9GG22133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22133233fooEv,_ZThn28_N3aaa9GG22133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22133233barEv,_ZThn28_N3aaa9GG22133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22133233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22133233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22133233barEv,_ZThn8_N3aaa9GG22133233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133233fooEv,_ZThn20_N3aaa9GG22133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133233barEv,_ZThn20_N3aaa9GG22133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133233fooEv,_ZThn28_N3aaa9GG22133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133233barEv,_ZThn28_N3aaa9GG22133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213323E[];
Class_Descriptor cd__ZN3aaa9GG2213323E = {  "_ZN3aaa9GG2213323E", // class name
  bases__ZN3aaa9GG2213323E, 6,
  &(vtc__ZN3aaa9GG2213323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213331  : ::aaa::EE221 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22133313fooEv
  ~GG2213331(); // tgen
  GG2213331(); // tgen
};
//SIG(1 _ZN3aaa9GG2213331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22133313fooEv");}
aaa::GG2213331 ::~GG2213331(){ note_dtor("_ZN3aaa9GG2213331E", this);} // tgen
aaa::GG2213331 ::GG2213331(){ note_ctor("_ZN3aaa9GG2213331E", this);} // tgen
}
static void Test__ZN3aaa9GG2213331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213331E, buf);
    ::aaa::GG2213331 *dp, &lv = *(dp=new (buf) ::aaa::GG2213331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213331E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2213331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2213331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2213331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213331E);
    dp->::aaa::GG2213331::~GG2213331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213331E(Test__ZN3aaa9GG2213331E, "_ZN3aaa9GG2213331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213331C1Ev();
extern void _ZN3aaa9GG2213331D1Ev();
Name_Map name_map__ZN3aaa9GG2213331E[] = {
  NSPAIR(_ZN3aaa9GG2213331C1Ev),
  NSPAIR(_ZN3aaa9GG2213331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2213331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG22133313fooEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22133313fooEv,_ZThn20_N3aaa9GG22133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22133313fooEv,_ZThn28_N3aaa9GG22133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22133313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133313fooEv,_ZThn20_N3aaa9GG22133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133313fooEv,_ZThn28_N3aaa9GG22133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213331E[];
Class_Descriptor cd__ZN3aaa9GG2213331E = {  "_ZN3aaa9GG2213331E", // class name
  bases__ZN3aaa9GG2213331E, 6,
  &(vtc__ZN3aaa9GG2213331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213332  : ::aaa::EE221 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22133323barEv
  ~GG2213332(); // tgen
  GG2213332(); // tgen
};
//SIG(1 _ZN3aaa9GG2213332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2213332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22133323barEv");}
aaa::GG2213332 ::~GG2213332(){ note_dtor("_ZN3aaa9GG2213332E", this);} // tgen
aaa::GG2213332 ::GG2213332(){ note_ctor("_ZN3aaa9GG2213332E", this);} // tgen
}
static void Test__ZN3aaa9GG2213332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213332E, buf);
    ::aaa::GG2213332 *dp, &lv = *(dp=new (buf) ::aaa::GG2213332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213332E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2213332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2213332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2213332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213332E);
    dp->::aaa::GG2213332::~GG2213332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213332E(Test__ZN3aaa9GG2213332E, "_ZN3aaa9GG2213332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213332C1Ev();
extern void _ZN3aaa9GG2213332D1Ev();
Name_Map name_map__ZN3aaa9GG2213332E[] = {
  NSPAIR(_ZN3aaa9GG2213332C1Ev),
  NSPAIR(_ZN3aaa9GG2213332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2213332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213332E[];
extern void _ZN3aaa9GG22133323barEv();
extern void _ZN3aaa5EE2213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22133323barEv,_ZThn8_N3aaa9GG22133323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22133323barEv,_ZThn20_N3aaa9GG22133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22133323barEv,_ZThn28_N3aaa9GG22133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22133323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22133323barEv,_ZThn8_N3aaa9GG22133323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133323barEv,_ZThn20_N3aaa9GG22133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133323barEv,_ZThn28_N3aaa9GG22133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213332E[];
Class_Descriptor cd__ZN3aaa9GG2213332E = {  "_ZN3aaa9GG2213332E", // class name
  bases__ZN3aaa9GG2213332E, 6,
  &(vtc__ZN3aaa9GG2213332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2213333  : ::aaa::EE221 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22133333fooEv
  virtual void  bar(); // _ZN3aaa9GG22133333barEv
  ~GG2213333(); // tgen
  GG2213333(); // tgen
};
//SIG(1 _ZN3aaa9GG2213333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2213333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22133333fooEv");}
void  aaa::GG2213333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22133333barEv");}
aaa::GG2213333 ::~GG2213333(){ note_dtor("_ZN3aaa9GG2213333E", this);} // tgen
aaa::GG2213333 ::GG2213333(){ note_ctor("_ZN3aaa9GG2213333E", this);} // tgen
}
static void Test__ZN3aaa9GG2213333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2213333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2213333E, buf);
    ::aaa::GG2213333 *dp, &lv = *(dp=new (buf) ::aaa::GG2213333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2213333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2213333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE221*), 0, "_ZN3aaa9GG2213333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE221*), ABISELECT(16,8), "_ZN3aaa9GG2213333E");
    check_base_class_offset(lv, (::aaa::EE221*), 0, "_ZN3aaa9GG2213333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2213333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2213333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2213333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2213333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2213333E);
    dp->::aaa::GG2213333::~GG2213333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2213333E(Test__ZN3aaa9GG2213333E, "_ZN3aaa9GG2213333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2213333C1Ev();
extern void _ZN3aaa9GG2213333D1Ev();
Name_Map name_map__ZN3aaa9GG2213333E[] = {
  NSPAIR(_ZN3aaa9GG2213333C1Ev),
  NSPAIR(_ZN3aaa9GG2213333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE221E;
extern VTBL_ENTRY _ZTIN3aaa5EE221E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE221E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2213333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE221E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2213333E[];
extern void _ZN3aaa9GG22133333barEv();
extern void _ZN3aaa9GG22133333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22133333barEv,_ZThn8_N3aaa9GG22133333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22133333fooEv,_ZThn20_N3aaa9GG22133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22133333barEv,_ZThn20_N3aaa9GG22133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22133333fooEv,_ZThn28_N3aaa9GG22133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22133333barEv,_ZThn28_N3aaa9GG22133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2213333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22133333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22133333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22133333barEv,_ZThn8_N3aaa9GG22133333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133333fooEv,_ZThn20_N3aaa9GG22133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22133333barEv,_ZThn20_N3aaa9GG22133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133333fooEv,_ZThn28_N3aaa9GG22133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22133333barEv,_ZThn28_N3aaa9GG22133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2213333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2213333E[];
Class_Descriptor cd__ZN3aaa9GG2213333E = {  "_ZN3aaa9GG2213333E", // class name
  bases__ZN3aaa9GG2213333E, 6,
  &(vtc__ZN3aaa9GG2213333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2213333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2213333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221111  : ::aaa::EE222 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22211113fooEv
  ~GG2221111(); // tgen
  GG2221111(); // tgen
};
//SIG(1 _ZN3aaa9GG2221111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22211113fooEv");}
aaa::GG2221111 ::~GG2221111(){ note_dtor("_ZN3aaa9GG2221111E", this);} // tgen
aaa::GG2221111 ::GG2221111(){ note_ctor("_ZN3aaa9GG2221111E", this);} // tgen
}
static void Test__ZN3aaa9GG2221111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221111E, buf);
    ::aaa::GG2221111 *dp, &lv = *(dp=new (buf) ::aaa::GG2221111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221111E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2221111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2221111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2221111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221111E);
    dp->::aaa::GG2221111::~GG2221111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221111E(Test__ZN3aaa9GG2221111E, "_ZN3aaa9GG2221111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221111C1Ev();
extern void _ZN3aaa9GG2221111D1Ev();
Name_Map name_map__ZN3aaa9GG2221111E[] = {
  NSPAIR(_ZN3aaa9GG2221111C1Ev),
  NSPAIR(_ZN3aaa9GG2221111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2221111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221111E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22211113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22211113fooEv,_ZThn20_N3aaa9GG22211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22211113fooEv,_ZThn28_N3aaa9GG22211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22211113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211113fooEv,_ZThn20_N3aaa9GG22211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22211113fooEv,_ZThn28_N3aaa9GG22211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221111E[];
Class_Descriptor cd__ZN3aaa9GG2221111E = {  "_ZN3aaa9GG2221111E", // class name
  bases__ZN3aaa9GG2221111E, 6,
  &(vtc__ZN3aaa9GG2221111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221112  : ::aaa::EE222 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22211123barEv
  ~GG2221112(); // tgen
  GG2221112(); // tgen
};
//SIG(1 _ZN3aaa9GG2221112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22211123barEv");}
aaa::GG2221112 ::~GG2221112(){ note_dtor("_ZN3aaa9GG2221112E", this);} // tgen
aaa::GG2221112 ::GG2221112(){ note_ctor("_ZN3aaa9GG2221112E", this);} // tgen
}
static void Test__ZN3aaa9GG2221112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221112E, buf);
    ::aaa::GG2221112 *dp, &lv = *(dp=new (buf) ::aaa::GG2221112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221112E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2221112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2221112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2221112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221112E);
    dp->::aaa::GG2221112::~GG2221112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221112E(Test__ZN3aaa9GG2221112E, "_ZN3aaa9GG2221112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221112C1Ev();
extern void _ZN3aaa9GG2221112D1Ev();
Name_Map name_map__ZN3aaa9GG2221112E[] = {
  NSPAIR(_ZN3aaa9GG2221112C1Ev),
  NSPAIR(_ZN3aaa9GG2221112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2221112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221112E[];
extern void _ZN3aaa9GG22211123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22211123barEv,_ZThn8_N3aaa9GG22211123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22211123barEv,_ZThn8_N3aaa9GG22211123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221112E[];
Class_Descriptor cd__ZN3aaa9GG2221112E = {  "_ZN3aaa9GG2221112E", // class name
  bases__ZN3aaa9GG2221112E, 6,
  &(vtc__ZN3aaa9GG2221112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221112E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221113  : ::aaa::EE222 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22211133fooEv
  virtual void  bar(); // _ZN3aaa9GG22211133barEv
  ~GG2221113(); // tgen
  GG2221113(); // tgen
};
//SIG(1 _ZN3aaa9GG2221113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22211133fooEv");}
void  aaa::GG2221113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22211133barEv");}
aaa::GG2221113 ::~GG2221113(){ note_dtor("_ZN3aaa9GG2221113E", this);} // tgen
aaa::GG2221113 ::GG2221113(){ note_ctor("_ZN3aaa9GG2221113E", this);} // tgen
}
static void Test__ZN3aaa9GG2221113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221113E, buf);
    ::aaa::GG2221113 *dp, &lv = *(dp=new (buf) ::aaa::GG2221113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221113E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2221113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2221113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2221113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221113E);
    dp->::aaa::GG2221113::~GG2221113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221113E(Test__ZN3aaa9GG2221113E, "_ZN3aaa9GG2221113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221113C1Ev();
extern void _ZN3aaa9GG2221113D1Ev();
Name_Map name_map__ZN3aaa9GG2221113E[] = {
  NSPAIR(_ZN3aaa9GG2221113C1Ev),
  NSPAIR(_ZN3aaa9GG2221113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2221113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221113E[];
extern void _ZN3aaa9GG22211133barEv();
extern void _ZN3aaa9GG22211133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22211133barEv,_ZThn8_N3aaa9GG22211133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22211133fooEv,_ZThn20_N3aaa9GG22211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22211133fooEv,_ZThn28_N3aaa9GG22211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22211133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22211133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22211133barEv,_ZThn8_N3aaa9GG22211133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211133fooEv,_ZThn20_N3aaa9GG22211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22211133fooEv,_ZThn28_N3aaa9GG22211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221113E[];
Class_Descriptor cd__ZN3aaa9GG2221113E = {  "_ZN3aaa9GG2221113E", // class name
  bases__ZN3aaa9GG2221113E, 6,
  &(vtc__ZN3aaa9GG2221113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221121  : ::aaa::EE222 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22211213fooEv
  ~GG2221121(); // tgen
  GG2221121(); // tgen
};
//SIG(1 _ZN3aaa9GG2221121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22211213fooEv");}
aaa::GG2221121 ::~GG2221121(){ note_dtor("_ZN3aaa9GG2221121E", this);} // tgen
aaa::GG2221121 ::GG2221121(){ note_ctor("_ZN3aaa9GG2221121E", this);} // tgen
}
static void Test__ZN3aaa9GG2221121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221121E, buf);
    ::aaa::GG2221121 *dp, &lv = *(dp=new (buf) ::aaa::GG2221121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221121E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2221121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2221121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2221121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221121E);
    dp->::aaa::GG2221121::~GG2221121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221121E(Test__ZN3aaa9GG2221121E, "_ZN3aaa9GG2221121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221121C1Ev();
extern void _ZN3aaa9GG2221121D1Ev();
Name_Map name_map__ZN3aaa9GG2221121E[] = {
  NSPAIR(_ZN3aaa9GG2221121C1Ev),
  NSPAIR(_ZN3aaa9GG2221121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2221121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221121E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22211213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22211213fooEv,_ZThn20_N3aaa9GG22211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22211213fooEv,_ZThn28_N3aaa9GG22211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22211213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211213fooEv,_ZThn20_N3aaa9GG22211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22211213fooEv,_ZThn28_N3aaa9GG22211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221121E[];
Class_Descriptor cd__ZN3aaa9GG2221121E = {  "_ZN3aaa9GG2221121E", // class name
  bases__ZN3aaa9GG2221121E, 6,
  &(vtc__ZN3aaa9GG2221121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221122  : ::aaa::EE222 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22211223barEv
  ~GG2221122(); // tgen
  GG2221122(); // tgen
};
//SIG(1 _ZN3aaa9GG2221122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22211223barEv");}
aaa::GG2221122 ::~GG2221122(){ note_dtor("_ZN3aaa9GG2221122E", this);} // tgen
aaa::GG2221122 ::GG2221122(){ note_ctor("_ZN3aaa9GG2221122E", this);} // tgen
}
static void Test__ZN3aaa9GG2221122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221122E, buf);
    ::aaa::GG2221122 *dp, &lv = *(dp=new (buf) ::aaa::GG2221122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221122E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2221122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2221122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2221122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221122E);
    dp->::aaa::GG2221122::~GG2221122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221122E(Test__ZN3aaa9GG2221122E, "_ZN3aaa9GG2221122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221122C1Ev();
extern void _ZN3aaa9GG2221122D1Ev();
Name_Map name_map__ZN3aaa9GG2221122E[] = {
  NSPAIR(_ZN3aaa9GG2221122C1Ev),
  NSPAIR(_ZN3aaa9GG2221122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2221122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221122E[];
extern void _ZN3aaa9GG22211223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22211223barEv,_ZThn8_N3aaa9GG22211223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22211223barEv,_ZThn20_N3aaa9GG22211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22211223barEv,_ZThn8_N3aaa9GG22211223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211223barEv,_ZThn20_N3aaa9GG22211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221122E[];
Class_Descriptor cd__ZN3aaa9GG2221122E = {  "_ZN3aaa9GG2221122E", // class name
  bases__ZN3aaa9GG2221122E, 6,
  &(vtc__ZN3aaa9GG2221122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221123  : ::aaa::EE222 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22211233fooEv
  virtual void  bar(); // _ZN3aaa9GG22211233barEv
  ~GG2221123(); // tgen
  GG2221123(); // tgen
};
//SIG(1 _ZN3aaa9GG2221123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22211233fooEv");}
void  aaa::GG2221123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22211233barEv");}
aaa::GG2221123 ::~GG2221123(){ note_dtor("_ZN3aaa9GG2221123E", this);} // tgen
aaa::GG2221123 ::GG2221123(){ note_ctor("_ZN3aaa9GG2221123E", this);} // tgen
}
static void Test__ZN3aaa9GG2221123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221123E, buf);
    ::aaa::GG2221123 *dp, &lv = *(dp=new (buf) ::aaa::GG2221123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221123E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2221123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2221123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2221123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221123E);
    dp->::aaa::GG2221123::~GG2221123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221123E(Test__ZN3aaa9GG2221123E, "_ZN3aaa9GG2221123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221123C1Ev();
extern void _ZN3aaa9GG2221123D1Ev();
Name_Map name_map__ZN3aaa9GG2221123E[] = {
  NSPAIR(_ZN3aaa9GG2221123C1Ev),
  NSPAIR(_ZN3aaa9GG2221123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2221123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221123E[];
extern void _ZN3aaa9GG22211233barEv();
extern void _ZN3aaa9GG22211233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22211233barEv,_ZThn8_N3aaa9GG22211233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22211233fooEv,_ZThn20_N3aaa9GG22211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22211233barEv,_ZThn20_N3aaa9GG22211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22211233fooEv,_ZThn28_N3aaa9GG22211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22211233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22211233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22211233barEv,_ZThn8_N3aaa9GG22211233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211233fooEv,_ZThn20_N3aaa9GG22211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211233barEv,_ZThn20_N3aaa9GG22211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22211233fooEv,_ZThn28_N3aaa9GG22211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221123E[];
Class_Descriptor cd__ZN3aaa9GG2221123E = {  "_ZN3aaa9GG2221123E", // class name
  bases__ZN3aaa9GG2221123E, 6,
  &(vtc__ZN3aaa9GG2221123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221131  : ::aaa::EE222 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22211313fooEv
  ~GG2221131(); // tgen
  GG2221131(); // tgen
};
//SIG(1 _ZN3aaa9GG2221131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22211313fooEv");}
aaa::GG2221131 ::~GG2221131(){ note_dtor("_ZN3aaa9GG2221131E", this);} // tgen
aaa::GG2221131 ::GG2221131(){ note_ctor("_ZN3aaa9GG2221131E", this);} // tgen
}
static void Test__ZN3aaa9GG2221131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221131E, buf);
    ::aaa::GG2221131 *dp, &lv = *(dp=new (buf) ::aaa::GG2221131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221131E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2221131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2221131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2221131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221131E);
    dp->::aaa::GG2221131::~GG2221131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221131E(Test__ZN3aaa9GG2221131E, "_ZN3aaa9GG2221131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221131C1Ev();
extern void _ZN3aaa9GG2221131D1Ev();
Name_Map name_map__ZN3aaa9GG2221131E[] = {
  NSPAIR(_ZN3aaa9GG2221131C1Ev),
  NSPAIR(_ZN3aaa9GG2221131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2221131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221131E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22211313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22211313fooEv,_ZThn20_N3aaa9GG22211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22211313fooEv,_ZThn28_N3aaa9GG22211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22211313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211313fooEv,_ZThn20_N3aaa9GG22211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22211313fooEv,_ZThn28_N3aaa9GG22211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221131E[];
Class_Descriptor cd__ZN3aaa9GG2221131E = {  "_ZN3aaa9GG2221131E", // class name
  bases__ZN3aaa9GG2221131E, 6,
  &(vtc__ZN3aaa9GG2221131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221132  : ::aaa::EE222 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22211323barEv
  ~GG2221132(); // tgen
  GG2221132(); // tgen
};
//SIG(1 _ZN3aaa9GG2221132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22211323barEv");}
aaa::GG2221132 ::~GG2221132(){ note_dtor("_ZN3aaa9GG2221132E", this);} // tgen
aaa::GG2221132 ::GG2221132(){ note_ctor("_ZN3aaa9GG2221132E", this);} // tgen
}
static void Test__ZN3aaa9GG2221132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221132E, buf);
    ::aaa::GG2221132 *dp, &lv = *(dp=new (buf) ::aaa::GG2221132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221132E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2221132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2221132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2221132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221132E);
    dp->::aaa::GG2221132::~GG2221132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221132E(Test__ZN3aaa9GG2221132E, "_ZN3aaa9GG2221132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221132C1Ev();
extern void _ZN3aaa9GG2221132D1Ev();
Name_Map name_map__ZN3aaa9GG2221132E[] = {
  NSPAIR(_ZN3aaa9GG2221132C1Ev),
  NSPAIR(_ZN3aaa9GG2221132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2221132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221132E[];
extern void _ZN3aaa9GG22211323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22211323barEv,_ZThn8_N3aaa9GG22211323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22211323barEv,_ZThn20_N3aaa9GG22211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22211323barEv,_ZThn8_N3aaa9GG22211323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211323barEv,_ZThn20_N3aaa9GG22211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221132E[];
Class_Descriptor cd__ZN3aaa9GG2221132E = {  "_ZN3aaa9GG2221132E", // class name
  bases__ZN3aaa9GG2221132E, 6,
  &(vtc__ZN3aaa9GG2221132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221132E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221133  : ::aaa::EE222 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22211333fooEv
  virtual void  bar(); // _ZN3aaa9GG22211333barEv
  ~GG2221133(); // tgen
  GG2221133(); // tgen
};
//SIG(1 _ZN3aaa9GG2221133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22211333fooEv");}
void  aaa::GG2221133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22211333barEv");}
aaa::GG2221133 ::~GG2221133(){ note_dtor("_ZN3aaa9GG2221133E", this);} // tgen
aaa::GG2221133 ::GG2221133(){ note_ctor("_ZN3aaa9GG2221133E", this);} // tgen
}
static void Test__ZN3aaa9GG2221133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221133E, buf);
    ::aaa::GG2221133 *dp, &lv = *(dp=new (buf) ::aaa::GG2221133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221133E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2221133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2221133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2221133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221133E);
    dp->::aaa::GG2221133::~GG2221133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221133E(Test__ZN3aaa9GG2221133E, "_ZN3aaa9GG2221133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221133C1Ev();
extern void _ZN3aaa9GG2221133D1Ev();
Name_Map name_map__ZN3aaa9GG2221133E[] = {
  NSPAIR(_ZN3aaa9GG2221133C1Ev),
  NSPAIR(_ZN3aaa9GG2221133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2221133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221133E[];
extern void _ZN3aaa9GG22211333barEv();
extern void _ZN3aaa9GG22211333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22211333barEv,_ZThn8_N3aaa9GG22211333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22211333fooEv,_ZThn20_N3aaa9GG22211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22211333barEv,_ZThn20_N3aaa9GG22211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22211333fooEv,_ZThn28_N3aaa9GG22211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22211333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22211333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22211333barEv,_ZThn8_N3aaa9GG22211333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211333fooEv,_ZThn20_N3aaa9GG22211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22211333barEv,_ZThn20_N3aaa9GG22211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22211333fooEv,_ZThn28_N3aaa9GG22211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221133E[];
Class_Descriptor cd__ZN3aaa9GG2221133E = {  "_ZN3aaa9GG2221133E", // class name
  bases__ZN3aaa9GG2221133E, 6,
  &(vtc__ZN3aaa9GG2221133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221211  : ::aaa::EE222 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22212113fooEv
  ~GG2221211(); // tgen
  GG2221211(); // tgen
};
//SIG(1 _ZN3aaa9GG2221211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22212113fooEv");}
aaa::GG2221211 ::~GG2221211(){ note_dtor("_ZN3aaa9GG2221211E", this);} // tgen
aaa::GG2221211 ::GG2221211(){ note_ctor("_ZN3aaa9GG2221211E", this);} // tgen
}
static void Test__ZN3aaa9GG2221211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221211E, buf);
    ::aaa::GG2221211 *dp, &lv = *(dp=new (buf) ::aaa::GG2221211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221211E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2221211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2221211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2221211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221211E);
    dp->::aaa::GG2221211::~GG2221211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221211E(Test__ZN3aaa9GG2221211E, "_ZN3aaa9GG2221211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221211C1Ev();
extern void _ZN3aaa9GG2221211D1Ev();
Name_Map name_map__ZN3aaa9GG2221211E[] = {
  NSPAIR(_ZN3aaa9GG2221211C1Ev),
  NSPAIR(_ZN3aaa9GG2221211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2221211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221211E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22212113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22212113fooEv,_ZThn20_N3aaa9GG22212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22212113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212113fooEv,_ZThn20_N3aaa9GG22212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221211E[];
Class_Descriptor cd__ZN3aaa9GG2221211E = {  "_ZN3aaa9GG2221211E", // class name
  bases__ZN3aaa9GG2221211E, 6,
  &(vtc__ZN3aaa9GG2221211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221212  : ::aaa::EE222 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22212123barEv
  ~GG2221212(); // tgen
  GG2221212(); // tgen
};
//SIG(1 _ZN3aaa9GG2221212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22212123barEv");}
aaa::GG2221212 ::~GG2221212(){ note_dtor("_ZN3aaa9GG2221212E", this);} // tgen
aaa::GG2221212 ::GG2221212(){ note_ctor("_ZN3aaa9GG2221212E", this);} // tgen
}
static void Test__ZN3aaa9GG2221212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221212E, buf);
    ::aaa::GG2221212 *dp, &lv = *(dp=new (buf) ::aaa::GG2221212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221212E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2221212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2221212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2221212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221212E);
    dp->::aaa::GG2221212::~GG2221212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221212E(Test__ZN3aaa9GG2221212E, "_ZN3aaa9GG2221212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221212C1Ev();
extern void _ZN3aaa9GG2221212D1Ev();
Name_Map name_map__ZN3aaa9GG2221212E[] = {
  NSPAIR(_ZN3aaa9GG2221212C1Ev),
  NSPAIR(_ZN3aaa9GG2221212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2221212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221212E[];
extern void _ZN3aaa9GG22212123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22212123barEv,_ZThn8_N3aaa9GG22212123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22212123barEv,_ZThn28_N3aaa9GG22212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22212123barEv,_ZThn8_N3aaa9GG22212123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22212123barEv,_ZThn28_N3aaa9GG22212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221212E[];
Class_Descriptor cd__ZN3aaa9GG2221212E = {  "_ZN3aaa9GG2221212E", // class name
  bases__ZN3aaa9GG2221212E, 6,
  &(vtc__ZN3aaa9GG2221212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221212E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221213  : ::aaa::EE222 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22212133fooEv
  virtual void  bar(); // _ZN3aaa9GG22212133barEv
  ~GG2221213(); // tgen
  GG2221213(); // tgen
};
//SIG(1 _ZN3aaa9GG2221213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22212133fooEv");}
void  aaa::GG2221213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22212133barEv");}
aaa::GG2221213 ::~GG2221213(){ note_dtor("_ZN3aaa9GG2221213E", this);} // tgen
aaa::GG2221213 ::GG2221213(){ note_ctor("_ZN3aaa9GG2221213E", this);} // tgen
}
static void Test__ZN3aaa9GG2221213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221213E, buf);
    ::aaa::GG2221213 *dp, &lv = *(dp=new (buf) ::aaa::GG2221213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221213E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2221213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2221213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2221213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221213E);
    dp->::aaa::GG2221213::~GG2221213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221213E(Test__ZN3aaa9GG2221213E, "_ZN3aaa9GG2221213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221213C1Ev();
extern void _ZN3aaa9GG2221213D1Ev();
Name_Map name_map__ZN3aaa9GG2221213E[] = {
  NSPAIR(_ZN3aaa9GG2221213C1Ev),
  NSPAIR(_ZN3aaa9GG2221213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2221213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221213E[];
extern void _ZN3aaa9GG22212133barEv();
extern void _ZN3aaa9GG22212133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22212133barEv,_ZThn8_N3aaa9GG22212133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22212133fooEv,_ZThn20_N3aaa9GG22212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22212133barEv,_ZThn28_N3aaa9GG22212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22212133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22212133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22212133barEv,_ZThn8_N3aaa9GG22212133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212133fooEv,_ZThn20_N3aaa9GG22212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22212133barEv,_ZThn28_N3aaa9GG22212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221213E[];
Class_Descriptor cd__ZN3aaa9GG2221213E = {  "_ZN3aaa9GG2221213E", // class name
  bases__ZN3aaa9GG2221213E, 6,
  &(vtc__ZN3aaa9GG2221213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221221  : ::aaa::EE222 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22212213fooEv
  ~GG2221221(); // tgen
  GG2221221(); // tgen
};
//SIG(1 _ZN3aaa9GG2221221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22212213fooEv");}
aaa::GG2221221 ::~GG2221221(){ note_dtor("_ZN3aaa9GG2221221E", this);} // tgen
aaa::GG2221221 ::GG2221221(){ note_ctor("_ZN3aaa9GG2221221E", this);} // tgen
}
static void Test__ZN3aaa9GG2221221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221221E, buf);
    ::aaa::GG2221221 *dp, &lv = *(dp=new (buf) ::aaa::GG2221221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221221E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2221221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2221221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2221221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221221E);
    dp->::aaa::GG2221221::~GG2221221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221221E(Test__ZN3aaa9GG2221221E, "_ZN3aaa9GG2221221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221221C1Ev();
extern void _ZN3aaa9GG2221221D1Ev();
Name_Map name_map__ZN3aaa9GG2221221E[] = {
  NSPAIR(_ZN3aaa9GG2221221C1Ev),
  NSPAIR(_ZN3aaa9GG2221221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2221221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221221E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22212213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22212213fooEv,_ZThn20_N3aaa9GG22212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22212213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212213fooEv,_ZThn20_N3aaa9GG22212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221221E[];
Class_Descriptor cd__ZN3aaa9GG2221221E = {  "_ZN3aaa9GG2221221E", // class name
  bases__ZN3aaa9GG2221221E, 6,
  &(vtc__ZN3aaa9GG2221221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221222  : ::aaa::EE222 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22212223barEv
  ~GG2221222(); // tgen
  GG2221222(); // tgen
};
//SIG(1 _ZN3aaa9GG2221222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22212223barEv");}
aaa::GG2221222 ::~GG2221222(){ note_dtor("_ZN3aaa9GG2221222E", this);} // tgen
aaa::GG2221222 ::GG2221222(){ note_ctor("_ZN3aaa9GG2221222E", this);} // tgen
}
static void Test__ZN3aaa9GG2221222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221222E, buf);
    ::aaa::GG2221222 *dp, &lv = *(dp=new (buf) ::aaa::GG2221222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221222E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2221222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2221222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2221222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221222E);
    dp->::aaa::GG2221222::~GG2221222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221222E(Test__ZN3aaa9GG2221222E, "_ZN3aaa9GG2221222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221222C1Ev();
extern void _ZN3aaa9GG2221222D1Ev();
Name_Map name_map__ZN3aaa9GG2221222E[] = {
  NSPAIR(_ZN3aaa9GG2221222C1Ev),
  NSPAIR(_ZN3aaa9GG2221222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2221222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221222E[];
extern void _ZN3aaa9GG22212223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22212223barEv,_ZThn8_N3aaa9GG22212223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22212223barEv,_ZThn20_N3aaa9GG22212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22212223barEv,_ZThn28_N3aaa9GG22212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22212223barEv,_ZThn8_N3aaa9GG22212223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212223barEv,_ZThn20_N3aaa9GG22212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22212223barEv,_ZThn28_N3aaa9GG22212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221222E[];
Class_Descriptor cd__ZN3aaa9GG2221222E = {  "_ZN3aaa9GG2221222E", // class name
  bases__ZN3aaa9GG2221222E, 6,
  &(vtc__ZN3aaa9GG2221222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221223  : ::aaa::EE222 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22212233fooEv
  virtual void  bar(); // _ZN3aaa9GG22212233barEv
  ~GG2221223(); // tgen
  GG2221223(); // tgen
};
//SIG(1 _ZN3aaa9GG2221223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22212233fooEv");}
void  aaa::GG2221223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22212233barEv");}
aaa::GG2221223 ::~GG2221223(){ note_dtor("_ZN3aaa9GG2221223E", this);} // tgen
aaa::GG2221223 ::GG2221223(){ note_ctor("_ZN3aaa9GG2221223E", this);} // tgen
}
static void Test__ZN3aaa9GG2221223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221223E, buf);
    ::aaa::GG2221223 *dp, &lv = *(dp=new (buf) ::aaa::GG2221223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221223E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2221223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2221223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2221223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221223E);
    dp->::aaa::GG2221223::~GG2221223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221223E(Test__ZN3aaa9GG2221223E, "_ZN3aaa9GG2221223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221223C1Ev();
extern void _ZN3aaa9GG2221223D1Ev();
Name_Map name_map__ZN3aaa9GG2221223E[] = {
  NSPAIR(_ZN3aaa9GG2221223C1Ev),
  NSPAIR(_ZN3aaa9GG2221223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2221223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221223E[];
extern void _ZN3aaa9GG22212233barEv();
extern void _ZN3aaa9GG22212233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22212233barEv,_ZThn8_N3aaa9GG22212233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22212233fooEv,_ZThn20_N3aaa9GG22212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22212233barEv,_ZThn20_N3aaa9GG22212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22212233barEv,_ZThn28_N3aaa9GG22212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22212233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22212233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22212233barEv,_ZThn8_N3aaa9GG22212233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212233fooEv,_ZThn20_N3aaa9GG22212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212233barEv,_ZThn20_N3aaa9GG22212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22212233barEv,_ZThn28_N3aaa9GG22212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221223E[];
Class_Descriptor cd__ZN3aaa9GG2221223E = {  "_ZN3aaa9GG2221223E", // class name
  bases__ZN3aaa9GG2221223E, 6,
  &(vtc__ZN3aaa9GG2221223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221231  : ::aaa::EE222 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22212313fooEv
  ~GG2221231(); // tgen
  GG2221231(); // tgen
};
//SIG(1 _ZN3aaa9GG2221231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22212313fooEv");}
aaa::GG2221231 ::~GG2221231(){ note_dtor("_ZN3aaa9GG2221231E", this);} // tgen
aaa::GG2221231 ::GG2221231(){ note_ctor("_ZN3aaa9GG2221231E", this);} // tgen
}
static void Test__ZN3aaa9GG2221231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221231E, buf);
    ::aaa::GG2221231 *dp, &lv = *(dp=new (buf) ::aaa::GG2221231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221231E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2221231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2221231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2221231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221231E);
    dp->::aaa::GG2221231::~GG2221231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221231E(Test__ZN3aaa9GG2221231E, "_ZN3aaa9GG2221231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221231C1Ev();
extern void _ZN3aaa9GG2221231D1Ev();
Name_Map name_map__ZN3aaa9GG2221231E[] = {
  NSPAIR(_ZN3aaa9GG2221231C1Ev),
  NSPAIR(_ZN3aaa9GG2221231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2221231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221231E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22212313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22212313fooEv,_ZThn20_N3aaa9GG22212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22212313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212313fooEv,_ZThn20_N3aaa9GG22212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221231E[];
Class_Descriptor cd__ZN3aaa9GG2221231E = {  "_ZN3aaa9GG2221231E", // class name
  bases__ZN3aaa9GG2221231E, 6,
  &(vtc__ZN3aaa9GG2221231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221232  : ::aaa::EE222 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22212323barEv
  ~GG2221232(); // tgen
  GG2221232(); // tgen
};
//SIG(1 _ZN3aaa9GG2221232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22212323barEv");}
aaa::GG2221232 ::~GG2221232(){ note_dtor("_ZN3aaa9GG2221232E", this);} // tgen
aaa::GG2221232 ::GG2221232(){ note_ctor("_ZN3aaa9GG2221232E", this);} // tgen
}
static void Test__ZN3aaa9GG2221232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221232E, buf);
    ::aaa::GG2221232 *dp, &lv = *(dp=new (buf) ::aaa::GG2221232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221232E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2221232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2221232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2221232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221232E);
    dp->::aaa::GG2221232::~GG2221232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221232E(Test__ZN3aaa9GG2221232E, "_ZN3aaa9GG2221232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221232C1Ev();
extern void _ZN3aaa9GG2221232D1Ev();
Name_Map name_map__ZN3aaa9GG2221232E[] = {
  NSPAIR(_ZN3aaa9GG2221232C1Ev),
  NSPAIR(_ZN3aaa9GG2221232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2221232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221232E[];
extern void _ZN3aaa9GG22212323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22212323barEv,_ZThn8_N3aaa9GG22212323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22212323barEv,_ZThn20_N3aaa9GG22212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22212323barEv,_ZThn28_N3aaa9GG22212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22212323barEv,_ZThn8_N3aaa9GG22212323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212323barEv,_ZThn20_N3aaa9GG22212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22212323barEv,_ZThn28_N3aaa9GG22212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221232E[];
Class_Descriptor cd__ZN3aaa9GG2221232E = {  "_ZN3aaa9GG2221232E", // class name
  bases__ZN3aaa9GG2221232E, 6,
  &(vtc__ZN3aaa9GG2221232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221232E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221233  : ::aaa::EE222 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22212333fooEv
  virtual void  bar(); // _ZN3aaa9GG22212333barEv
  ~GG2221233(); // tgen
  GG2221233(); // tgen
};
//SIG(1 _ZN3aaa9GG2221233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22212333fooEv");}
void  aaa::GG2221233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22212333barEv");}
aaa::GG2221233 ::~GG2221233(){ note_dtor("_ZN3aaa9GG2221233E", this);} // tgen
aaa::GG2221233 ::GG2221233(){ note_ctor("_ZN3aaa9GG2221233E", this);} // tgen
}
static void Test__ZN3aaa9GG2221233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221233E, buf);
    ::aaa::GG2221233 *dp, &lv = *(dp=new (buf) ::aaa::GG2221233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221233E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2221233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2221233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2221233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221233E);
    dp->::aaa::GG2221233::~GG2221233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221233E(Test__ZN3aaa9GG2221233E, "_ZN3aaa9GG2221233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221233C1Ev();
extern void _ZN3aaa9GG2221233D1Ev();
Name_Map name_map__ZN3aaa9GG2221233E[] = {
  NSPAIR(_ZN3aaa9GG2221233C1Ev),
  NSPAIR(_ZN3aaa9GG2221233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2221233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221233E[];
extern void _ZN3aaa9GG22212333barEv();
extern void _ZN3aaa9GG22212333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22212333barEv,_ZThn8_N3aaa9GG22212333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22212333fooEv,_ZThn20_N3aaa9GG22212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22212333barEv,_ZThn20_N3aaa9GG22212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22212333barEv,_ZThn28_N3aaa9GG22212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22212333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22212333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22212333barEv,_ZThn8_N3aaa9GG22212333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212333fooEv,_ZThn20_N3aaa9GG22212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22212333barEv,_ZThn20_N3aaa9GG22212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22212333barEv,_ZThn28_N3aaa9GG22212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221233E[];
Class_Descriptor cd__ZN3aaa9GG2221233E = {  "_ZN3aaa9GG2221233E", // class name
  bases__ZN3aaa9GG2221233E, 6,
  &(vtc__ZN3aaa9GG2221233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221311  : ::aaa::EE222 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22213113fooEv
  ~GG2221311(); // tgen
  GG2221311(); // tgen
};
//SIG(1 _ZN3aaa9GG2221311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22213113fooEv");}
aaa::GG2221311 ::~GG2221311(){ note_dtor("_ZN3aaa9GG2221311E", this);} // tgen
aaa::GG2221311 ::GG2221311(){ note_ctor("_ZN3aaa9GG2221311E", this);} // tgen
}
static void Test__ZN3aaa9GG2221311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221311E, buf);
    ::aaa::GG2221311 *dp, &lv = *(dp=new (buf) ::aaa::GG2221311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221311E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2221311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2221311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2221311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221311E);
    dp->::aaa::GG2221311::~GG2221311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221311E(Test__ZN3aaa9GG2221311E, "_ZN3aaa9GG2221311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221311C1Ev();
extern void _ZN3aaa9GG2221311D1Ev();
Name_Map name_map__ZN3aaa9GG2221311E[] = {
  NSPAIR(_ZN3aaa9GG2221311C1Ev),
  NSPAIR(_ZN3aaa9GG2221311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2221311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221311E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22213113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22213113fooEv,_ZThn20_N3aaa9GG22213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213113fooEv,_ZThn28_N3aaa9GG22213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22213113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213113fooEv,_ZThn20_N3aaa9GG22213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213113fooEv,_ZThn28_N3aaa9GG22213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221311E[];
Class_Descriptor cd__ZN3aaa9GG2221311E = {  "_ZN3aaa9GG2221311E", // class name
  bases__ZN3aaa9GG2221311E, 6,
  &(vtc__ZN3aaa9GG2221311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221312  : ::aaa::EE222 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22213123barEv
  ~GG2221312(); // tgen
  GG2221312(); // tgen
};
//SIG(1 _ZN3aaa9GG2221312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 v1 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22213123barEv");}
aaa::GG2221312 ::~GG2221312(){ note_dtor("_ZN3aaa9GG2221312E", this);} // tgen
aaa::GG2221312 ::GG2221312(){ note_ctor("_ZN3aaa9GG2221312E", this);} // tgen
}
static void Test__ZN3aaa9GG2221312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221312E, buf);
    ::aaa::GG2221312 *dp, &lv = *(dp=new (buf) ::aaa::GG2221312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221312E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2221312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2221312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2221312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221312E);
    dp->::aaa::GG2221312::~GG2221312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221312E(Test__ZN3aaa9GG2221312E, "_ZN3aaa9GG2221312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221312C1Ev();
extern void _ZN3aaa9GG2221312D1Ev();
Name_Map name_map__ZN3aaa9GG2221312E[] = {
  NSPAIR(_ZN3aaa9GG2221312C1Ev),
  NSPAIR(_ZN3aaa9GG2221312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2221312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221312E[];
extern void _ZN3aaa9GG22213123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22213123barEv,_ZThn8_N3aaa9GG22213123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213123barEv,_ZThn28_N3aaa9GG22213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22213123barEv,_ZThn8_N3aaa9GG22213123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213123barEv,_ZThn28_N3aaa9GG22213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221312E[];
Class_Descriptor cd__ZN3aaa9GG2221312E = {  "_ZN3aaa9GG2221312E", // class name
  bases__ZN3aaa9GG2221312E, 6,
  &(vtc__ZN3aaa9GG2221312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221312E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221313  : ::aaa::EE222 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22213133fooEv
  virtual void  bar(); // _ZN3aaa9GG22213133barEv
  ~GG2221313(); // tgen
  GG2221313(); // tgen
};
//SIG(1 _ZN3aaa9GG2221313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22213133fooEv");}
void  aaa::GG2221313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22213133barEv");}
aaa::GG2221313 ::~GG2221313(){ note_dtor("_ZN3aaa9GG2221313E", this);} // tgen
aaa::GG2221313 ::GG2221313(){ note_ctor("_ZN3aaa9GG2221313E", this);} // tgen
}
static void Test__ZN3aaa9GG2221313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221313E, buf);
    ::aaa::GG2221313 *dp, &lv = *(dp=new (buf) ::aaa::GG2221313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221313E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2221313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2221313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2221313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221313E);
    dp->::aaa::GG2221313::~GG2221313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221313E(Test__ZN3aaa9GG2221313E, "_ZN3aaa9GG2221313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221313C1Ev();
extern void _ZN3aaa9GG2221313D1Ev();
Name_Map name_map__ZN3aaa9GG2221313E[] = {
  NSPAIR(_ZN3aaa9GG2221313C1Ev),
  NSPAIR(_ZN3aaa9GG2221313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2221313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221313E[];
extern void _ZN3aaa9GG22213133barEv();
extern void _ZN3aaa9GG22213133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22213133barEv,_ZThn8_N3aaa9GG22213133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22213133fooEv,_ZThn20_N3aaa9GG22213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213133fooEv,_ZThn28_N3aaa9GG22213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213133barEv,_ZThn28_N3aaa9GG22213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22213133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22213133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22213133barEv,_ZThn8_N3aaa9GG22213133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213133fooEv,_ZThn20_N3aaa9GG22213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213133fooEv,_ZThn28_N3aaa9GG22213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213133barEv,_ZThn28_N3aaa9GG22213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221313E[];
Class_Descriptor cd__ZN3aaa9GG2221313E = {  "_ZN3aaa9GG2221313E", // class name
  bases__ZN3aaa9GG2221313E, 6,
  &(vtc__ZN3aaa9GG2221313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221321  : ::aaa::EE222 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22213213fooEv
  ~GG2221321(); // tgen
  GG2221321(); // tgen
};
//SIG(1 _ZN3aaa9GG2221321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22213213fooEv");}
aaa::GG2221321 ::~GG2221321(){ note_dtor("_ZN3aaa9GG2221321E", this);} // tgen
aaa::GG2221321 ::GG2221321(){ note_ctor("_ZN3aaa9GG2221321E", this);} // tgen
}
static void Test__ZN3aaa9GG2221321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221321E, buf);
    ::aaa::GG2221321 *dp, &lv = *(dp=new (buf) ::aaa::GG2221321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221321E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2221321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2221321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2221321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221321E);
    dp->::aaa::GG2221321::~GG2221321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221321E(Test__ZN3aaa9GG2221321E, "_ZN3aaa9GG2221321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221321C1Ev();
extern void _ZN3aaa9GG2221321D1Ev();
Name_Map name_map__ZN3aaa9GG2221321E[] = {
  NSPAIR(_ZN3aaa9GG2221321C1Ev),
  NSPAIR(_ZN3aaa9GG2221321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2221321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221321E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22213213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22213213fooEv,_ZThn20_N3aaa9GG22213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22213213fooEv,_ZThn28_N3aaa9GG22213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22213213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213213fooEv,_ZThn20_N3aaa9GG22213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213213fooEv,_ZThn28_N3aaa9GG22213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221321E[];
Class_Descriptor cd__ZN3aaa9GG2221321E = {  "_ZN3aaa9GG2221321E", // class name
  bases__ZN3aaa9GG2221321E, 6,
  &(vtc__ZN3aaa9GG2221321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221322  : ::aaa::EE222 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22213223barEv
  ~GG2221322(); // tgen
  GG2221322(); // tgen
};
//SIG(1 _ZN3aaa9GG2221322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22213223barEv");}
aaa::GG2221322 ::~GG2221322(){ note_dtor("_ZN3aaa9GG2221322E", this);} // tgen
aaa::GG2221322 ::GG2221322(){ note_ctor("_ZN3aaa9GG2221322E", this);} // tgen
}
static void Test__ZN3aaa9GG2221322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221322E, buf);
    ::aaa::GG2221322 *dp, &lv = *(dp=new (buf) ::aaa::GG2221322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221322E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2221322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2221322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2221322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221322E);
    dp->::aaa::GG2221322::~GG2221322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221322E(Test__ZN3aaa9GG2221322E, "_ZN3aaa9GG2221322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221322C1Ev();
extern void _ZN3aaa9GG2221322D1Ev();
Name_Map name_map__ZN3aaa9GG2221322E[] = {
  NSPAIR(_ZN3aaa9GG2221322C1Ev),
  NSPAIR(_ZN3aaa9GG2221322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2221322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221322E[];
extern void _ZN3aaa9GG22213223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22213223barEv,_ZThn8_N3aaa9GG22213223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22213223barEv,_ZThn20_N3aaa9GG22213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22213223barEv,_ZThn28_N3aaa9GG22213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22213223barEv,_ZThn8_N3aaa9GG22213223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213223barEv,_ZThn20_N3aaa9GG22213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213223barEv,_ZThn28_N3aaa9GG22213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221322E[];
Class_Descriptor cd__ZN3aaa9GG2221322E = {  "_ZN3aaa9GG2221322E", // class name
  bases__ZN3aaa9GG2221322E, 6,
  &(vtc__ZN3aaa9GG2221322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221323  : ::aaa::EE222 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22213233fooEv
  virtual void  bar(); // _ZN3aaa9GG22213233barEv
  ~GG2221323(); // tgen
  GG2221323(); // tgen
};
//SIG(1 _ZN3aaa9GG2221323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22213233fooEv");}
void  aaa::GG2221323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22213233barEv");}
aaa::GG2221323 ::~GG2221323(){ note_dtor("_ZN3aaa9GG2221323E", this);} // tgen
aaa::GG2221323 ::GG2221323(){ note_ctor("_ZN3aaa9GG2221323E", this);} // tgen
}
static void Test__ZN3aaa9GG2221323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221323E, buf);
    ::aaa::GG2221323 *dp, &lv = *(dp=new (buf) ::aaa::GG2221323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221323E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2221323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2221323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2221323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221323E);
    dp->::aaa::GG2221323::~GG2221323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221323E(Test__ZN3aaa9GG2221323E, "_ZN3aaa9GG2221323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221323C1Ev();
extern void _ZN3aaa9GG2221323D1Ev();
Name_Map name_map__ZN3aaa9GG2221323E[] = {
  NSPAIR(_ZN3aaa9GG2221323C1Ev),
  NSPAIR(_ZN3aaa9GG2221323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2221323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221323E[];
extern void _ZN3aaa9GG22213233barEv();
extern void _ZN3aaa9GG22213233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22213233barEv,_ZThn8_N3aaa9GG22213233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22213233fooEv,_ZThn20_N3aaa9GG22213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22213233barEv,_ZThn20_N3aaa9GG22213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213233fooEv,_ZThn28_N3aaa9GG22213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213233barEv,_ZThn28_N3aaa9GG22213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22213233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22213233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22213233barEv,_ZThn8_N3aaa9GG22213233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213233fooEv,_ZThn20_N3aaa9GG22213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213233barEv,_ZThn20_N3aaa9GG22213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213233fooEv,_ZThn28_N3aaa9GG22213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213233barEv,_ZThn28_N3aaa9GG22213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221323E[];
Class_Descriptor cd__ZN3aaa9GG2221323E = {  "_ZN3aaa9GG2221323E", // class name
  bases__ZN3aaa9GG2221323E, 6,
  &(vtc__ZN3aaa9GG2221323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221331  : ::aaa::EE222 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22213313fooEv
  ~GG2221331(); // tgen
  GG2221331(); // tgen
};
//SIG(1 _ZN3aaa9GG2221331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22213313fooEv");}
aaa::GG2221331 ::~GG2221331(){ note_dtor("_ZN3aaa9GG2221331E", this);} // tgen
aaa::GG2221331 ::GG2221331(){ note_ctor("_ZN3aaa9GG2221331E", this);} // tgen
}
static void Test__ZN3aaa9GG2221331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221331E, buf);
    ::aaa::GG2221331 *dp, &lv = *(dp=new (buf) ::aaa::GG2221331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221331E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2221331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2221331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2221331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221331E);
    dp->::aaa::GG2221331::~GG2221331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221331E(Test__ZN3aaa9GG2221331E, "_ZN3aaa9GG2221331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221331C1Ev();
extern void _ZN3aaa9GG2221331D1Ev();
Name_Map name_map__ZN3aaa9GG2221331E[] = {
  NSPAIR(_ZN3aaa9GG2221331C1Ev),
  NSPAIR(_ZN3aaa9GG2221331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2221331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221331E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22213313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22213313fooEv,_ZThn20_N3aaa9GG22213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22213313fooEv,_ZThn28_N3aaa9GG22213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22213313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213313fooEv,_ZThn20_N3aaa9GG22213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213313fooEv,_ZThn28_N3aaa9GG22213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221331E[];
Class_Descriptor cd__ZN3aaa9GG2221331E = {  "_ZN3aaa9GG2221331E", // class name
  bases__ZN3aaa9GG2221331E, 6,
  &(vtc__ZN3aaa9GG2221331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221332  : ::aaa::EE222 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22213323barEv
  ~GG2221332(); // tgen
  GG2221332(); // tgen
};
//SIG(1 _ZN3aaa9GG2221332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 v1 Fi} v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2221332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22213323barEv");}
aaa::GG2221332 ::~GG2221332(){ note_dtor("_ZN3aaa9GG2221332E", this);} // tgen
aaa::GG2221332 ::GG2221332(){ note_ctor("_ZN3aaa9GG2221332E", this);} // tgen
}
static void Test__ZN3aaa9GG2221332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221332E, buf);
    ::aaa::GG2221332 *dp, &lv = *(dp=new (buf) ::aaa::GG2221332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221332E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2221332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2221332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2221332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221332E);
    dp->::aaa::GG2221332::~GG2221332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221332E(Test__ZN3aaa9GG2221332E, "_ZN3aaa9GG2221332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221332C1Ev();
extern void _ZN3aaa9GG2221332D1Ev();
Name_Map name_map__ZN3aaa9GG2221332E[] = {
  NSPAIR(_ZN3aaa9GG2221332C1Ev),
  NSPAIR(_ZN3aaa9GG2221332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2221332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221332E[];
extern void _ZN3aaa9GG22213323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22213323barEv,_ZThn8_N3aaa9GG22213323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22213323barEv,_ZThn20_N3aaa9GG22213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213323barEv,_ZThn28_N3aaa9GG22213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22213323barEv,_ZThn8_N3aaa9GG22213323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213323barEv,_ZThn20_N3aaa9GG22213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213323barEv,_ZThn28_N3aaa9GG22213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221332E[];
Class_Descriptor cd__ZN3aaa9GG2221332E = {  "_ZN3aaa9GG2221332E", // class name
  bases__ZN3aaa9GG2221332E, 6,
  &(vtc__ZN3aaa9GG2221332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221332E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2221333  : ::aaa::EE222 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22213333fooEv
  virtual void  bar(); // _ZN3aaa9GG22213333barEv
  ~GG2221333(); // tgen
  GG2221333(); // tgen
};
//SIG(1 _ZN3aaa9GG2221333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2221333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22213333fooEv");}
void  aaa::GG2221333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22213333barEv");}
aaa::GG2221333 ::~GG2221333(){ note_dtor("_ZN3aaa9GG2221333E", this);} // tgen
aaa::GG2221333 ::GG2221333(){ note_ctor("_ZN3aaa9GG2221333E", this);} // tgen
}
static void Test__ZN3aaa9GG2221333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2221333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2221333E, buf);
    ::aaa::GG2221333 *dp, &lv = *(dp=new (buf) ::aaa::GG2221333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2221333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2221333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2221333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2221333E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2221333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2221333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2221333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2221333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2221333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2221333E);
    dp->::aaa::GG2221333::~GG2221333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2221333E(Test__ZN3aaa9GG2221333E, "_ZN3aaa9GG2221333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2221333C1Ev();
extern void _ZN3aaa9GG2221333D1Ev();
Name_Map name_map__ZN3aaa9GG2221333E[] = {
  NSPAIR(_ZN3aaa9GG2221333C1Ev),
  NSPAIR(_ZN3aaa9GG2221333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2221333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2221333E[];
extern void _ZN3aaa9GG22213333barEv();
extern void _ZN3aaa9GG22213333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22213333barEv,_ZThn8_N3aaa9GG22213333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22213333fooEv,_ZThn20_N3aaa9GG22213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22213333barEv,_ZThn20_N3aaa9GG22213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213333fooEv,_ZThn28_N3aaa9GG22213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22213333barEv,_ZThn28_N3aaa9GG22213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2221333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22213333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22213333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22213333barEv,_ZThn8_N3aaa9GG22213333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213333fooEv,_ZThn20_N3aaa9GG22213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22213333barEv,_ZThn20_N3aaa9GG22213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213333fooEv,_ZThn28_N3aaa9GG22213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22213333barEv,_ZThn28_N3aaa9GG22213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2221333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2221333E[];
Class_Descriptor cd__ZN3aaa9GG2221333E = {  "_ZN3aaa9GG2221333E", // class name
  bases__ZN3aaa9GG2221333E, 6,
  &(vtc__ZN3aaa9GG2221333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2221333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2221333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222111  : ::aaa::EE222 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22221113fooEv
  ~GG2222111(); // tgen
  GG2222111(); // tgen
};
//SIG(1 _ZN3aaa9GG2222111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22221113fooEv");}
aaa::GG2222111 ::~GG2222111(){ note_dtor("_ZN3aaa9GG2222111E", this);} // tgen
aaa::GG2222111 ::GG2222111(){ note_ctor("_ZN3aaa9GG2222111E", this);} // tgen
}
static void Test__ZN3aaa9GG2222111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222111E, buf);
    ::aaa::GG2222111 *dp, &lv = *(dp=new (buf) ::aaa::GG2222111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222111E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2222111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2222111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2222111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222111E);
    dp->::aaa::GG2222111::~GG2222111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222111E(Test__ZN3aaa9GG2222111E, "_ZN3aaa9GG2222111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222111C1Ev();
extern void _ZN3aaa9GG2222111D1Ev();
Name_Map name_map__ZN3aaa9GG2222111E[] = {
  NSPAIR(_ZN3aaa9GG2222111C1Ev),
  NSPAIR(_ZN3aaa9GG2222111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2222111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222111E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22221113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22221113fooEv,_ZThn20_N3aaa9GG22221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22221113fooEv,_ZThn28_N3aaa9GG22221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22221113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221113fooEv,_ZThn20_N3aaa9GG22221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22221113fooEv,_ZThn28_N3aaa9GG22221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222111E[];
Class_Descriptor cd__ZN3aaa9GG2222111E = {  "_ZN3aaa9GG2222111E", // class name
  bases__ZN3aaa9GG2222111E, 6,
  &(vtc__ZN3aaa9GG2222111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222112  : ::aaa::EE222 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22221123barEv
  ~GG2222112(); // tgen
  GG2222112(); // tgen
};
//SIG(1 _ZN3aaa9GG2222112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22221123barEv");}
aaa::GG2222112 ::~GG2222112(){ note_dtor("_ZN3aaa9GG2222112E", this);} // tgen
aaa::GG2222112 ::GG2222112(){ note_ctor("_ZN3aaa9GG2222112E", this);} // tgen
}
static void Test__ZN3aaa9GG2222112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222112E, buf);
    ::aaa::GG2222112 *dp, &lv = *(dp=new (buf) ::aaa::GG2222112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222112E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2222112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2222112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2222112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222112E);
    dp->::aaa::GG2222112::~GG2222112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222112E(Test__ZN3aaa9GG2222112E, "_ZN3aaa9GG2222112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222112C1Ev();
extern void _ZN3aaa9GG2222112D1Ev();
Name_Map name_map__ZN3aaa9GG2222112E[] = {
  NSPAIR(_ZN3aaa9GG2222112C1Ev),
  NSPAIR(_ZN3aaa9GG2222112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2222112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222112E[];
extern void _ZN3aaa9GG22221123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22221123barEv,_ZThn8_N3aaa9GG22221123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22221123barEv,_ZThn20_N3aaa9GG22221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22221123barEv,_ZThn8_N3aaa9GG22221123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221123barEv,_ZThn20_N3aaa9GG22221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222112E[];
Class_Descriptor cd__ZN3aaa9GG2222112E = {  "_ZN3aaa9GG2222112E", // class name
  bases__ZN3aaa9GG2222112E, 6,
  &(vtc__ZN3aaa9GG2222112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222113  : ::aaa::EE222 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22221133fooEv
  virtual void  bar(); // _ZN3aaa9GG22221133barEv
  ~GG2222113(); // tgen
  GG2222113(); // tgen
};
//SIG(1 _ZN3aaa9GG2222113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22221133fooEv");}
void  aaa::GG2222113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22221133barEv");}
aaa::GG2222113 ::~GG2222113(){ note_dtor("_ZN3aaa9GG2222113E", this);} // tgen
aaa::GG2222113 ::GG2222113(){ note_ctor("_ZN3aaa9GG2222113E", this);} // tgen
}
static void Test__ZN3aaa9GG2222113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222113E, buf);
    ::aaa::GG2222113 *dp, &lv = *(dp=new (buf) ::aaa::GG2222113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222113E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2222113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2222113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2222113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222113E);
    dp->::aaa::GG2222113::~GG2222113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222113E(Test__ZN3aaa9GG2222113E, "_ZN3aaa9GG2222113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222113C1Ev();
extern void _ZN3aaa9GG2222113D1Ev();
Name_Map name_map__ZN3aaa9GG2222113E[] = {
  NSPAIR(_ZN3aaa9GG2222113C1Ev),
  NSPAIR(_ZN3aaa9GG2222113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2222113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222113E[];
extern void _ZN3aaa9GG22221133barEv();
extern void _ZN3aaa9GG22221133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22221133barEv,_ZThn8_N3aaa9GG22221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22221133barEv,_ZThn20_N3aaa9GG22221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22221133fooEv,_ZThn20_N3aaa9GG22221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22221133fooEv,_ZThn28_N3aaa9GG22221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22221133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22221133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22221133barEv,_ZThn8_N3aaa9GG22221133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221133barEv,_ZThn20_N3aaa9GG22221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221133fooEv,_ZThn20_N3aaa9GG22221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22221133fooEv,_ZThn28_N3aaa9GG22221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222113E[];
Class_Descriptor cd__ZN3aaa9GG2222113E = {  "_ZN3aaa9GG2222113E", // class name
  bases__ZN3aaa9GG2222113E, 6,
  &(vtc__ZN3aaa9GG2222113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222121  : ::aaa::EE222 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22221213fooEv
  ~GG2222121(); // tgen
  GG2222121(); // tgen
};
//SIG(1 _ZN3aaa9GG2222121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22221213fooEv");}
aaa::GG2222121 ::~GG2222121(){ note_dtor("_ZN3aaa9GG2222121E", this);} // tgen
aaa::GG2222121 ::GG2222121(){ note_ctor("_ZN3aaa9GG2222121E", this);} // tgen
}
static void Test__ZN3aaa9GG2222121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222121E, buf);
    ::aaa::GG2222121 *dp, &lv = *(dp=new (buf) ::aaa::GG2222121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222121E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2222121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2222121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2222121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222121E);
    dp->::aaa::GG2222121::~GG2222121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222121E(Test__ZN3aaa9GG2222121E, "_ZN3aaa9GG2222121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222121C1Ev();
extern void _ZN3aaa9GG2222121D1Ev();
Name_Map name_map__ZN3aaa9GG2222121E[] = {
  NSPAIR(_ZN3aaa9GG2222121C1Ev),
  NSPAIR(_ZN3aaa9GG2222121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2222121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222121E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22221213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22221213fooEv,_ZThn28_N3aaa9GG22221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22221213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22221213fooEv,_ZThn28_N3aaa9GG22221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222121E[];
Class_Descriptor cd__ZN3aaa9GG2222121E = {  "_ZN3aaa9GG2222121E", // class name
  bases__ZN3aaa9GG2222121E, 6,
  &(vtc__ZN3aaa9GG2222121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222122  : ::aaa::EE222 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22221223barEv
  ~GG2222122(); // tgen
  GG2222122(); // tgen
};
//SIG(1 _ZN3aaa9GG2222122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22221223barEv");}
aaa::GG2222122 ::~GG2222122(){ note_dtor("_ZN3aaa9GG2222122E", this);} // tgen
aaa::GG2222122 ::GG2222122(){ note_ctor("_ZN3aaa9GG2222122E", this);} // tgen
}
static void Test__ZN3aaa9GG2222122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222122E, buf);
    ::aaa::GG2222122 *dp, &lv = *(dp=new (buf) ::aaa::GG2222122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222122E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2222122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2222122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2222122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222122E);
    dp->::aaa::GG2222122::~GG2222122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222122E(Test__ZN3aaa9GG2222122E, "_ZN3aaa9GG2222122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222122C1Ev();
extern void _ZN3aaa9GG2222122D1Ev();
Name_Map name_map__ZN3aaa9GG2222122E[] = {
  NSPAIR(_ZN3aaa9GG2222122C1Ev),
  NSPAIR(_ZN3aaa9GG2222122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2222122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222122E[];
extern void _ZN3aaa9GG22221223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22221223barEv,_ZThn8_N3aaa9GG22221223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22221223barEv,_ZThn20_N3aaa9GG22221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22221223barEv,_ZThn8_N3aaa9GG22221223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221223barEv,_ZThn20_N3aaa9GG22221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222122E[];
Class_Descriptor cd__ZN3aaa9GG2222122E = {  "_ZN3aaa9GG2222122E", // class name
  bases__ZN3aaa9GG2222122E, 6,
  &(vtc__ZN3aaa9GG2222122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222122E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222123  : ::aaa::EE222 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22221233fooEv
  virtual void  bar(); // _ZN3aaa9GG22221233barEv
  ~GG2222123(); // tgen
  GG2222123(); // tgen
};
//SIG(1 _ZN3aaa9GG2222123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22221233fooEv");}
void  aaa::GG2222123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22221233barEv");}
aaa::GG2222123 ::~GG2222123(){ note_dtor("_ZN3aaa9GG2222123E", this);} // tgen
aaa::GG2222123 ::GG2222123(){ note_ctor("_ZN3aaa9GG2222123E", this);} // tgen
}
static void Test__ZN3aaa9GG2222123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222123E, buf);
    ::aaa::GG2222123 *dp, &lv = *(dp=new (buf) ::aaa::GG2222123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222123E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2222123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2222123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2222123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222123E);
    dp->::aaa::GG2222123::~GG2222123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222123E(Test__ZN3aaa9GG2222123E, "_ZN3aaa9GG2222123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222123C1Ev();
extern void _ZN3aaa9GG2222123D1Ev();
Name_Map name_map__ZN3aaa9GG2222123E[] = {
  NSPAIR(_ZN3aaa9GG2222123C1Ev),
  NSPAIR(_ZN3aaa9GG2222123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2222123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222123E[];
extern void _ZN3aaa9GG22221233barEv();
extern void _ZN3aaa9GG22221233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22221233barEv,_ZThn8_N3aaa9GG22221233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22221233barEv,_ZThn20_N3aaa9GG22221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22221233fooEv,_ZThn28_N3aaa9GG22221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22221233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22221233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22221233barEv,_ZThn8_N3aaa9GG22221233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221233barEv,_ZThn20_N3aaa9GG22221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22221233fooEv,_ZThn28_N3aaa9GG22221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222123E[];
Class_Descriptor cd__ZN3aaa9GG2222123E = {  "_ZN3aaa9GG2222123E", // class name
  bases__ZN3aaa9GG2222123E, 6,
  &(vtc__ZN3aaa9GG2222123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222131  : ::aaa::EE222 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22221313fooEv
  ~GG2222131(); // tgen
  GG2222131(); // tgen
};
//SIG(1 _ZN3aaa9GG2222131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22221313fooEv");}
aaa::GG2222131 ::~GG2222131(){ note_dtor("_ZN3aaa9GG2222131E", this);} // tgen
aaa::GG2222131 ::GG2222131(){ note_ctor("_ZN3aaa9GG2222131E", this);} // tgen
}
static void Test__ZN3aaa9GG2222131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222131E, buf);
    ::aaa::GG2222131 *dp, &lv = *(dp=new (buf) ::aaa::GG2222131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222131E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2222131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2222131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2222131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222131E);
    dp->::aaa::GG2222131::~GG2222131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222131E(Test__ZN3aaa9GG2222131E, "_ZN3aaa9GG2222131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222131C1Ev();
extern void _ZN3aaa9GG2222131D1Ev();
Name_Map name_map__ZN3aaa9GG2222131E[] = {
  NSPAIR(_ZN3aaa9GG2222131C1Ev),
  NSPAIR(_ZN3aaa9GG2222131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2222131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222131E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22221313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22221313fooEv,_ZThn20_N3aaa9GG22221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22221313fooEv,_ZThn28_N3aaa9GG22221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22221313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221313fooEv,_ZThn20_N3aaa9GG22221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22221313fooEv,_ZThn28_N3aaa9GG22221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222131E[];
Class_Descriptor cd__ZN3aaa9GG2222131E = {  "_ZN3aaa9GG2222131E", // class name
  bases__ZN3aaa9GG2222131E, 6,
  &(vtc__ZN3aaa9GG2222131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222132  : ::aaa::EE222 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22221323barEv
  ~GG2222132(); // tgen
  GG2222132(); // tgen
};
//SIG(1 _ZN3aaa9GG2222132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22221323barEv");}
aaa::GG2222132 ::~GG2222132(){ note_dtor("_ZN3aaa9GG2222132E", this);} // tgen
aaa::GG2222132 ::GG2222132(){ note_ctor("_ZN3aaa9GG2222132E", this);} // tgen
}
static void Test__ZN3aaa9GG2222132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222132E, buf);
    ::aaa::GG2222132 *dp, &lv = *(dp=new (buf) ::aaa::GG2222132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222132E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2222132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2222132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2222132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222132E);
    dp->::aaa::GG2222132::~GG2222132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222132E(Test__ZN3aaa9GG2222132E, "_ZN3aaa9GG2222132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222132C1Ev();
extern void _ZN3aaa9GG2222132D1Ev();
Name_Map name_map__ZN3aaa9GG2222132E[] = {
  NSPAIR(_ZN3aaa9GG2222132C1Ev),
  NSPAIR(_ZN3aaa9GG2222132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2222132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222132E[];
extern void _ZN3aaa9GG22221323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22221323barEv,_ZThn8_N3aaa9GG22221323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22221323barEv,_ZThn20_N3aaa9GG22221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22221323barEv,_ZThn8_N3aaa9GG22221323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221323barEv,_ZThn20_N3aaa9GG22221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222132E[];
Class_Descriptor cd__ZN3aaa9GG2222132E = {  "_ZN3aaa9GG2222132E", // class name
  bases__ZN3aaa9GG2222132E, 6,
  &(vtc__ZN3aaa9GG2222132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222132E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222133  : ::aaa::EE222 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22221333fooEv
  virtual void  bar(); // _ZN3aaa9GG22221333barEv
  ~GG2222133(); // tgen
  GG2222133(); // tgen
};
//SIG(1 _ZN3aaa9GG2222133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22221333fooEv");}
void  aaa::GG2222133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22221333barEv");}
aaa::GG2222133 ::~GG2222133(){ note_dtor("_ZN3aaa9GG2222133E", this);} // tgen
aaa::GG2222133 ::GG2222133(){ note_ctor("_ZN3aaa9GG2222133E", this);} // tgen
}
static void Test__ZN3aaa9GG2222133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222133E, buf);
    ::aaa::GG2222133 *dp, &lv = *(dp=new (buf) ::aaa::GG2222133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222133E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2222133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2222133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2222133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222133E);
    dp->::aaa::GG2222133::~GG2222133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222133E(Test__ZN3aaa9GG2222133E, "_ZN3aaa9GG2222133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222133C1Ev();
extern void _ZN3aaa9GG2222133D1Ev();
Name_Map name_map__ZN3aaa9GG2222133E[] = {
  NSPAIR(_ZN3aaa9GG2222133C1Ev),
  NSPAIR(_ZN3aaa9GG2222133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2222133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222133E[];
extern void _ZN3aaa9GG22221333barEv();
extern void _ZN3aaa9GG22221333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22221333barEv,_ZThn8_N3aaa9GG22221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22221333barEv,_ZThn20_N3aaa9GG22221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22221333fooEv,_ZThn20_N3aaa9GG22221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22221333fooEv,_ZThn28_N3aaa9GG22221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22221333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22221333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22221333barEv,_ZThn8_N3aaa9GG22221333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221333barEv,_ZThn20_N3aaa9GG22221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22221333fooEv,_ZThn20_N3aaa9GG22221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22221333fooEv,_ZThn28_N3aaa9GG22221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222133E[];
Class_Descriptor cd__ZN3aaa9GG2222133E = {  "_ZN3aaa9GG2222133E", // class name
  bases__ZN3aaa9GG2222133E, 6,
  &(vtc__ZN3aaa9GG2222133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222211  : ::aaa::EE222 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22222113fooEv
  ~GG2222211(); // tgen
  GG2222211(); // tgen
};
//SIG(1 _ZN3aaa9GG2222211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22222113fooEv");}
aaa::GG2222211 ::~GG2222211(){ note_dtor("_ZN3aaa9GG2222211E", this);} // tgen
aaa::GG2222211 ::GG2222211(){ note_ctor("_ZN3aaa9GG2222211E", this);} // tgen
}
static void Test__ZN3aaa9GG2222211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222211E, buf);
    ::aaa::GG2222211 *dp, &lv = *(dp=new (buf) ::aaa::GG2222211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222211E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2222211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2222211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2222211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222211E);
    dp->::aaa::GG2222211::~GG2222211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222211E(Test__ZN3aaa9GG2222211E, "_ZN3aaa9GG2222211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222211C1Ev();
extern void _ZN3aaa9GG2222211D1Ev();
Name_Map name_map__ZN3aaa9GG2222211E[] = {
  NSPAIR(_ZN3aaa9GG2222211C1Ev),
  NSPAIR(_ZN3aaa9GG2222211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2222211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222211E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22222113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22222113fooEv,_ZThn20_N3aaa9GG22222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22222113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222113fooEv,_ZThn20_N3aaa9GG22222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222211E[];
Class_Descriptor cd__ZN3aaa9GG2222211E = {  "_ZN3aaa9GG2222211E", // class name
  bases__ZN3aaa9GG2222211E, 6,
  &(vtc__ZN3aaa9GG2222211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222212  : ::aaa::EE222 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22222123barEv
  ~GG2222212(); // tgen
  GG2222212(); // tgen
};
//SIG(1 _ZN3aaa9GG2222212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22222123barEv");}
aaa::GG2222212 ::~GG2222212(){ note_dtor("_ZN3aaa9GG2222212E", this);} // tgen
aaa::GG2222212 ::GG2222212(){ note_ctor("_ZN3aaa9GG2222212E", this);} // tgen
}
static void Test__ZN3aaa9GG2222212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222212E, buf);
    ::aaa::GG2222212 *dp, &lv = *(dp=new (buf) ::aaa::GG2222212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222212E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2222212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2222212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2222212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222212E);
    dp->::aaa::GG2222212::~GG2222212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222212E(Test__ZN3aaa9GG2222212E, "_ZN3aaa9GG2222212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222212C1Ev();
extern void _ZN3aaa9GG2222212D1Ev();
Name_Map name_map__ZN3aaa9GG2222212E[] = {
  NSPAIR(_ZN3aaa9GG2222212C1Ev),
  NSPAIR(_ZN3aaa9GG2222212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2222212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222212E[];
extern void _ZN3aaa9GG22222123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22222123barEv,_ZThn8_N3aaa9GG22222123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22222123barEv,_ZThn20_N3aaa9GG22222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22222123barEv,_ZThn28_N3aaa9GG22222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22222123barEv,_ZThn8_N3aaa9GG22222123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222123barEv,_ZThn20_N3aaa9GG22222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22222123barEv,_ZThn28_N3aaa9GG22222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222212E[];
Class_Descriptor cd__ZN3aaa9GG2222212E = {  "_ZN3aaa9GG2222212E", // class name
  bases__ZN3aaa9GG2222212E, 6,
  &(vtc__ZN3aaa9GG2222212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222213  : ::aaa::EE222 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22222133fooEv
  virtual void  bar(); // _ZN3aaa9GG22222133barEv
  ~GG2222213(); // tgen
  GG2222213(); // tgen
};
//SIG(1 _ZN3aaa9GG2222213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22222133fooEv");}
void  aaa::GG2222213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22222133barEv");}
aaa::GG2222213 ::~GG2222213(){ note_dtor("_ZN3aaa9GG2222213E", this);} // tgen
aaa::GG2222213 ::GG2222213(){ note_ctor("_ZN3aaa9GG2222213E", this);} // tgen
}
static void Test__ZN3aaa9GG2222213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222213E, buf);
    ::aaa::GG2222213 *dp, &lv = *(dp=new (buf) ::aaa::GG2222213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222213E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2222213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2222213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2222213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222213E);
    dp->::aaa::GG2222213::~GG2222213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222213E(Test__ZN3aaa9GG2222213E, "_ZN3aaa9GG2222213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222213C1Ev();
extern void _ZN3aaa9GG2222213D1Ev();
Name_Map name_map__ZN3aaa9GG2222213E[] = {
  NSPAIR(_ZN3aaa9GG2222213C1Ev),
  NSPAIR(_ZN3aaa9GG2222213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2222213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222213E[];
extern void _ZN3aaa9GG22222133barEv();
extern void _ZN3aaa9GG22222133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22222133barEv,_ZThn8_N3aaa9GG22222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22222133barEv,_ZThn20_N3aaa9GG22222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22222133fooEv,_ZThn20_N3aaa9GG22222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22222133barEv,_ZThn28_N3aaa9GG22222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22222133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22222133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22222133barEv,_ZThn8_N3aaa9GG22222133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222133barEv,_ZThn20_N3aaa9GG22222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222133fooEv,_ZThn20_N3aaa9GG22222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22222133barEv,_ZThn28_N3aaa9GG22222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222213E[];
Class_Descriptor cd__ZN3aaa9GG2222213E = {  "_ZN3aaa9GG2222213E", // class name
  bases__ZN3aaa9GG2222213E, 6,
  &(vtc__ZN3aaa9GG2222213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222221  : ::aaa::EE222 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22222213fooEv
  ~GG2222221(); // tgen
  GG2222221(); // tgen
};
//SIG(1 _ZN3aaa9GG2222221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22222213fooEv");}
aaa::GG2222221 ::~GG2222221(){ note_dtor("_ZN3aaa9GG2222221E", this);} // tgen
aaa::GG2222221 ::GG2222221(){ note_ctor("_ZN3aaa9GG2222221E", this);} // tgen
}
static void Test__ZN3aaa9GG2222221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222221E, buf);
    ::aaa::GG2222221 *dp, &lv = *(dp=new (buf) ::aaa::GG2222221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222221E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2222221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2222221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2222221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222221E);
    dp->::aaa::GG2222221::~GG2222221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222221E(Test__ZN3aaa9GG2222221E, "_ZN3aaa9GG2222221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222221C1Ev();
extern void _ZN3aaa9GG2222221D1Ev();
Name_Map name_map__ZN3aaa9GG2222221E[] = {
  NSPAIR(_ZN3aaa9GG2222221C1Ev),
  NSPAIR(_ZN3aaa9GG2222221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2222221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222221E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22222213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22222213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222221E[];
Class_Descriptor cd__ZN3aaa9GG2222221E = {  "_ZN3aaa9GG2222221E", // class name
  bases__ZN3aaa9GG2222221E, 6,
  &(vtc__ZN3aaa9GG2222221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222222  : ::aaa::EE222 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22222223barEv
  ~GG2222222(); // tgen
  GG2222222(); // tgen
};
//SIG(1 _ZN3aaa9GG2222222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22222223barEv");}
aaa::GG2222222 ::~GG2222222(){ note_dtor("_ZN3aaa9GG2222222E", this);} // tgen
aaa::GG2222222 ::GG2222222(){ note_ctor("_ZN3aaa9GG2222222E", this);} // tgen
}
static void Test__ZN3aaa9GG2222222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222222E, buf);
    ::aaa::GG2222222 *dp, &lv = *(dp=new (buf) ::aaa::GG2222222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222222E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2222222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2222222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2222222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222222E);
    dp->::aaa::GG2222222::~GG2222222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222222E(Test__ZN3aaa9GG2222222E, "_ZN3aaa9GG2222222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222222C1Ev();
extern void _ZN3aaa9GG2222222D1Ev();
Name_Map name_map__ZN3aaa9GG2222222E[] = {
  NSPAIR(_ZN3aaa9GG2222222C1Ev),
  NSPAIR(_ZN3aaa9GG2222222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2222222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222222E[];
extern void _ZN3aaa9GG22222223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22222223barEv,_ZThn8_N3aaa9GG22222223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22222223barEv,_ZThn20_N3aaa9GG22222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22222223barEv,_ZThn28_N3aaa9GG22222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22222223barEv,_ZThn8_N3aaa9GG22222223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222223barEv,_ZThn20_N3aaa9GG22222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22222223barEv,_ZThn28_N3aaa9GG22222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222222E[];
Class_Descriptor cd__ZN3aaa9GG2222222E = {  "_ZN3aaa9GG2222222E", // class name
  bases__ZN3aaa9GG2222222E, 6,
  &(vtc__ZN3aaa9GG2222222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222222E),12, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222223  : ::aaa::EE222 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22222233fooEv
  virtual void  bar(); // _ZN3aaa9GG22222233barEv
  ~GG2222223(); // tgen
  GG2222223(); // tgen
};
//SIG(1 _ZN3aaa9GG2222223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22222233fooEv");}
void  aaa::GG2222223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22222233barEv");}
aaa::GG2222223 ::~GG2222223(){ note_dtor("_ZN3aaa9GG2222223E", this);} // tgen
aaa::GG2222223 ::GG2222223(){ note_ctor("_ZN3aaa9GG2222223E", this);} // tgen
}
static void Test__ZN3aaa9GG2222223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222223E, buf);
    ::aaa::GG2222223 *dp, &lv = *(dp=new (buf) ::aaa::GG2222223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222223E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2222223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2222223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2222223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222223E);
    dp->::aaa::GG2222223::~GG2222223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222223E(Test__ZN3aaa9GG2222223E, "_ZN3aaa9GG2222223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222223C1Ev();
extern void _ZN3aaa9GG2222223D1Ev();
Name_Map name_map__ZN3aaa9GG2222223E[] = {
  NSPAIR(_ZN3aaa9GG2222223C1Ev),
  NSPAIR(_ZN3aaa9GG2222223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2222223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222223E[];
extern void _ZN3aaa9GG22222233barEv();
extern void _ZN3aaa9GG22222233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22222233barEv,_ZThn8_N3aaa9GG22222233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22222233barEv,_ZThn20_N3aaa9GG22222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22222233barEv,_ZThn28_N3aaa9GG22222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22222233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22222233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22222233barEv,_ZThn8_N3aaa9GG22222233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222233barEv,_ZThn20_N3aaa9GG22222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22222233barEv,_ZThn28_N3aaa9GG22222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222223E[];
Class_Descriptor cd__ZN3aaa9GG2222223E = {  "_ZN3aaa9GG2222223E", // class name
  bases__ZN3aaa9GG2222223E, 6,
  &(vtc__ZN3aaa9GG2222223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222231  : ::aaa::EE222 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22222313fooEv
  ~GG2222231(); // tgen
  GG2222231(); // tgen
};
//SIG(1 _ZN3aaa9GG2222231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22222313fooEv");}
aaa::GG2222231 ::~GG2222231(){ note_dtor("_ZN3aaa9GG2222231E", this);} // tgen
aaa::GG2222231 ::GG2222231(){ note_ctor("_ZN3aaa9GG2222231E", this);} // tgen
}
static void Test__ZN3aaa9GG2222231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222231E, buf);
    ::aaa::GG2222231 *dp, &lv = *(dp=new (buf) ::aaa::GG2222231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222231E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2222231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2222231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2222231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222231E);
    dp->::aaa::GG2222231::~GG2222231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222231E(Test__ZN3aaa9GG2222231E, "_ZN3aaa9GG2222231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222231C1Ev();
extern void _ZN3aaa9GG2222231D1Ev();
Name_Map name_map__ZN3aaa9GG2222231E[] = {
  NSPAIR(_ZN3aaa9GG2222231C1Ev),
  NSPAIR(_ZN3aaa9GG2222231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2222231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222231E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22222313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22222313fooEv,_ZThn20_N3aaa9GG22222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22222313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222313fooEv,_ZThn20_N3aaa9GG22222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222231E[];
Class_Descriptor cd__ZN3aaa9GG2222231E = {  "_ZN3aaa9GG2222231E", // class name
  bases__ZN3aaa9GG2222231E, 6,
  &(vtc__ZN3aaa9GG2222231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222232  : ::aaa::EE222 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22222323barEv
  ~GG2222232(); // tgen
  GG2222232(); // tgen
};
//SIG(1 _ZN3aaa9GG2222232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22222323barEv");}
aaa::GG2222232 ::~GG2222232(){ note_dtor("_ZN3aaa9GG2222232E", this);} // tgen
aaa::GG2222232 ::GG2222232(){ note_ctor("_ZN3aaa9GG2222232E", this);} // tgen
}
static void Test__ZN3aaa9GG2222232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222232E, buf);
    ::aaa::GG2222232 *dp, &lv = *(dp=new (buf) ::aaa::GG2222232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222232E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2222232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2222232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2222232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222232E);
    dp->::aaa::GG2222232::~GG2222232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222232E(Test__ZN3aaa9GG2222232E, "_ZN3aaa9GG2222232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222232C1Ev();
extern void _ZN3aaa9GG2222232D1Ev();
Name_Map name_map__ZN3aaa9GG2222232E[] = {
  NSPAIR(_ZN3aaa9GG2222232C1Ev),
  NSPAIR(_ZN3aaa9GG2222232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2222232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222232E[];
extern void _ZN3aaa9GG22222323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22222323barEv,_ZThn8_N3aaa9GG22222323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22222323barEv,_ZThn20_N3aaa9GG22222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22222323barEv,_ZThn28_N3aaa9GG22222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22222323barEv,_ZThn8_N3aaa9GG22222323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222323barEv,_ZThn20_N3aaa9GG22222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22222323barEv,_ZThn28_N3aaa9GG22222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222232E[];
Class_Descriptor cd__ZN3aaa9GG2222232E = {  "_ZN3aaa9GG2222232E", // class name
  bases__ZN3aaa9GG2222232E, 6,
  &(vtc__ZN3aaa9GG2222232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222232E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222233  : ::aaa::EE222 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22222333fooEv
  virtual void  bar(); // _ZN3aaa9GG22222333barEv
  ~GG2222233(); // tgen
  GG2222233(); // tgen
};
//SIG(1 _ZN3aaa9GG2222233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22222333fooEv");}
void  aaa::GG2222233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22222333barEv");}
aaa::GG2222233 ::~GG2222233(){ note_dtor("_ZN3aaa9GG2222233E", this);} // tgen
aaa::GG2222233 ::GG2222233(){ note_ctor("_ZN3aaa9GG2222233E", this);} // tgen
}
static void Test__ZN3aaa9GG2222233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222233E, buf);
    ::aaa::GG2222233 *dp, &lv = *(dp=new (buf) ::aaa::GG2222233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222233E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2222233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2222233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2222233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222233E);
    dp->::aaa::GG2222233::~GG2222233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222233E(Test__ZN3aaa9GG2222233E, "_ZN3aaa9GG2222233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222233C1Ev();
extern void _ZN3aaa9GG2222233D1Ev();
Name_Map name_map__ZN3aaa9GG2222233E[] = {
  NSPAIR(_ZN3aaa9GG2222233C1Ev),
  NSPAIR(_ZN3aaa9GG2222233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2222233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222233E[];
extern void _ZN3aaa9GG22222333barEv();
extern void _ZN3aaa9GG22222333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22222333barEv,_ZThn8_N3aaa9GG22222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22222333barEv,_ZThn20_N3aaa9GG22222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22222333fooEv,_ZThn20_N3aaa9GG22222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22222333barEv,_ZThn28_N3aaa9GG22222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22222333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22222333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22222333barEv,_ZThn8_N3aaa9GG22222333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222333barEv,_ZThn20_N3aaa9GG22222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22222333fooEv,_ZThn20_N3aaa9GG22222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22222333barEv,_ZThn28_N3aaa9GG22222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222233E[];
Class_Descriptor cd__ZN3aaa9GG2222233E = {  "_ZN3aaa9GG2222233E", // class name
  bases__ZN3aaa9GG2222233E, 6,
  &(vtc__ZN3aaa9GG2222233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222311  : ::aaa::EE222 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22223113fooEv
  ~GG2222311(); // tgen
  GG2222311(); // tgen
};
//SIG(1 _ZN3aaa9GG2222311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22223113fooEv");}
aaa::GG2222311 ::~GG2222311(){ note_dtor("_ZN3aaa9GG2222311E", this);} // tgen
aaa::GG2222311 ::GG2222311(){ note_ctor("_ZN3aaa9GG2222311E", this);} // tgen
}
static void Test__ZN3aaa9GG2222311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222311E, buf);
    ::aaa::GG2222311 *dp, &lv = *(dp=new (buf) ::aaa::GG2222311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222311E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2222311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2222311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2222311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222311E);
    dp->::aaa::GG2222311::~GG2222311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222311E(Test__ZN3aaa9GG2222311E, "_ZN3aaa9GG2222311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222311C1Ev();
extern void _ZN3aaa9GG2222311D1Ev();
Name_Map name_map__ZN3aaa9GG2222311E[] = {
  NSPAIR(_ZN3aaa9GG2222311C1Ev),
  NSPAIR(_ZN3aaa9GG2222311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2222311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222311E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22223113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22223113fooEv,_ZThn20_N3aaa9GG22223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223113fooEv,_ZThn28_N3aaa9GG22223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22223113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223113fooEv,_ZThn20_N3aaa9GG22223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223113fooEv,_ZThn28_N3aaa9GG22223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222311E[];
Class_Descriptor cd__ZN3aaa9GG2222311E = {  "_ZN3aaa9GG2222311E", // class name
  bases__ZN3aaa9GG2222311E, 6,
  &(vtc__ZN3aaa9GG2222311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222312  : ::aaa::EE222 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22223123barEv
  ~GG2222312(); // tgen
  GG2222312(); // tgen
};
//SIG(1 _ZN3aaa9GG2222312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 v1 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22223123barEv");}
aaa::GG2222312 ::~GG2222312(){ note_dtor("_ZN3aaa9GG2222312E", this);} // tgen
aaa::GG2222312 ::GG2222312(){ note_ctor("_ZN3aaa9GG2222312E", this);} // tgen
}
static void Test__ZN3aaa9GG2222312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222312E, buf);
    ::aaa::GG2222312 *dp, &lv = *(dp=new (buf) ::aaa::GG2222312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222312E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2222312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2222312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2222312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222312E);
    dp->::aaa::GG2222312::~GG2222312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222312E(Test__ZN3aaa9GG2222312E, "_ZN3aaa9GG2222312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222312C1Ev();
extern void _ZN3aaa9GG2222312D1Ev();
Name_Map name_map__ZN3aaa9GG2222312E[] = {
  NSPAIR(_ZN3aaa9GG2222312C1Ev),
  NSPAIR(_ZN3aaa9GG2222312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2222312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222312E[];
extern void _ZN3aaa9GG22223123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22223123barEv,_ZThn8_N3aaa9GG22223123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22223123barEv,_ZThn20_N3aaa9GG22223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223123barEv,_ZThn28_N3aaa9GG22223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22223123barEv,_ZThn8_N3aaa9GG22223123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223123barEv,_ZThn20_N3aaa9GG22223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223123barEv,_ZThn28_N3aaa9GG22223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222312E[];
Class_Descriptor cd__ZN3aaa9GG2222312E = {  "_ZN3aaa9GG2222312E", // class name
  bases__ZN3aaa9GG2222312E, 6,
  &(vtc__ZN3aaa9GG2222312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222313  : ::aaa::EE222 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22223133fooEv
  virtual void  bar(); // _ZN3aaa9GG22223133barEv
  ~GG2222313(); // tgen
  GG2222313(); // tgen
};
//SIG(1 _ZN3aaa9GG2222313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22223133fooEv");}
void  aaa::GG2222313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22223133barEv");}
aaa::GG2222313 ::~GG2222313(){ note_dtor("_ZN3aaa9GG2222313E", this);} // tgen
aaa::GG2222313 ::GG2222313(){ note_ctor("_ZN3aaa9GG2222313E", this);} // tgen
}
static void Test__ZN3aaa9GG2222313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222313E, buf);
    ::aaa::GG2222313 *dp, &lv = *(dp=new (buf) ::aaa::GG2222313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222313E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2222313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2222313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2222313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222313E);
    dp->::aaa::GG2222313::~GG2222313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222313E(Test__ZN3aaa9GG2222313E, "_ZN3aaa9GG2222313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222313C1Ev();
extern void _ZN3aaa9GG2222313D1Ev();
Name_Map name_map__ZN3aaa9GG2222313E[] = {
  NSPAIR(_ZN3aaa9GG2222313C1Ev),
  NSPAIR(_ZN3aaa9GG2222313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2222313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222313E[];
extern void _ZN3aaa9GG22223133barEv();
extern void _ZN3aaa9GG22223133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22223133barEv,_ZThn8_N3aaa9GG22223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22223133barEv,_ZThn20_N3aaa9GG22223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22223133fooEv,_ZThn20_N3aaa9GG22223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223133fooEv,_ZThn28_N3aaa9GG22223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223133barEv,_ZThn28_N3aaa9GG22223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22223133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22223133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22223133barEv,_ZThn8_N3aaa9GG22223133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223133barEv,_ZThn20_N3aaa9GG22223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223133fooEv,_ZThn20_N3aaa9GG22223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223133fooEv,_ZThn28_N3aaa9GG22223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223133barEv,_ZThn28_N3aaa9GG22223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222313E[];
Class_Descriptor cd__ZN3aaa9GG2222313E = {  "_ZN3aaa9GG2222313E", // class name
  bases__ZN3aaa9GG2222313E, 6,
  &(vtc__ZN3aaa9GG2222313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222321  : ::aaa::EE222 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22223213fooEv
  ~GG2222321(); // tgen
  GG2222321(); // tgen
};
//SIG(1 _ZN3aaa9GG2222321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22223213fooEv");}
aaa::GG2222321 ::~GG2222321(){ note_dtor("_ZN3aaa9GG2222321E", this);} // tgen
aaa::GG2222321 ::GG2222321(){ note_ctor("_ZN3aaa9GG2222321E", this);} // tgen
}
static void Test__ZN3aaa9GG2222321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222321E, buf);
    ::aaa::GG2222321 *dp, &lv = *(dp=new (buf) ::aaa::GG2222321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222321E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2222321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2222321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2222321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222321E);
    dp->::aaa::GG2222321::~GG2222321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222321E(Test__ZN3aaa9GG2222321E, "_ZN3aaa9GG2222321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222321C1Ev();
extern void _ZN3aaa9GG2222321D1Ev();
Name_Map name_map__ZN3aaa9GG2222321E[] = {
  NSPAIR(_ZN3aaa9GG2222321C1Ev),
  NSPAIR(_ZN3aaa9GG2222321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2222321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222321E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22223213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22223213fooEv,_ZThn28_N3aaa9GG22223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22223213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223213fooEv,_ZThn28_N3aaa9GG22223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222321E[];
Class_Descriptor cd__ZN3aaa9GG2222321E = {  "_ZN3aaa9GG2222321E", // class name
  bases__ZN3aaa9GG2222321E, 6,
  &(vtc__ZN3aaa9GG2222321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222322  : ::aaa::EE222 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22223223barEv
  ~GG2222322(); // tgen
  GG2222322(); // tgen
};
//SIG(1 _ZN3aaa9GG2222322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22223223barEv");}
aaa::GG2222322 ::~GG2222322(){ note_dtor("_ZN3aaa9GG2222322E", this);} // tgen
aaa::GG2222322 ::GG2222322(){ note_ctor("_ZN3aaa9GG2222322E", this);} // tgen
}
static void Test__ZN3aaa9GG2222322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222322E, buf);
    ::aaa::GG2222322 *dp, &lv = *(dp=new (buf) ::aaa::GG2222322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222322E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2222322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2222322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2222322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222322E);
    dp->::aaa::GG2222322::~GG2222322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222322E(Test__ZN3aaa9GG2222322E, "_ZN3aaa9GG2222322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222322C1Ev();
extern void _ZN3aaa9GG2222322D1Ev();
Name_Map name_map__ZN3aaa9GG2222322E[] = {
  NSPAIR(_ZN3aaa9GG2222322C1Ev),
  NSPAIR(_ZN3aaa9GG2222322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2222322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222322E[];
extern void _ZN3aaa9GG22223223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22223223barEv,_ZThn8_N3aaa9GG22223223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22223223barEv,_ZThn20_N3aaa9GG22223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22223223barEv,_ZThn28_N3aaa9GG22223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22223223barEv,_ZThn8_N3aaa9GG22223223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223223barEv,_ZThn20_N3aaa9GG22223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223223barEv,_ZThn28_N3aaa9GG22223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222322E[];
Class_Descriptor cd__ZN3aaa9GG2222322E = {  "_ZN3aaa9GG2222322E", // class name
  bases__ZN3aaa9GG2222322E, 6,
  &(vtc__ZN3aaa9GG2222322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222322E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222323  : ::aaa::EE222 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22223233fooEv
  virtual void  bar(); // _ZN3aaa9GG22223233barEv
  ~GG2222323(); // tgen
  GG2222323(); // tgen
};
//SIG(1 _ZN3aaa9GG2222323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22223233fooEv");}
void  aaa::GG2222323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22223233barEv");}
aaa::GG2222323 ::~GG2222323(){ note_dtor("_ZN3aaa9GG2222323E", this);} // tgen
aaa::GG2222323 ::GG2222323(){ note_ctor("_ZN3aaa9GG2222323E", this);} // tgen
}
static void Test__ZN3aaa9GG2222323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222323E, buf);
    ::aaa::GG2222323 *dp, &lv = *(dp=new (buf) ::aaa::GG2222323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222323E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2222323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2222323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2222323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222323E);
    dp->::aaa::GG2222323::~GG2222323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222323E(Test__ZN3aaa9GG2222323E, "_ZN3aaa9GG2222323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222323C1Ev();
extern void _ZN3aaa9GG2222323D1Ev();
Name_Map name_map__ZN3aaa9GG2222323E[] = {
  NSPAIR(_ZN3aaa9GG2222323C1Ev),
  NSPAIR(_ZN3aaa9GG2222323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2222323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222323E[];
extern void _ZN3aaa9GG22223233barEv();
extern void _ZN3aaa9GG22223233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22223233barEv,_ZThn8_N3aaa9GG22223233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22223233barEv,_ZThn20_N3aaa9GG22223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223233fooEv,_ZThn28_N3aaa9GG22223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223233barEv,_ZThn28_N3aaa9GG22223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22223233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22223233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22223233barEv,_ZThn8_N3aaa9GG22223233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223233barEv,_ZThn20_N3aaa9GG22223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223233fooEv,_ZThn28_N3aaa9GG22223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223233barEv,_ZThn28_N3aaa9GG22223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222323E[];
Class_Descriptor cd__ZN3aaa9GG2222323E = {  "_ZN3aaa9GG2222323E", // class name
  bases__ZN3aaa9GG2222323E, 6,
  &(vtc__ZN3aaa9GG2222323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222331  : ::aaa::EE222 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22223313fooEv
  ~GG2222331(); // tgen
  GG2222331(); // tgen
};
//SIG(1 _ZN3aaa9GG2222331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22223313fooEv");}
aaa::GG2222331 ::~GG2222331(){ note_dtor("_ZN3aaa9GG2222331E", this);} // tgen
aaa::GG2222331 ::GG2222331(){ note_ctor("_ZN3aaa9GG2222331E", this);} // tgen
}
static void Test__ZN3aaa9GG2222331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222331E, buf);
    ::aaa::GG2222331 *dp, &lv = *(dp=new (buf) ::aaa::GG2222331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222331E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2222331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2222331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2222331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222331E);
    dp->::aaa::GG2222331::~GG2222331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222331E(Test__ZN3aaa9GG2222331E, "_ZN3aaa9GG2222331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222331C1Ev();
extern void _ZN3aaa9GG2222331D1Ev();
Name_Map name_map__ZN3aaa9GG2222331E[] = {
  NSPAIR(_ZN3aaa9GG2222331C1Ev),
  NSPAIR(_ZN3aaa9GG2222331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2222331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222331E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22223313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22223313fooEv,_ZThn20_N3aaa9GG22223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223313fooEv,_ZThn28_N3aaa9GG22223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22223313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223313fooEv,_ZThn20_N3aaa9GG22223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223313fooEv,_ZThn28_N3aaa9GG22223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222331E[];
Class_Descriptor cd__ZN3aaa9GG2222331E = {  "_ZN3aaa9GG2222331E", // class name
  bases__ZN3aaa9GG2222331E, 6,
  &(vtc__ZN3aaa9GG2222331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222332  : ::aaa::EE222 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22223323barEv
  ~GG2222332(); // tgen
  GG2222332(); // tgen
};
//SIG(1 _ZN3aaa9GG2222332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 v1 Fi} v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2222332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22223323barEv");}
aaa::GG2222332 ::~GG2222332(){ note_dtor("_ZN3aaa9GG2222332E", this);} // tgen
aaa::GG2222332 ::GG2222332(){ note_ctor("_ZN3aaa9GG2222332E", this);} // tgen
}
static void Test__ZN3aaa9GG2222332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222332E, buf);
    ::aaa::GG2222332 *dp, &lv = *(dp=new (buf) ::aaa::GG2222332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222332E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2222332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2222332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2222332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222332E);
    dp->::aaa::GG2222332::~GG2222332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222332E(Test__ZN3aaa9GG2222332E, "_ZN3aaa9GG2222332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222332C1Ev();
extern void _ZN3aaa9GG2222332D1Ev();
Name_Map name_map__ZN3aaa9GG2222332E[] = {
  NSPAIR(_ZN3aaa9GG2222332C1Ev),
  NSPAIR(_ZN3aaa9GG2222332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2222332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222332E[];
extern void _ZN3aaa9GG22223323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22223323barEv,_ZThn8_N3aaa9GG22223323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22223323barEv,_ZThn20_N3aaa9GG22223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223323barEv,_ZThn28_N3aaa9GG22223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22223323barEv,_ZThn8_N3aaa9GG22223323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223323barEv,_ZThn20_N3aaa9GG22223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223323barEv,_ZThn28_N3aaa9GG22223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222332E[];
Class_Descriptor cd__ZN3aaa9GG2222332E = {  "_ZN3aaa9GG2222332E", // class name
  bases__ZN3aaa9GG2222332E, 6,
  &(vtc__ZN3aaa9GG2222332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222332E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2222333  : ::aaa::EE222 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22223333fooEv
  virtual void  bar(); // _ZN3aaa9GG22223333barEv
  ~GG2222333(); // tgen
  GG2222333(); // tgen
};
//SIG(1 _ZN3aaa9GG2222333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2222333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22223333fooEv");}
void  aaa::GG2222333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22223333barEv");}
aaa::GG2222333 ::~GG2222333(){ note_dtor("_ZN3aaa9GG2222333E", this);} // tgen
aaa::GG2222333 ::GG2222333(){ note_ctor("_ZN3aaa9GG2222333E", this);} // tgen
}
static void Test__ZN3aaa9GG2222333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2222333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2222333E, buf);
    ::aaa::GG2222333 *dp, &lv = *(dp=new (buf) ::aaa::GG2222333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2222333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2222333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2222333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2222333E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2222333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2222333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2222333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2222333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2222333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2222333E);
    dp->::aaa::GG2222333::~GG2222333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2222333E(Test__ZN3aaa9GG2222333E, "_ZN3aaa9GG2222333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2222333C1Ev();
extern void _ZN3aaa9GG2222333D1Ev();
Name_Map name_map__ZN3aaa9GG2222333E[] = {
  NSPAIR(_ZN3aaa9GG2222333C1Ev),
  NSPAIR(_ZN3aaa9GG2222333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2222333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2222333E[];
extern void _ZN3aaa9GG22223333barEv();
extern void _ZN3aaa9GG22223333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22223333barEv,_ZThn8_N3aaa9GG22223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22223333barEv,_ZThn20_N3aaa9GG22223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22223333fooEv,_ZThn20_N3aaa9GG22223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223333fooEv,_ZThn28_N3aaa9GG22223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22223333barEv,_ZThn28_N3aaa9GG22223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2222333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22223333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22223333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22223333barEv,_ZThn8_N3aaa9GG22223333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223333barEv,_ZThn20_N3aaa9GG22223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22223333fooEv,_ZThn20_N3aaa9GG22223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223333fooEv,_ZThn28_N3aaa9GG22223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22223333barEv,_ZThn28_N3aaa9GG22223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2222333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2222333E[];
Class_Descriptor cd__ZN3aaa9GG2222333E = {  "_ZN3aaa9GG2222333E", // class name
  bases__ZN3aaa9GG2222333E, 6,
  &(vtc__ZN3aaa9GG2222333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2222333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2222333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223111  : ::aaa::EE222 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22231113fooEv
  ~GG2223111(); // tgen
  GG2223111(); // tgen
};
//SIG(1 _ZN3aaa9GG2223111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22231113fooEv");}
aaa::GG2223111 ::~GG2223111(){ note_dtor("_ZN3aaa9GG2223111E", this);} // tgen
aaa::GG2223111 ::GG2223111(){ note_ctor("_ZN3aaa9GG2223111E", this);} // tgen
}
static void Test__ZN3aaa9GG2223111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223111E, buf);
    ::aaa::GG2223111 *dp, &lv = *(dp=new (buf) ::aaa::GG2223111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223111E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2223111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2223111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2223111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223111E);
    dp->::aaa::GG2223111::~GG2223111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223111E(Test__ZN3aaa9GG2223111E, "_ZN3aaa9GG2223111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223111C1Ev();
extern void _ZN3aaa9GG2223111D1Ev();
Name_Map name_map__ZN3aaa9GG2223111E[] = {
  NSPAIR(_ZN3aaa9GG2223111C1Ev),
  NSPAIR(_ZN3aaa9GG2223111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2223111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223111E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22231113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231113fooEv,_ZThn20_N3aaa9GG22231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22231113fooEv,_ZThn28_N3aaa9GG22231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22231113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231113fooEv,_ZThn20_N3aaa9GG22231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22231113fooEv,_ZThn28_N3aaa9GG22231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223111E[];
Class_Descriptor cd__ZN3aaa9GG2223111E = {  "_ZN3aaa9GG2223111E", // class name
  bases__ZN3aaa9GG2223111E, 6,
  &(vtc__ZN3aaa9GG2223111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223112  : ::aaa::EE222 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22231123barEv
  ~GG2223112(); // tgen
  GG2223112(); // tgen
};
//SIG(1 _ZN3aaa9GG2223112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC7{ v2 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22231123barEv");}
aaa::GG2223112 ::~GG2223112(){ note_dtor("_ZN3aaa9GG2223112E", this);} // tgen
aaa::GG2223112 ::GG2223112(){ note_ctor("_ZN3aaa9GG2223112E", this);} // tgen
}
static void Test__ZN3aaa9GG2223112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223112E, buf);
    ::aaa::GG2223112 *dp, &lv = *(dp=new (buf) ::aaa::GG2223112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223112E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2223112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2223112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2223112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223112E);
    dp->::aaa::GG2223112::~GG2223112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223112E(Test__ZN3aaa9GG2223112E, "_ZN3aaa9GG2223112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223112C1Ev();
extern void _ZN3aaa9GG2223112D1Ev();
Name_Map name_map__ZN3aaa9GG2223112E[] = {
  NSPAIR(_ZN3aaa9GG2223112C1Ev),
  NSPAIR(_ZN3aaa9GG2223112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2223112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223112E[];
extern void _ZN3aaa9GG22231123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22231123barEv,_ZThn8_N3aaa9GG22231123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22231123barEv,_ZThn20_N3aaa9GG22231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22231123barEv,_ZThn8_N3aaa9GG22231123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231123barEv,_ZThn20_N3aaa9GG22231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223112E[];
Class_Descriptor cd__ZN3aaa9GG2223112E = {  "_ZN3aaa9GG2223112E", // class name
  bases__ZN3aaa9GG2223112E, 6,
  &(vtc__ZN3aaa9GG2223112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223113  : ::aaa::EE222 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22231133fooEv
  virtual void  bar(); // _ZN3aaa9GG22231133barEv
  ~GG2223113(); // tgen
  GG2223113(); // tgen
};
//SIG(1 _ZN3aaa9GG2223113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22231133fooEv");}
void  aaa::GG2223113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22231133barEv");}
aaa::GG2223113 ::~GG2223113(){ note_dtor("_ZN3aaa9GG2223113E", this);} // tgen
aaa::GG2223113 ::GG2223113(){ note_ctor("_ZN3aaa9GG2223113E", this);} // tgen
}
static void Test__ZN3aaa9GG2223113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223113E, buf);
    ::aaa::GG2223113 *dp, &lv = *(dp=new (buf) ::aaa::GG2223113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223113E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2223113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2223113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2223113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223113E);
    dp->::aaa::GG2223113::~GG2223113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223113E(Test__ZN3aaa9GG2223113E, "_ZN3aaa9GG2223113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223113C1Ev();
extern void _ZN3aaa9GG2223113D1Ev();
Name_Map name_map__ZN3aaa9GG2223113E[] = {
  NSPAIR(_ZN3aaa9GG2223113C1Ev),
  NSPAIR(_ZN3aaa9GG2223113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2223113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223113E[];
extern void _ZN3aaa9GG22231133barEv();
extern void _ZN3aaa9GG22231133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22231133barEv,_ZThn8_N3aaa9GG22231133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231133fooEv,_ZThn20_N3aaa9GG22231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231133barEv,_ZThn20_N3aaa9GG22231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22231133fooEv,_ZThn28_N3aaa9GG22231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22231133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22231133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22231133barEv,_ZThn8_N3aaa9GG22231133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231133fooEv,_ZThn20_N3aaa9GG22231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231133barEv,_ZThn20_N3aaa9GG22231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22231133fooEv,_ZThn28_N3aaa9GG22231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223113E[];
Class_Descriptor cd__ZN3aaa9GG2223113E = {  "_ZN3aaa9GG2223113E", // class name
  bases__ZN3aaa9GG2223113E, 6,
  &(vtc__ZN3aaa9GG2223113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223121  : ::aaa::EE222 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22231213fooEv
  ~GG2223121(); // tgen
  GG2223121(); // tgen
};
//SIG(1 _ZN3aaa9GG2223121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22231213fooEv");}
aaa::GG2223121 ::~GG2223121(){ note_dtor("_ZN3aaa9GG2223121E", this);} // tgen
aaa::GG2223121 ::GG2223121(){ note_ctor("_ZN3aaa9GG2223121E", this);} // tgen
}
static void Test__ZN3aaa9GG2223121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223121E, buf);
    ::aaa::GG2223121 *dp, &lv = *(dp=new (buf) ::aaa::GG2223121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223121E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2223121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2223121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2223121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223121E);
    dp->::aaa::GG2223121::~GG2223121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223121E(Test__ZN3aaa9GG2223121E, "_ZN3aaa9GG2223121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223121C1Ev();
extern void _ZN3aaa9GG2223121D1Ev();
Name_Map name_map__ZN3aaa9GG2223121E[] = {
  NSPAIR(_ZN3aaa9GG2223121C1Ev),
  NSPAIR(_ZN3aaa9GG2223121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2223121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223121E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22231213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231213fooEv,_ZThn20_N3aaa9GG22231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22231213fooEv,_ZThn28_N3aaa9GG22231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22231213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231213fooEv,_ZThn20_N3aaa9GG22231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22231213fooEv,_ZThn28_N3aaa9GG22231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223121E[];
Class_Descriptor cd__ZN3aaa9GG2223121E = {  "_ZN3aaa9GG2223121E", // class name
  bases__ZN3aaa9GG2223121E, 6,
  &(vtc__ZN3aaa9GG2223121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223122  : ::aaa::EE222 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22231223barEv
  ~GG2223122(); // tgen
  GG2223122(); // tgen
};
//SIG(1 _ZN3aaa9GG2223122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22231223barEv");}
aaa::GG2223122 ::~GG2223122(){ note_dtor("_ZN3aaa9GG2223122E", this);} // tgen
aaa::GG2223122 ::GG2223122(){ note_ctor("_ZN3aaa9GG2223122E", this);} // tgen
}
static void Test__ZN3aaa9GG2223122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223122E, buf);
    ::aaa::GG2223122 *dp, &lv = *(dp=new (buf) ::aaa::GG2223122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223122E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2223122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2223122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2223122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223122E);
    dp->::aaa::GG2223122::~GG2223122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223122E(Test__ZN3aaa9GG2223122E, "_ZN3aaa9GG2223122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223122C1Ev();
extern void _ZN3aaa9GG2223122D1Ev();
Name_Map name_map__ZN3aaa9GG2223122E[] = {
  NSPAIR(_ZN3aaa9GG2223122C1Ev),
  NSPAIR(_ZN3aaa9GG2223122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2223122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223122E[];
extern void _ZN3aaa9GG22231223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22231223barEv,_ZThn8_N3aaa9GG22231223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22231223barEv,_ZThn20_N3aaa9GG22231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22231223barEv,_ZThn8_N3aaa9GG22231223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231223barEv,_ZThn20_N3aaa9GG22231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223122E[];
Class_Descriptor cd__ZN3aaa9GG2223122E = {  "_ZN3aaa9GG2223122E", // class name
  bases__ZN3aaa9GG2223122E, 6,
  &(vtc__ZN3aaa9GG2223122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223123  : ::aaa::EE222 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22231233fooEv
  virtual void  bar(); // _ZN3aaa9GG22231233barEv
  ~GG2223123(); // tgen
  GG2223123(); // tgen
};
//SIG(1 _ZN3aaa9GG2223123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22231233fooEv");}
void  aaa::GG2223123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22231233barEv");}
aaa::GG2223123 ::~GG2223123(){ note_dtor("_ZN3aaa9GG2223123E", this);} // tgen
aaa::GG2223123 ::GG2223123(){ note_ctor("_ZN3aaa9GG2223123E", this);} // tgen
}
static void Test__ZN3aaa9GG2223123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223123E, buf);
    ::aaa::GG2223123 *dp, &lv = *(dp=new (buf) ::aaa::GG2223123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223123E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2223123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2223123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2223123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223123E);
    dp->::aaa::GG2223123::~GG2223123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223123E(Test__ZN3aaa9GG2223123E, "_ZN3aaa9GG2223123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223123C1Ev();
extern void _ZN3aaa9GG2223123D1Ev();
Name_Map name_map__ZN3aaa9GG2223123E[] = {
  NSPAIR(_ZN3aaa9GG2223123C1Ev),
  NSPAIR(_ZN3aaa9GG2223123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2223123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223123E[];
extern void _ZN3aaa9GG22231233barEv();
extern void _ZN3aaa9GG22231233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22231233barEv,_ZThn8_N3aaa9GG22231233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231233fooEv,_ZThn20_N3aaa9GG22231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231233barEv,_ZThn20_N3aaa9GG22231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22231233fooEv,_ZThn28_N3aaa9GG22231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22231233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22231233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22231233barEv,_ZThn8_N3aaa9GG22231233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231233fooEv,_ZThn20_N3aaa9GG22231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231233barEv,_ZThn20_N3aaa9GG22231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22231233fooEv,_ZThn28_N3aaa9GG22231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223123E[];
Class_Descriptor cd__ZN3aaa9GG2223123E = {  "_ZN3aaa9GG2223123E", // class name
  bases__ZN3aaa9GG2223123E, 6,
  &(vtc__ZN3aaa9GG2223123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223131  : ::aaa::EE222 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22231313fooEv
  ~GG2223131(); // tgen
  GG2223131(); // tgen
};
//SIG(1 _ZN3aaa9GG2223131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22231313fooEv");}
aaa::GG2223131 ::~GG2223131(){ note_dtor("_ZN3aaa9GG2223131E", this);} // tgen
aaa::GG2223131 ::GG2223131(){ note_ctor("_ZN3aaa9GG2223131E", this);} // tgen
}
static void Test__ZN3aaa9GG2223131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223131E, buf);
    ::aaa::GG2223131 *dp, &lv = *(dp=new (buf) ::aaa::GG2223131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223131E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2223131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2223131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2223131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223131E);
    dp->::aaa::GG2223131::~GG2223131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223131E(Test__ZN3aaa9GG2223131E, "_ZN3aaa9GG2223131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223131C1Ev();
extern void _ZN3aaa9GG2223131D1Ev();
Name_Map name_map__ZN3aaa9GG2223131E[] = {
  NSPAIR(_ZN3aaa9GG2223131C1Ev),
  NSPAIR(_ZN3aaa9GG2223131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2223131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223131E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22231313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231313fooEv,_ZThn20_N3aaa9GG22231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22231313fooEv,_ZThn28_N3aaa9GG22231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22231313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231313fooEv,_ZThn20_N3aaa9GG22231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22231313fooEv,_ZThn28_N3aaa9GG22231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223131E[];
Class_Descriptor cd__ZN3aaa9GG2223131E = {  "_ZN3aaa9GG2223131E", // class name
  bases__ZN3aaa9GG2223131E, 6,
  &(vtc__ZN3aaa9GG2223131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223132  : ::aaa::EE222 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22231323barEv
  ~GG2223132(); // tgen
  GG2223132(); // tgen
};
//SIG(1 _ZN3aaa9GG2223132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC7{ v2 Fi} v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22231323barEv");}
aaa::GG2223132 ::~GG2223132(){ note_dtor("_ZN3aaa9GG2223132E", this);} // tgen
aaa::GG2223132 ::GG2223132(){ note_ctor("_ZN3aaa9GG2223132E", this);} // tgen
}
static void Test__ZN3aaa9GG2223132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223132E, buf);
    ::aaa::GG2223132 *dp, &lv = *(dp=new (buf) ::aaa::GG2223132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223132E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2223132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2223132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2223132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223132E);
    dp->::aaa::GG2223132::~GG2223132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223132E(Test__ZN3aaa9GG2223132E, "_ZN3aaa9GG2223132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223132C1Ev();
extern void _ZN3aaa9GG2223132D1Ev();
Name_Map name_map__ZN3aaa9GG2223132E[] = {
  NSPAIR(_ZN3aaa9GG2223132C1Ev),
  NSPAIR(_ZN3aaa9GG2223132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2223132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223132E[];
extern void _ZN3aaa9GG22231323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22231323barEv,_ZThn8_N3aaa9GG22231323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22231323barEv,_ZThn20_N3aaa9GG22231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22231323barEv,_ZThn8_N3aaa9GG22231323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231323barEv,_ZThn20_N3aaa9GG22231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223132E[];
Class_Descriptor cd__ZN3aaa9GG2223132E = {  "_ZN3aaa9GG2223132E", // class name
  bases__ZN3aaa9GG2223132E, 6,
  &(vtc__ZN3aaa9GG2223132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223132E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223133  : ::aaa::EE222 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22231333fooEv
  virtual void  bar(); // _ZN3aaa9GG22231333barEv
  ~GG2223133(); // tgen
  GG2223133(); // tgen
};
//SIG(1 _ZN3aaa9GG2223133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22231333fooEv");}
void  aaa::GG2223133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22231333barEv");}
aaa::GG2223133 ::~GG2223133(){ note_dtor("_ZN3aaa9GG2223133E", this);} // tgen
aaa::GG2223133 ::GG2223133(){ note_ctor("_ZN3aaa9GG2223133E", this);} // tgen
}
static void Test__ZN3aaa9GG2223133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223133E, buf);
    ::aaa::GG2223133 *dp, &lv = *(dp=new (buf) ::aaa::GG2223133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223133E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2223133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2223133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2223133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223133E);
    dp->::aaa::GG2223133::~GG2223133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223133E(Test__ZN3aaa9GG2223133E, "_ZN3aaa9GG2223133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223133C1Ev();
extern void _ZN3aaa9GG2223133D1Ev();
Name_Map name_map__ZN3aaa9GG2223133E[] = {
  NSPAIR(_ZN3aaa9GG2223133C1Ev),
  NSPAIR(_ZN3aaa9GG2223133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2223133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223133E[];
extern void _ZN3aaa9GG22231333barEv();
extern void _ZN3aaa9GG22231333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22231333barEv,_ZThn8_N3aaa9GG22231333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231333fooEv,_ZThn20_N3aaa9GG22231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22231333barEv,_ZThn20_N3aaa9GG22231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22231333fooEv,_ZThn28_N3aaa9GG22231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22231333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22231333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22231333barEv,_ZThn8_N3aaa9GG22231333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231333fooEv,_ZThn20_N3aaa9GG22231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22231333barEv,_ZThn20_N3aaa9GG22231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22231333fooEv,_ZThn28_N3aaa9GG22231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223133E[];
Class_Descriptor cd__ZN3aaa9GG2223133E = {  "_ZN3aaa9GG2223133E", // class name
  bases__ZN3aaa9GG2223133E, 6,
  &(vtc__ZN3aaa9GG2223133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223211  : ::aaa::EE222 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22232113fooEv
  ~GG2223211(); // tgen
  GG2223211(); // tgen
};
//SIG(1 _ZN3aaa9GG2223211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22232113fooEv");}
aaa::GG2223211 ::~GG2223211(){ note_dtor("_ZN3aaa9GG2223211E", this);} // tgen
aaa::GG2223211 ::GG2223211(){ note_ctor("_ZN3aaa9GG2223211E", this);} // tgen
}
static void Test__ZN3aaa9GG2223211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223211E, buf);
    ::aaa::GG2223211 *dp, &lv = *(dp=new (buf) ::aaa::GG2223211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223211E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2223211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2223211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2223211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223211E);
    dp->::aaa::GG2223211::~GG2223211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223211E(Test__ZN3aaa9GG2223211E, "_ZN3aaa9GG2223211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223211C1Ev();
extern void _ZN3aaa9GG2223211D1Ev();
Name_Map name_map__ZN3aaa9GG2223211E[] = {
  NSPAIR(_ZN3aaa9GG2223211C1Ev),
  NSPAIR(_ZN3aaa9GG2223211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2223211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223211E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22232113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232113fooEv,_ZThn20_N3aaa9GG22232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22232113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232113fooEv,_ZThn20_N3aaa9GG22232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223211E[];
Class_Descriptor cd__ZN3aaa9GG2223211E = {  "_ZN3aaa9GG2223211E", // class name
  bases__ZN3aaa9GG2223211E, 6,
  &(vtc__ZN3aaa9GG2223211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223212  : ::aaa::EE222 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22232123barEv
  ~GG2223212(); // tgen
  GG2223212(); // tgen
};
//SIG(1 _ZN3aaa9GG2223212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC4 v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22232123barEv");}
aaa::GG2223212 ::~GG2223212(){ note_dtor("_ZN3aaa9GG2223212E", this);} // tgen
aaa::GG2223212 ::GG2223212(){ note_ctor("_ZN3aaa9GG2223212E", this);} // tgen
}
static void Test__ZN3aaa9GG2223212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223212E, buf);
    ::aaa::GG2223212 *dp, &lv = *(dp=new (buf) ::aaa::GG2223212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223212E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2223212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2223212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2223212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223212E);
    dp->::aaa::GG2223212::~GG2223212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223212E(Test__ZN3aaa9GG2223212E, "_ZN3aaa9GG2223212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223212C1Ev();
extern void _ZN3aaa9GG2223212D1Ev();
Name_Map name_map__ZN3aaa9GG2223212E[] = {
  NSPAIR(_ZN3aaa9GG2223212C1Ev),
  NSPAIR(_ZN3aaa9GG2223212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2223212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223212E[];
extern void _ZN3aaa9GG22232123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22232123barEv,_ZThn8_N3aaa9GG22232123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22232123barEv,_ZThn20_N3aaa9GG22232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22232123barEv,_ZThn28_N3aaa9GG22232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22232123barEv,_ZThn8_N3aaa9GG22232123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232123barEv,_ZThn20_N3aaa9GG22232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22232123barEv,_ZThn28_N3aaa9GG22232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223212E[];
Class_Descriptor cd__ZN3aaa9GG2223212E = {  "_ZN3aaa9GG2223212E", // class name
  bases__ZN3aaa9GG2223212E, 6,
  &(vtc__ZN3aaa9GG2223212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223213  : ::aaa::EE222 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22232133fooEv
  virtual void  bar(); // _ZN3aaa9GG22232133barEv
  ~GG2223213(); // tgen
  GG2223213(); // tgen
};
//SIG(1 _ZN3aaa9GG2223213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22232133fooEv");}
void  aaa::GG2223213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22232133barEv");}
aaa::GG2223213 ::~GG2223213(){ note_dtor("_ZN3aaa9GG2223213E", this);} // tgen
aaa::GG2223213 ::GG2223213(){ note_ctor("_ZN3aaa9GG2223213E", this);} // tgen
}
static void Test__ZN3aaa9GG2223213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223213E, buf);
    ::aaa::GG2223213 *dp, &lv = *(dp=new (buf) ::aaa::GG2223213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223213E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2223213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2223213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2223213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223213E);
    dp->::aaa::GG2223213::~GG2223213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223213E(Test__ZN3aaa9GG2223213E, "_ZN3aaa9GG2223213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223213C1Ev();
extern void _ZN3aaa9GG2223213D1Ev();
Name_Map name_map__ZN3aaa9GG2223213E[] = {
  NSPAIR(_ZN3aaa9GG2223213C1Ev),
  NSPAIR(_ZN3aaa9GG2223213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2223213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223213E[];
extern void _ZN3aaa9GG22232133barEv();
extern void _ZN3aaa9GG22232133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22232133barEv,_ZThn8_N3aaa9GG22232133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232133fooEv,_ZThn20_N3aaa9GG22232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232133barEv,_ZThn20_N3aaa9GG22232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22232133barEv,_ZThn28_N3aaa9GG22232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22232133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22232133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22232133barEv,_ZThn8_N3aaa9GG22232133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232133fooEv,_ZThn20_N3aaa9GG22232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232133barEv,_ZThn20_N3aaa9GG22232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22232133barEv,_ZThn28_N3aaa9GG22232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223213E[];
Class_Descriptor cd__ZN3aaa9GG2223213E = {  "_ZN3aaa9GG2223213E", // class name
  bases__ZN3aaa9GG2223213E, 6,
  &(vtc__ZN3aaa9GG2223213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223221  : ::aaa::EE222 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22232213fooEv
  ~GG2223221(); // tgen
  GG2223221(); // tgen
};
//SIG(1 _ZN3aaa9GG2223221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22232213fooEv");}
aaa::GG2223221 ::~GG2223221(){ note_dtor("_ZN3aaa9GG2223221E", this);} // tgen
aaa::GG2223221 ::GG2223221(){ note_ctor("_ZN3aaa9GG2223221E", this);} // tgen
}
static void Test__ZN3aaa9GG2223221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223221E, buf);
    ::aaa::GG2223221 *dp, &lv = *(dp=new (buf) ::aaa::GG2223221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223221E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2223221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2223221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2223221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223221E);
    dp->::aaa::GG2223221::~GG2223221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223221E(Test__ZN3aaa9GG2223221E, "_ZN3aaa9GG2223221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223221C1Ev();
extern void _ZN3aaa9GG2223221D1Ev();
Name_Map name_map__ZN3aaa9GG2223221E[] = {
  NSPAIR(_ZN3aaa9GG2223221C1Ev),
  NSPAIR(_ZN3aaa9GG2223221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2223221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223221E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22232213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232213fooEv,_ZThn20_N3aaa9GG22232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22232213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232213fooEv,_ZThn20_N3aaa9GG22232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223221E[];
Class_Descriptor cd__ZN3aaa9GG2223221E = {  "_ZN3aaa9GG2223221E", // class name
  bases__ZN3aaa9GG2223221E, 6,
  &(vtc__ZN3aaa9GG2223221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223222  : ::aaa::EE222 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22232223barEv
  ~GG2223222(); // tgen
  GG2223222(); // tgen
};
//SIG(1 _ZN3aaa9GG2223222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22232223barEv");}
aaa::GG2223222 ::~GG2223222(){ note_dtor("_ZN3aaa9GG2223222E", this);} // tgen
aaa::GG2223222 ::GG2223222(){ note_ctor("_ZN3aaa9GG2223222E", this);} // tgen
}
static void Test__ZN3aaa9GG2223222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223222E, buf);
    ::aaa::GG2223222 *dp, &lv = *(dp=new (buf) ::aaa::GG2223222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223222E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2223222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2223222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2223222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223222E);
    dp->::aaa::GG2223222::~GG2223222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223222E(Test__ZN3aaa9GG2223222E, "_ZN3aaa9GG2223222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223222C1Ev();
extern void _ZN3aaa9GG2223222D1Ev();
Name_Map name_map__ZN3aaa9GG2223222E[] = {
  NSPAIR(_ZN3aaa9GG2223222C1Ev),
  NSPAIR(_ZN3aaa9GG2223222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2223222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223222E[];
extern void _ZN3aaa9GG22232223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22232223barEv,_ZThn8_N3aaa9GG22232223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22232223barEv,_ZThn20_N3aaa9GG22232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22232223barEv,_ZThn28_N3aaa9GG22232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22232223barEv,_ZThn8_N3aaa9GG22232223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232223barEv,_ZThn20_N3aaa9GG22232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22232223barEv,_ZThn28_N3aaa9GG22232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223222E[];
Class_Descriptor cd__ZN3aaa9GG2223222E = {  "_ZN3aaa9GG2223222E", // class name
  bases__ZN3aaa9GG2223222E, 6,
  &(vtc__ZN3aaa9GG2223222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223223  : ::aaa::EE222 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22232233fooEv
  virtual void  bar(); // _ZN3aaa9GG22232233barEv
  ~GG2223223(); // tgen
  GG2223223(); // tgen
};
//SIG(1 _ZN3aaa9GG2223223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22232233fooEv");}
void  aaa::GG2223223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22232233barEv");}
aaa::GG2223223 ::~GG2223223(){ note_dtor("_ZN3aaa9GG2223223E", this);} // tgen
aaa::GG2223223 ::GG2223223(){ note_ctor("_ZN3aaa9GG2223223E", this);} // tgen
}
static void Test__ZN3aaa9GG2223223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223223E, buf);
    ::aaa::GG2223223 *dp, &lv = *(dp=new (buf) ::aaa::GG2223223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223223E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2223223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2223223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2223223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223223E);
    dp->::aaa::GG2223223::~GG2223223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223223E(Test__ZN3aaa9GG2223223E, "_ZN3aaa9GG2223223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223223C1Ev();
extern void _ZN3aaa9GG2223223D1Ev();
Name_Map name_map__ZN3aaa9GG2223223E[] = {
  NSPAIR(_ZN3aaa9GG2223223C1Ev),
  NSPAIR(_ZN3aaa9GG2223223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2223223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223223E[];
extern void _ZN3aaa9GG22232233barEv();
extern void _ZN3aaa9GG22232233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22232233barEv,_ZThn8_N3aaa9GG22232233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232233fooEv,_ZThn20_N3aaa9GG22232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232233barEv,_ZThn20_N3aaa9GG22232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22232233barEv,_ZThn28_N3aaa9GG22232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22232233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22232233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22232233barEv,_ZThn8_N3aaa9GG22232233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232233fooEv,_ZThn20_N3aaa9GG22232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232233barEv,_ZThn20_N3aaa9GG22232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22232233barEv,_ZThn28_N3aaa9GG22232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223223E[];
Class_Descriptor cd__ZN3aaa9GG2223223E = {  "_ZN3aaa9GG2223223E", // class name
  bases__ZN3aaa9GG2223223E, 6,
  &(vtc__ZN3aaa9GG2223223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223231  : ::aaa::EE222 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22232313fooEv
  ~GG2223231(); // tgen
  GG2223231(); // tgen
};
//SIG(1 _ZN3aaa9GG2223231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22232313fooEv");}
aaa::GG2223231 ::~GG2223231(){ note_dtor("_ZN3aaa9GG2223231E", this);} // tgen
aaa::GG2223231 ::GG2223231(){ note_ctor("_ZN3aaa9GG2223231E", this);} // tgen
}
static void Test__ZN3aaa9GG2223231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223231E, buf);
    ::aaa::GG2223231 *dp, &lv = *(dp=new (buf) ::aaa::GG2223231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223231E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2223231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2223231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2223231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223231E);
    dp->::aaa::GG2223231::~GG2223231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223231E(Test__ZN3aaa9GG2223231E, "_ZN3aaa9GG2223231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223231C1Ev();
extern void _ZN3aaa9GG2223231D1Ev();
Name_Map name_map__ZN3aaa9GG2223231E[] = {
  NSPAIR(_ZN3aaa9GG2223231C1Ev),
  NSPAIR(_ZN3aaa9GG2223231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2223231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223231E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22232313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232313fooEv,_ZThn20_N3aaa9GG22232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22232313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232313fooEv,_ZThn20_N3aaa9GG22232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223231E[];
Class_Descriptor cd__ZN3aaa9GG2223231E = {  "_ZN3aaa9GG2223231E", // class name
  bases__ZN3aaa9GG2223231E, 6,
  &(vtc__ZN3aaa9GG2223231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223232  : ::aaa::EE222 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22232323barEv
  ~GG2223232(); // tgen
  GG2223232(); // tgen
};
//SIG(1 _ZN3aaa9GG2223232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC4 v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22232323barEv");}
aaa::GG2223232 ::~GG2223232(){ note_dtor("_ZN3aaa9GG2223232E", this);} // tgen
aaa::GG2223232 ::GG2223232(){ note_ctor("_ZN3aaa9GG2223232E", this);} // tgen
}
static void Test__ZN3aaa9GG2223232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223232E, buf);
    ::aaa::GG2223232 *dp, &lv = *(dp=new (buf) ::aaa::GG2223232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223232E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2223232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2223232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2223232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223232E);
    dp->::aaa::GG2223232::~GG2223232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223232E(Test__ZN3aaa9GG2223232E, "_ZN3aaa9GG2223232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223232C1Ev();
extern void _ZN3aaa9GG2223232D1Ev();
Name_Map name_map__ZN3aaa9GG2223232E[] = {
  NSPAIR(_ZN3aaa9GG2223232C1Ev),
  NSPAIR(_ZN3aaa9GG2223232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2223232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223232E[];
extern void _ZN3aaa9GG22232323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22232323barEv,_ZThn8_N3aaa9GG22232323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22232323barEv,_ZThn20_N3aaa9GG22232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22232323barEv,_ZThn28_N3aaa9GG22232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22232323barEv,_ZThn8_N3aaa9GG22232323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232323barEv,_ZThn20_N3aaa9GG22232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22232323barEv,_ZThn28_N3aaa9GG22232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223232E[];
Class_Descriptor cd__ZN3aaa9GG2223232E = {  "_ZN3aaa9GG2223232E", // class name
  bases__ZN3aaa9GG2223232E, 6,
  &(vtc__ZN3aaa9GG2223232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223232E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223233  : ::aaa::EE222 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22232333fooEv
  virtual void  bar(); // _ZN3aaa9GG22232333barEv
  ~GG2223233(); // tgen
  GG2223233(); // tgen
};
//SIG(1 _ZN3aaa9GG2223233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22232333fooEv");}
void  aaa::GG2223233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22232333barEv");}
aaa::GG2223233 ::~GG2223233(){ note_dtor("_ZN3aaa9GG2223233E", this);} // tgen
aaa::GG2223233 ::GG2223233(){ note_ctor("_ZN3aaa9GG2223233E", this);} // tgen
}
static void Test__ZN3aaa9GG2223233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223233E, buf);
    ::aaa::GG2223233 *dp, &lv = *(dp=new (buf) ::aaa::GG2223233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223233E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2223233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2223233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2223233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223233E);
    dp->::aaa::GG2223233::~GG2223233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223233E(Test__ZN3aaa9GG2223233E, "_ZN3aaa9GG2223233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223233C1Ev();
extern void _ZN3aaa9GG2223233D1Ev();
Name_Map name_map__ZN3aaa9GG2223233E[] = {
  NSPAIR(_ZN3aaa9GG2223233C1Ev),
  NSPAIR(_ZN3aaa9GG2223233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2223233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223233E[];
extern void _ZN3aaa9GG22232333barEv();
extern void _ZN3aaa9GG22232333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22232333barEv,_ZThn8_N3aaa9GG22232333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232333fooEv,_ZThn20_N3aaa9GG22232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22232333barEv,_ZThn20_N3aaa9GG22232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22232333barEv,_ZThn28_N3aaa9GG22232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22232333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22232333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22232333barEv,_ZThn8_N3aaa9GG22232333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232333fooEv,_ZThn20_N3aaa9GG22232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22232333barEv,_ZThn20_N3aaa9GG22232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22232333barEv,_ZThn28_N3aaa9GG22232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223233E[];
Class_Descriptor cd__ZN3aaa9GG2223233E = {  "_ZN3aaa9GG2223233E", // class name
  bases__ZN3aaa9GG2223233E, 6,
  &(vtc__ZN3aaa9GG2223233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223311  : ::aaa::EE222 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22233113fooEv
  ~GG2223311(); // tgen
  GG2223311(); // tgen
};
//SIG(1 _ZN3aaa9GG2223311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22233113fooEv");}
aaa::GG2223311 ::~GG2223311(){ note_dtor("_ZN3aaa9GG2223311E", this);} // tgen
aaa::GG2223311 ::GG2223311(){ note_ctor("_ZN3aaa9GG2223311E", this);} // tgen
}
static void Test__ZN3aaa9GG2223311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223311E, buf);
    ::aaa::GG2223311 *dp, &lv = *(dp=new (buf) ::aaa::GG2223311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223311E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2223311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2223311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2223311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223311E);
    dp->::aaa::GG2223311::~GG2223311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223311E(Test__ZN3aaa9GG2223311E, "_ZN3aaa9GG2223311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223311C1Ev();
extern void _ZN3aaa9GG2223311D1Ev();
Name_Map name_map__ZN3aaa9GG2223311E[] = {
  NSPAIR(_ZN3aaa9GG2223311C1Ev),
  NSPAIR(_ZN3aaa9GG2223311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2223311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223311E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22233113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233113fooEv,_ZThn20_N3aaa9GG22233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22233113fooEv,_ZThn28_N3aaa9GG22233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22233113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233113fooEv,_ZThn20_N3aaa9GG22233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233113fooEv,_ZThn28_N3aaa9GG22233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223311E[];
Class_Descriptor cd__ZN3aaa9GG2223311E = {  "_ZN3aaa9GG2223311E", // class name
  bases__ZN3aaa9GG2223311E, 6,
  &(vtc__ZN3aaa9GG2223311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223312  : ::aaa::EE222 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22233123barEv
  ~GG2223312(); // tgen
  GG2223312(); // tgen
};
//SIG(1 _ZN3aaa9GG2223312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC7{ v2 v1 Fi} v2 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22233123barEv");}
aaa::GG2223312 ::~GG2223312(){ note_dtor("_ZN3aaa9GG2223312E", this);} // tgen
aaa::GG2223312 ::GG2223312(){ note_ctor("_ZN3aaa9GG2223312E", this);} // tgen
}
static void Test__ZN3aaa9GG2223312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223312E, buf);
    ::aaa::GG2223312 *dp, &lv = *(dp=new (buf) ::aaa::GG2223312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223312E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2223312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2223312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2223312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223312E);
    dp->::aaa::GG2223312::~GG2223312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223312E(Test__ZN3aaa9GG2223312E, "_ZN3aaa9GG2223312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223312C1Ev();
extern void _ZN3aaa9GG2223312D1Ev();
Name_Map name_map__ZN3aaa9GG2223312E[] = {
  NSPAIR(_ZN3aaa9GG2223312C1Ev),
  NSPAIR(_ZN3aaa9GG2223312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2223312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223312E[];
extern void _ZN3aaa9GG22233123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22233123barEv,_ZThn8_N3aaa9GG22233123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22233123barEv,_ZThn20_N3aaa9GG22233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22233123barEv,_ZThn28_N3aaa9GG22233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22233123barEv,_ZThn8_N3aaa9GG22233123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233123barEv,_ZThn20_N3aaa9GG22233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233123barEv,_ZThn28_N3aaa9GG22233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223312E[];
Class_Descriptor cd__ZN3aaa9GG2223312E = {  "_ZN3aaa9GG2223312E", // class name
  bases__ZN3aaa9GG2223312E, 6,
  &(vtc__ZN3aaa9GG2223312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223313  : ::aaa::EE222 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22233133fooEv
  virtual void  bar(); // _ZN3aaa9GG22233133barEv
  ~GG2223313(); // tgen
  GG2223313(); // tgen
};
//SIG(1 _ZN3aaa9GG2223313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22233133fooEv");}
void  aaa::GG2223313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22233133barEv");}
aaa::GG2223313 ::~GG2223313(){ note_dtor("_ZN3aaa9GG2223313E", this);} // tgen
aaa::GG2223313 ::GG2223313(){ note_ctor("_ZN3aaa9GG2223313E", this);} // tgen
}
static void Test__ZN3aaa9GG2223313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223313E, buf);
    ::aaa::GG2223313 *dp, &lv = *(dp=new (buf) ::aaa::GG2223313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223313E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2223313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2223313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2223313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223313E);
    dp->::aaa::GG2223313::~GG2223313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223313E(Test__ZN3aaa9GG2223313E, "_ZN3aaa9GG2223313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223313C1Ev();
extern void _ZN3aaa9GG2223313D1Ev();
Name_Map name_map__ZN3aaa9GG2223313E[] = {
  NSPAIR(_ZN3aaa9GG2223313C1Ev),
  NSPAIR(_ZN3aaa9GG2223313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2223313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223313E[];
extern void _ZN3aaa9GG22233133barEv();
extern void _ZN3aaa9GG22233133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22233133barEv,_ZThn8_N3aaa9GG22233133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233133fooEv,_ZThn20_N3aaa9GG22233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233133barEv,_ZThn20_N3aaa9GG22233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22233133fooEv,_ZThn28_N3aaa9GG22233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22233133barEv,_ZThn28_N3aaa9GG22233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22233133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22233133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22233133barEv,_ZThn8_N3aaa9GG22233133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233133fooEv,_ZThn20_N3aaa9GG22233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233133barEv,_ZThn20_N3aaa9GG22233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233133fooEv,_ZThn28_N3aaa9GG22233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233133barEv,_ZThn28_N3aaa9GG22233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223313E[];
Class_Descriptor cd__ZN3aaa9GG2223313E = {  "_ZN3aaa9GG2223313E", // class name
  bases__ZN3aaa9GG2223313E, 6,
  &(vtc__ZN3aaa9GG2223313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223321  : ::aaa::EE222 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22233213fooEv
  ~GG2223321(); // tgen
  GG2223321(); // tgen
};
//SIG(1 _ZN3aaa9GG2223321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22233213fooEv");}
aaa::GG2223321 ::~GG2223321(){ note_dtor("_ZN3aaa9GG2223321E", this);} // tgen
aaa::GG2223321 ::GG2223321(){ note_ctor("_ZN3aaa9GG2223321E", this);} // tgen
}
static void Test__ZN3aaa9GG2223321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223321E, buf);
    ::aaa::GG2223321 *dp, &lv = *(dp=new (buf) ::aaa::GG2223321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223321E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2223321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2223321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2223321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223321E);
    dp->::aaa::GG2223321::~GG2223321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223321E(Test__ZN3aaa9GG2223321E, "_ZN3aaa9GG2223321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223321C1Ev();
extern void _ZN3aaa9GG2223321D1Ev();
Name_Map name_map__ZN3aaa9GG2223321E[] = {
  NSPAIR(_ZN3aaa9GG2223321C1Ev),
  NSPAIR(_ZN3aaa9GG2223321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2223321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223321E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22233213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233213fooEv,_ZThn20_N3aaa9GG22233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22233213fooEv,_ZThn28_N3aaa9GG22233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22233213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233213fooEv,_ZThn20_N3aaa9GG22233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233213fooEv,_ZThn28_N3aaa9GG22233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223321E[];
Class_Descriptor cd__ZN3aaa9GG2223321E = {  "_ZN3aaa9GG2223321E", // class name
  bases__ZN3aaa9GG2223321E, 6,
  &(vtc__ZN3aaa9GG2223321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223322  : ::aaa::EE222 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22233223barEv
  ~GG2223322(); // tgen
  GG2223322(); // tgen
};
//SIG(1 _ZN3aaa9GG2223322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22233223barEv");}
aaa::GG2223322 ::~GG2223322(){ note_dtor("_ZN3aaa9GG2223322E", this);} // tgen
aaa::GG2223322 ::GG2223322(){ note_ctor("_ZN3aaa9GG2223322E", this);} // tgen
}
static void Test__ZN3aaa9GG2223322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223322E, buf);
    ::aaa::GG2223322 *dp, &lv = *(dp=new (buf) ::aaa::GG2223322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223322E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2223322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2223322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2223322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223322E);
    dp->::aaa::GG2223322::~GG2223322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223322E(Test__ZN3aaa9GG2223322E, "_ZN3aaa9GG2223322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223322C1Ev();
extern void _ZN3aaa9GG2223322D1Ev();
Name_Map name_map__ZN3aaa9GG2223322E[] = {
  NSPAIR(_ZN3aaa9GG2223322C1Ev),
  NSPAIR(_ZN3aaa9GG2223322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2223322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223322E[];
extern void _ZN3aaa9GG22233223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22233223barEv,_ZThn8_N3aaa9GG22233223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22233223barEv,_ZThn20_N3aaa9GG22233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22233223barEv,_ZThn28_N3aaa9GG22233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22233223barEv,_ZThn8_N3aaa9GG22233223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233223barEv,_ZThn20_N3aaa9GG22233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233223barEv,_ZThn28_N3aaa9GG22233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223322E[];
Class_Descriptor cd__ZN3aaa9GG2223322E = {  "_ZN3aaa9GG2223322E", // class name
  bases__ZN3aaa9GG2223322E, 6,
  &(vtc__ZN3aaa9GG2223322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223323  : ::aaa::EE222 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22233233fooEv
  virtual void  bar(); // _ZN3aaa9GG22233233barEv
  ~GG2223323(); // tgen
  GG2223323(); // tgen
};
//SIG(1 _ZN3aaa9GG2223323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22233233fooEv");}
void  aaa::GG2223323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22233233barEv");}
aaa::GG2223323 ::~GG2223323(){ note_dtor("_ZN3aaa9GG2223323E", this);} // tgen
aaa::GG2223323 ::GG2223323(){ note_ctor("_ZN3aaa9GG2223323E", this);} // tgen
}
static void Test__ZN3aaa9GG2223323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223323E, buf);
    ::aaa::GG2223323 *dp, &lv = *(dp=new (buf) ::aaa::GG2223323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223323E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2223323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2223323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2223323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223323E);
    dp->::aaa::GG2223323::~GG2223323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223323E(Test__ZN3aaa9GG2223323E, "_ZN3aaa9GG2223323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223323C1Ev();
extern void _ZN3aaa9GG2223323D1Ev();
Name_Map name_map__ZN3aaa9GG2223323E[] = {
  NSPAIR(_ZN3aaa9GG2223323C1Ev),
  NSPAIR(_ZN3aaa9GG2223323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2223323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223323E[];
extern void _ZN3aaa9GG22233233barEv();
extern void _ZN3aaa9GG22233233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22233233barEv,_ZThn8_N3aaa9GG22233233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233233fooEv,_ZThn20_N3aaa9GG22233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233233barEv,_ZThn20_N3aaa9GG22233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22233233fooEv,_ZThn28_N3aaa9GG22233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22233233barEv,_ZThn28_N3aaa9GG22233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22233233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22233233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22233233barEv,_ZThn8_N3aaa9GG22233233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233233fooEv,_ZThn20_N3aaa9GG22233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233233barEv,_ZThn20_N3aaa9GG22233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233233fooEv,_ZThn28_N3aaa9GG22233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233233barEv,_ZThn28_N3aaa9GG22233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223323E[];
Class_Descriptor cd__ZN3aaa9GG2223323E = {  "_ZN3aaa9GG2223323E", // class name
  bases__ZN3aaa9GG2223323E, 6,
  &(vtc__ZN3aaa9GG2223323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223331  : ::aaa::EE222 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22233313fooEv
  ~GG2223331(); // tgen
  GG2223331(); // tgen
};
//SIG(1 _ZN3aaa9GG2223331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22233313fooEv");}
aaa::GG2223331 ::~GG2223331(){ note_dtor("_ZN3aaa9GG2223331E", this);} // tgen
aaa::GG2223331 ::GG2223331(){ note_ctor("_ZN3aaa9GG2223331E", this);} // tgen
}
static void Test__ZN3aaa9GG2223331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223331E, buf);
    ::aaa::GG2223331 *dp, &lv = *(dp=new (buf) ::aaa::GG2223331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223331E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2223331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2223331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2223331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223331E);
    dp->::aaa::GG2223331::~GG2223331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223331E(Test__ZN3aaa9GG2223331E, "_ZN3aaa9GG2223331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223331C1Ev();
extern void _ZN3aaa9GG2223331D1Ev();
Name_Map name_map__ZN3aaa9GG2223331E[] = {
  NSPAIR(_ZN3aaa9GG2223331C1Ev),
  NSPAIR(_ZN3aaa9GG2223331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2223331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223331E[];
extern void _ZN3aaa5EE2223barEv();
extern void _ZN3aaa9GG22233313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233313fooEv,_ZThn20_N3aaa9GG22233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22233313fooEv,_ZThn28_N3aaa9GG22233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2223barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22233313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2223barEv,_ZThn8_N3aaa5EE2223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233313fooEv,_ZThn20_N3aaa9GG22233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233313fooEv,_ZThn28_N3aaa9GG22233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223331E[];
Class_Descriptor cd__ZN3aaa9GG2223331E = {  "_ZN3aaa9GG2223331E", // class name
  bases__ZN3aaa9GG2223331E, 6,
  &(vtc__ZN3aaa9GG2223331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223332  : ::aaa::EE222 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22233323barEv
  ~GG2223332(); // tgen
  GG2223332(); // tgen
};
//SIG(1 _ZN3aaa9GG2223332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 v1 Fi} BC7{ v2 v1 Fi} v2 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2223332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22233323barEv");}
aaa::GG2223332 ::~GG2223332(){ note_dtor("_ZN3aaa9GG2223332E", this);} // tgen
aaa::GG2223332 ::GG2223332(){ note_ctor("_ZN3aaa9GG2223332E", this);} // tgen
}
static void Test__ZN3aaa9GG2223332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223332E, buf);
    ::aaa::GG2223332 *dp, &lv = *(dp=new (buf) ::aaa::GG2223332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223332E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2223332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2223332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2223332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223332E);
    dp->::aaa::GG2223332::~GG2223332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223332E(Test__ZN3aaa9GG2223332E, "_ZN3aaa9GG2223332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223332C1Ev();
extern void _ZN3aaa9GG2223332D1Ev();
Name_Map name_map__ZN3aaa9GG2223332E[] = {
  NSPAIR(_ZN3aaa9GG2223332C1Ev),
  NSPAIR(_ZN3aaa9GG2223332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2223332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223332E[];
extern void _ZN3aaa9GG22233323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22233323barEv,_ZThn8_N3aaa9GG22233323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22233323barEv,_ZThn20_N3aaa9GG22233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22233323barEv,_ZThn28_N3aaa9GG22233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22233323barEv,_ZThn8_N3aaa9GG22233323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233323barEv,_ZThn20_N3aaa9GG22233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233323barEv,_ZThn28_N3aaa9GG22233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223332E[];
Class_Descriptor cd__ZN3aaa9GG2223332E = {  "_ZN3aaa9GG2223332E", // class name
  bases__ZN3aaa9GG2223332E, 6,
  &(vtc__ZN3aaa9GG2223332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223332E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2223333  : ::aaa::EE222 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22233333fooEv
  virtual void  bar(); // _ZN3aaa9GG22233333barEv
  ~GG2223333(); // tgen
  GG2223333(); // tgen
};
//SIG(1 _ZN3aaa9GG2223333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2223333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22233333fooEv");}
void  aaa::GG2223333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22233333barEv");}
aaa::GG2223333 ::~GG2223333(){ note_dtor("_ZN3aaa9GG2223333E", this);} // tgen
aaa::GG2223333 ::GG2223333(){ note_ctor("_ZN3aaa9GG2223333E", this);} // tgen
}
static void Test__ZN3aaa9GG2223333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2223333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2223333E, buf);
    ::aaa::GG2223333 *dp, &lv = *(dp=new (buf) ::aaa::GG2223333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2223333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2223333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE222*), 0, "_ZN3aaa9GG2223333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE222*), ABISELECT(16,8), "_ZN3aaa9GG2223333E");
    check_base_class_offset(lv, (::aaa::EE222*), 0, "_ZN3aaa9GG2223333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2223333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2223333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2223333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2223333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2223333E);
    dp->::aaa::GG2223333::~GG2223333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2223333E(Test__ZN3aaa9GG2223333E, "_ZN3aaa9GG2223333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2223333C1Ev();
extern void _ZN3aaa9GG2223333D1Ev();
Name_Map name_map__ZN3aaa9GG2223333E[] = {
  NSPAIR(_ZN3aaa9GG2223333C1Ev),
  NSPAIR(_ZN3aaa9GG2223333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE222E;
extern VTBL_ENTRY _ZTIN3aaa5EE222E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE222E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2223333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE222E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2223333E[];
extern void _ZN3aaa9GG22233333barEv();
extern void _ZN3aaa9GG22233333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22233333barEv,_ZThn8_N3aaa9GG22233333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233333fooEv,_ZThn20_N3aaa9GG22233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22233333barEv,_ZThn20_N3aaa9GG22233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22233333fooEv,_ZThn28_N3aaa9GG22233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22233333barEv,_ZThn28_N3aaa9GG22233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2223333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22233333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22233333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22233333barEv,_ZThn8_N3aaa9GG22233333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233333fooEv,_ZThn20_N3aaa9GG22233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22233333barEv,_ZThn20_N3aaa9GG22233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233333fooEv,_ZThn28_N3aaa9GG22233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22233333barEv,_ZThn28_N3aaa9GG22233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2223333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2223333E[];
Class_Descriptor cd__ZN3aaa9GG2223333E = {  "_ZN3aaa9GG2223333E", // class name
  bases__ZN3aaa9GG2223333E, 6,
  &(vtc__ZN3aaa9GG2223333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2223333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2223333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231111  : ::aaa::EE223 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22311113fooEv
  ~GG2231111(); // tgen
  GG2231111(); // tgen
};
//SIG(1 _ZN3aaa9GG2231111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22311113fooEv");}
aaa::GG2231111 ::~GG2231111(){ note_dtor("_ZN3aaa9GG2231111E", this);} // tgen
aaa::GG2231111 ::GG2231111(){ note_ctor("_ZN3aaa9GG2231111E", this);} // tgen
}
static void Test__ZN3aaa9GG2231111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231111E, buf);
    ::aaa::GG2231111 *dp, &lv = *(dp=new (buf) ::aaa::GG2231111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231111E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2231111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2231111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2231111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231111E);
    dp->::aaa::GG2231111::~GG2231111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231111E(Test__ZN3aaa9GG2231111E, "_ZN3aaa9GG2231111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231111C1Ev();
extern void _ZN3aaa9GG2231111D1Ev();
Name_Map name_map__ZN3aaa9GG2231111E[] = {
  NSPAIR(_ZN3aaa9GG2231111C1Ev),
  NSPAIR(_ZN3aaa9GG2231111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2231111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231111E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22311113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22311113fooEv,_ZThn20_N3aaa9GG22311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22311113fooEv,_ZThn28_N3aaa9GG22311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22311113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311113fooEv,_ZThn20_N3aaa9GG22311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22311113fooEv,_ZThn28_N3aaa9GG22311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231111E[];
Class_Descriptor cd__ZN3aaa9GG2231111E = {  "_ZN3aaa9GG2231111E", // class name
  bases__ZN3aaa9GG2231111E, 6,
  &(vtc__ZN3aaa9GG2231111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231112  : ::aaa::EE223 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22311123barEv
  ~GG2231112(); // tgen
  GG2231112(); // tgen
};
//SIG(1 _ZN3aaa9GG2231112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22311123barEv");}
aaa::GG2231112 ::~GG2231112(){ note_dtor("_ZN3aaa9GG2231112E", this);} // tgen
aaa::GG2231112 ::GG2231112(){ note_ctor("_ZN3aaa9GG2231112E", this);} // tgen
}
static void Test__ZN3aaa9GG2231112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231112E, buf);
    ::aaa::GG2231112 *dp, &lv = *(dp=new (buf) ::aaa::GG2231112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231112E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2231112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2231112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2231112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231112E);
    dp->::aaa::GG2231112::~GG2231112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231112E(Test__ZN3aaa9GG2231112E, "_ZN3aaa9GG2231112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231112C1Ev();
extern void _ZN3aaa9GG2231112D1Ev();
Name_Map name_map__ZN3aaa9GG2231112E[] = {
  NSPAIR(_ZN3aaa9GG2231112C1Ev),
  NSPAIR(_ZN3aaa9GG2231112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2231112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231112E[];
extern void _ZN3aaa9GG22311123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22311123barEv,_ZThn8_N3aaa9GG22311123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22311123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22311123barEv,_ZThn8_N3aaa9GG22311123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231112E[];
Class_Descriptor cd__ZN3aaa9GG2231112E = {  "_ZN3aaa9GG2231112E", // class name
  bases__ZN3aaa9GG2231112E, 6,
  &(vtc__ZN3aaa9GG2231112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231113  : ::aaa::EE223 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22311133fooEv
  virtual void  bar(); // _ZN3aaa9GG22311133barEv
  ~GG2231113(); // tgen
  GG2231113(); // tgen
};
//SIG(1 _ZN3aaa9GG2231113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22311133fooEv");}
void  aaa::GG2231113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22311133barEv");}
aaa::GG2231113 ::~GG2231113(){ note_dtor("_ZN3aaa9GG2231113E", this);} // tgen
aaa::GG2231113 ::GG2231113(){ note_ctor("_ZN3aaa9GG2231113E", this);} // tgen
}
static void Test__ZN3aaa9GG2231113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231113E, buf);
    ::aaa::GG2231113 *dp, &lv = *(dp=new (buf) ::aaa::GG2231113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231113E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2231113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2231113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2231113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231113E);
    dp->::aaa::GG2231113::~GG2231113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231113E(Test__ZN3aaa9GG2231113E, "_ZN3aaa9GG2231113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231113C1Ev();
extern void _ZN3aaa9GG2231113D1Ev();
Name_Map name_map__ZN3aaa9GG2231113E[] = {
  NSPAIR(_ZN3aaa9GG2231113C1Ev),
  NSPAIR(_ZN3aaa9GG2231113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2231113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231113E[];
extern void _ZN3aaa9GG22311133barEv();
extern void _ZN3aaa9GG22311133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22311133barEv,_ZThn8_N3aaa9GG22311133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22311133fooEv,_ZThn20_N3aaa9GG22311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22311133fooEv,_ZThn28_N3aaa9GG22311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22311133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22311133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22311133barEv,_ZThn8_N3aaa9GG22311133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311133fooEv,_ZThn20_N3aaa9GG22311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22311133fooEv,_ZThn28_N3aaa9GG22311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231113E[];
Class_Descriptor cd__ZN3aaa9GG2231113E = {  "_ZN3aaa9GG2231113E", // class name
  bases__ZN3aaa9GG2231113E, 6,
  &(vtc__ZN3aaa9GG2231113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231121  : ::aaa::EE223 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22311213fooEv
  ~GG2231121(); // tgen
  GG2231121(); // tgen
};
//SIG(1 _ZN3aaa9GG2231121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22311213fooEv");}
aaa::GG2231121 ::~GG2231121(){ note_dtor("_ZN3aaa9GG2231121E", this);} // tgen
aaa::GG2231121 ::GG2231121(){ note_ctor("_ZN3aaa9GG2231121E", this);} // tgen
}
static void Test__ZN3aaa9GG2231121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231121E, buf);
    ::aaa::GG2231121 *dp, &lv = *(dp=new (buf) ::aaa::GG2231121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231121E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2231121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2231121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2231121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231121E);
    dp->::aaa::GG2231121::~GG2231121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231121E(Test__ZN3aaa9GG2231121E, "_ZN3aaa9GG2231121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231121C1Ev();
extern void _ZN3aaa9GG2231121D1Ev();
Name_Map name_map__ZN3aaa9GG2231121E[] = {
  NSPAIR(_ZN3aaa9GG2231121C1Ev),
  NSPAIR(_ZN3aaa9GG2231121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2231121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231121E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22311213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22311213fooEv,_ZThn20_N3aaa9GG22311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22311213fooEv,_ZThn28_N3aaa9GG22311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22311213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311213fooEv,_ZThn20_N3aaa9GG22311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22311213fooEv,_ZThn28_N3aaa9GG22311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231121E[];
Class_Descriptor cd__ZN3aaa9GG2231121E = {  "_ZN3aaa9GG2231121E", // class name
  bases__ZN3aaa9GG2231121E, 6,
  &(vtc__ZN3aaa9GG2231121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231122  : ::aaa::EE223 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22311223barEv
  ~GG2231122(); // tgen
  GG2231122(); // tgen
};
//SIG(1 _ZN3aaa9GG2231122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22311223barEv");}
aaa::GG2231122 ::~GG2231122(){ note_dtor("_ZN3aaa9GG2231122E", this);} // tgen
aaa::GG2231122 ::GG2231122(){ note_ctor("_ZN3aaa9GG2231122E", this);} // tgen
}
static void Test__ZN3aaa9GG2231122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231122E, buf);
    ::aaa::GG2231122 *dp, &lv = *(dp=new (buf) ::aaa::GG2231122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231122E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2231122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2231122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2231122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231122E);
    dp->::aaa::GG2231122::~GG2231122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231122E(Test__ZN3aaa9GG2231122E, "_ZN3aaa9GG2231122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231122C1Ev();
extern void _ZN3aaa9GG2231122D1Ev();
Name_Map name_map__ZN3aaa9GG2231122E[] = {
  NSPAIR(_ZN3aaa9GG2231122C1Ev),
  NSPAIR(_ZN3aaa9GG2231122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2231122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231122E[];
extern void _ZN3aaa9GG22311223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22311223barEv,_ZThn8_N3aaa9GG22311223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22311223barEv,_ZThn20_N3aaa9GG22311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22311223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22311223barEv,_ZThn8_N3aaa9GG22311223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311223barEv,_ZThn20_N3aaa9GG22311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231122E[];
Class_Descriptor cd__ZN3aaa9GG2231122E = {  "_ZN3aaa9GG2231122E", // class name
  bases__ZN3aaa9GG2231122E, 6,
  &(vtc__ZN3aaa9GG2231122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231123  : ::aaa::EE223 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22311233fooEv
  virtual void  bar(); // _ZN3aaa9GG22311233barEv
  ~GG2231123(); // tgen
  GG2231123(); // tgen
};
//SIG(1 _ZN3aaa9GG2231123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22311233fooEv");}
void  aaa::GG2231123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22311233barEv");}
aaa::GG2231123 ::~GG2231123(){ note_dtor("_ZN3aaa9GG2231123E", this);} // tgen
aaa::GG2231123 ::GG2231123(){ note_ctor("_ZN3aaa9GG2231123E", this);} // tgen
}
static void Test__ZN3aaa9GG2231123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231123E, buf);
    ::aaa::GG2231123 *dp, &lv = *(dp=new (buf) ::aaa::GG2231123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231123E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2231123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2231123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2231123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231123E);
    dp->::aaa::GG2231123::~GG2231123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231123E(Test__ZN3aaa9GG2231123E, "_ZN3aaa9GG2231123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231123C1Ev();
extern void _ZN3aaa9GG2231123D1Ev();
Name_Map name_map__ZN3aaa9GG2231123E[] = {
  NSPAIR(_ZN3aaa9GG2231123C1Ev),
  NSPAIR(_ZN3aaa9GG2231123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2231123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231123E[];
extern void _ZN3aaa9GG22311233barEv();
extern void _ZN3aaa9GG22311233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22311233barEv,_ZThn8_N3aaa9GG22311233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22311233fooEv,_ZThn20_N3aaa9GG22311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22311233barEv,_ZThn20_N3aaa9GG22311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22311233fooEv,_ZThn28_N3aaa9GG22311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22311233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22311233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22311233barEv,_ZThn8_N3aaa9GG22311233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311233fooEv,_ZThn20_N3aaa9GG22311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311233barEv,_ZThn20_N3aaa9GG22311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22311233fooEv,_ZThn28_N3aaa9GG22311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231123E[];
Class_Descriptor cd__ZN3aaa9GG2231123E = {  "_ZN3aaa9GG2231123E", // class name
  bases__ZN3aaa9GG2231123E, 6,
  &(vtc__ZN3aaa9GG2231123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231131  : ::aaa::EE223 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22311313fooEv
  ~GG2231131(); // tgen
  GG2231131(); // tgen
};
//SIG(1 _ZN3aaa9GG2231131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22311313fooEv");}
aaa::GG2231131 ::~GG2231131(){ note_dtor("_ZN3aaa9GG2231131E", this);} // tgen
aaa::GG2231131 ::GG2231131(){ note_ctor("_ZN3aaa9GG2231131E", this);} // tgen
}
static void Test__ZN3aaa9GG2231131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231131E, buf);
    ::aaa::GG2231131 *dp, &lv = *(dp=new (buf) ::aaa::GG2231131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231131E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2231131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2231131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2231131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231131E);
    dp->::aaa::GG2231131::~GG2231131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231131E(Test__ZN3aaa9GG2231131E, "_ZN3aaa9GG2231131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231131C1Ev();
extern void _ZN3aaa9GG2231131D1Ev();
Name_Map name_map__ZN3aaa9GG2231131E[] = {
  NSPAIR(_ZN3aaa9GG2231131C1Ev),
  NSPAIR(_ZN3aaa9GG2231131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2231131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231131E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22311313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22311313fooEv,_ZThn20_N3aaa9GG22311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22311313fooEv,_ZThn28_N3aaa9GG22311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22311313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311313fooEv,_ZThn20_N3aaa9GG22311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22311313fooEv,_ZThn28_N3aaa9GG22311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231131E[];
Class_Descriptor cd__ZN3aaa9GG2231131E = {  "_ZN3aaa9GG2231131E", // class name
  bases__ZN3aaa9GG2231131E, 6,
  &(vtc__ZN3aaa9GG2231131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231132  : ::aaa::EE223 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22311323barEv
  ~GG2231132(); // tgen
  GG2231132(); // tgen
};
//SIG(1 _ZN3aaa9GG2231132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22311323barEv");}
aaa::GG2231132 ::~GG2231132(){ note_dtor("_ZN3aaa9GG2231132E", this);} // tgen
aaa::GG2231132 ::GG2231132(){ note_ctor("_ZN3aaa9GG2231132E", this);} // tgen
}
static void Test__ZN3aaa9GG2231132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231132E, buf);
    ::aaa::GG2231132 *dp, &lv = *(dp=new (buf) ::aaa::GG2231132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231132E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2231132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2231132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2231132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231132E);
    dp->::aaa::GG2231132::~GG2231132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231132E(Test__ZN3aaa9GG2231132E, "_ZN3aaa9GG2231132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231132C1Ev();
extern void _ZN3aaa9GG2231132D1Ev();
Name_Map name_map__ZN3aaa9GG2231132E[] = {
  NSPAIR(_ZN3aaa9GG2231132C1Ev),
  NSPAIR(_ZN3aaa9GG2231132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2231132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231132E[];
extern void _ZN3aaa9GG22311323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22311323barEv,_ZThn8_N3aaa9GG22311323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22311323barEv,_ZThn20_N3aaa9GG22311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22311323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22311323barEv,_ZThn8_N3aaa9GG22311323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311323barEv,_ZThn20_N3aaa9GG22311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231132E[];
Class_Descriptor cd__ZN3aaa9GG2231132E = {  "_ZN3aaa9GG2231132E", // class name
  bases__ZN3aaa9GG2231132E, 6,
  &(vtc__ZN3aaa9GG2231132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231133  : ::aaa::EE223 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22311333fooEv
  virtual void  bar(); // _ZN3aaa9GG22311333barEv
  ~GG2231133(); // tgen
  GG2231133(); // tgen
};
//SIG(1 _ZN3aaa9GG2231133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22311333fooEv");}
void  aaa::GG2231133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22311333barEv");}
aaa::GG2231133 ::~GG2231133(){ note_dtor("_ZN3aaa9GG2231133E", this);} // tgen
aaa::GG2231133 ::GG2231133(){ note_ctor("_ZN3aaa9GG2231133E", this);} // tgen
}
static void Test__ZN3aaa9GG2231133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231133E, buf);
    ::aaa::GG2231133 *dp, &lv = *(dp=new (buf) ::aaa::GG2231133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231133E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2231133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2231133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2231133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231133E);
    dp->::aaa::GG2231133::~GG2231133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231133E(Test__ZN3aaa9GG2231133E, "_ZN3aaa9GG2231133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231133C1Ev();
extern void _ZN3aaa9GG2231133D1Ev();
Name_Map name_map__ZN3aaa9GG2231133E[] = {
  NSPAIR(_ZN3aaa9GG2231133C1Ev),
  NSPAIR(_ZN3aaa9GG2231133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2231133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231133E[];
extern void _ZN3aaa9GG22311333barEv();
extern void _ZN3aaa9GG22311333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22311333barEv,_ZThn8_N3aaa9GG22311333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22311333fooEv,_ZThn20_N3aaa9GG22311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22311333barEv,_ZThn20_N3aaa9GG22311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22311333fooEv,_ZThn28_N3aaa9GG22311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22311333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22311333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22311333barEv,_ZThn8_N3aaa9GG22311333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311333fooEv,_ZThn20_N3aaa9GG22311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22311333barEv,_ZThn20_N3aaa9GG22311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22311333fooEv,_ZThn28_N3aaa9GG22311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231133E[];
Class_Descriptor cd__ZN3aaa9GG2231133E = {  "_ZN3aaa9GG2231133E", // class name
  bases__ZN3aaa9GG2231133E, 6,
  &(vtc__ZN3aaa9GG2231133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231211  : ::aaa::EE223 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22312113fooEv
  ~GG2231211(); // tgen
  GG2231211(); // tgen
};
//SIG(1 _ZN3aaa9GG2231211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22312113fooEv");}
aaa::GG2231211 ::~GG2231211(){ note_dtor("_ZN3aaa9GG2231211E", this);} // tgen
aaa::GG2231211 ::GG2231211(){ note_ctor("_ZN3aaa9GG2231211E", this);} // tgen
}
static void Test__ZN3aaa9GG2231211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231211E, buf);
    ::aaa::GG2231211 *dp, &lv = *(dp=new (buf) ::aaa::GG2231211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231211E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2231211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2231211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2231211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231211E);
    dp->::aaa::GG2231211::~GG2231211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231211E(Test__ZN3aaa9GG2231211E, "_ZN3aaa9GG2231211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231211C1Ev();
extern void _ZN3aaa9GG2231211D1Ev();
Name_Map name_map__ZN3aaa9GG2231211E[] = {
  NSPAIR(_ZN3aaa9GG2231211C1Ev),
  NSPAIR(_ZN3aaa9GG2231211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2231211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231211E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22312113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22312113fooEv,_ZThn20_N3aaa9GG22312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22312113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312113fooEv,_ZThn20_N3aaa9GG22312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231211E[];
Class_Descriptor cd__ZN3aaa9GG2231211E = {  "_ZN3aaa9GG2231211E", // class name
  bases__ZN3aaa9GG2231211E, 6,
  &(vtc__ZN3aaa9GG2231211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231212  : ::aaa::EE223 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22312123barEv
  ~GG2231212(); // tgen
  GG2231212(); // tgen
};
//SIG(1 _ZN3aaa9GG2231212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22312123barEv");}
aaa::GG2231212 ::~GG2231212(){ note_dtor("_ZN3aaa9GG2231212E", this);} // tgen
aaa::GG2231212 ::GG2231212(){ note_ctor("_ZN3aaa9GG2231212E", this);} // tgen
}
static void Test__ZN3aaa9GG2231212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231212E, buf);
    ::aaa::GG2231212 *dp, &lv = *(dp=new (buf) ::aaa::GG2231212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231212E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2231212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2231212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2231212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231212E);
    dp->::aaa::GG2231212::~GG2231212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231212E(Test__ZN3aaa9GG2231212E, "_ZN3aaa9GG2231212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231212C1Ev();
extern void _ZN3aaa9GG2231212D1Ev();
Name_Map name_map__ZN3aaa9GG2231212E[] = {
  NSPAIR(_ZN3aaa9GG2231212C1Ev),
  NSPAIR(_ZN3aaa9GG2231212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2231212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231212E[];
extern void _ZN3aaa9GG22312123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22312123barEv,_ZThn8_N3aaa9GG22312123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22312123barEv,_ZThn28_N3aaa9GG22312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22312123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22312123barEv,_ZThn8_N3aaa9GG22312123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22312123barEv,_ZThn28_N3aaa9GG22312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231212E[];
Class_Descriptor cd__ZN3aaa9GG2231212E = {  "_ZN3aaa9GG2231212E", // class name
  bases__ZN3aaa9GG2231212E, 6,
  &(vtc__ZN3aaa9GG2231212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231213  : ::aaa::EE223 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22312133fooEv
  virtual void  bar(); // _ZN3aaa9GG22312133barEv
  ~GG2231213(); // tgen
  GG2231213(); // tgen
};
//SIG(1 _ZN3aaa9GG2231213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22312133fooEv");}
void  aaa::GG2231213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22312133barEv");}
aaa::GG2231213 ::~GG2231213(){ note_dtor("_ZN3aaa9GG2231213E", this);} // tgen
aaa::GG2231213 ::GG2231213(){ note_ctor("_ZN3aaa9GG2231213E", this);} // tgen
}
static void Test__ZN3aaa9GG2231213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231213E, buf);
    ::aaa::GG2231213 *dp, &lv = *(dp=new (buf) ::aaa::GG2231213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231213E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2231213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2231213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2231213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231213E);
    dp->::aaa::GG2231213::~GG2231213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231213E(Test__ZN3aaa9GG2231213E, "_ZN3aaa9GG2231213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231213C1Ev();
extern void _ZN3aaa9GG2231213D1Ev();
Name_Map name_map__ZN3aaa9GG2231213E[] = {
  NSPAIR(_ZN3aaa9GG2231213C1Ev),
  NSPAIR(_ZN3aaa9GG2231213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2231213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231213E[];
extern void _ZN3aaa9GG22312133barEv();
extern void _ZN3aaa9GG22312133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22312133barEv,_ZThn8_N3aaa9GG22312133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22312133fooEv,_ZThn20_N3aaa9GG22312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22312133barEv,_ZThn28_N3aaa9GG22312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22312133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22312133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22312133barEv,_ZThn8_N3aaa9GG22312133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312133fooEv,_ZThn20_N3aaa9GG22312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22312133barEv,_ZThn28_N3aaa9GG22312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231213E[];
Class_Descriptor cd__ZN3aaa9GG2231213E = {  "_ZN3aaa9GG2231213E", // class name
  bases__ZN3aaa9GG2231213E, 6,
  &(vtc__ZN3aaa9GG2231213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231221  : ::aaa::EE223 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22312213fooEv
  ~GG2231221(); // tgen
  GG2231221(); // tgen
};
//SIG(1 _ZN3aaa9GG2231221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22312213fooEv");}
aaa::GG2231221 ::~GG2231221(){ note_dtor("_ZN3aaa9GG2231221E", this);} // tgen
aaa::GG2231221 ::GG2231221(){ note_ctor("_ZN3aaa9GG2231221E", this);} // tgen
}
static void Test__ZN3aaa9GG2231221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231221E, buf);
    ::aaa::GG2231221 *dp, &lv = *(dp=new (buf) ::aaa::GG2231221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231221E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2231221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2231221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2231221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231221E);
    dp->::aaa::GG2231221::~GG2231221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231221E(Test__ZN3aaa9GG2231221E, "_ZN3aaa9GG2231221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231221C1Ev();
extern void _ZN3aaa9GG2231221D1Ev();
Name_Map name_map__ZN3aaa9GG2231221E[] = {
  NSPAIR(_ZN3aaa9GG2231221C1Ev),
  NSPAIR(_ZN3aaa9GG2231221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2231221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231221E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22312213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22312213fooEv,_ZThn20_N3aaa9GG22312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22312213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312213fooEv,_ZThn20_N3aaa9GG22312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231221E[];
Class_Descriptor cd__ZN3aaa9GG2231221E = {  "_ZN3aaa9GG2231221E", // class name
  bases__ZN3aaa9GG2231221E, 6,
  &(vtc__ZN3aaa9GG2231221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231222  : ::aaa::EE223 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22312223barEv
  ~GG2231222(); // tgen
  GG2231222(); // tgen
};
//SIG(1 _ZN3aaa9GG2231222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22312223barEv");}
aaa::GG2231222 ::~GG2231222(){ note_dtor("_ZN3aaa9GG2231222E", this);} // tgen
aaa::GG2231222 ::GG2231222(){ note_ctor("_ZN3aaa9GG2231222E", this);} // tgen
}
static void Test__ZN3aaa9GG2231222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231222E, buf);
    ::aaa::GG2231222 *dp, &lv = *(dp=new (buf) ::aaa::GG2231222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231222E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2231222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2231222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2231222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231222E);
    dp->::aaa::GG2231222::~GG2231222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231222E(Test__ZN3aaa9GG2231222E, "_ZN3aaa9GG2231222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231222C1Ev();
extern void _ZN3aaa9GG2231222D1Ev();
Name_Map name_map__ZN3aaa9GG2231222E[] = {
  NSPAIR(_ZN3aaa9GG2231222C1Ev),
  NSPAIR(_ZN3aaa9GG2231222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2231222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231222E[];
extern void _ZN3aaa9GG22312223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22312223barEv,_ZThn8_N3aaa9GG22312223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22312223barEv,_ZThn20_N3aaa9GG22312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22312223barEv,_ZThn28_N3aaa9GG22312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22312223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22312223barEv,_ZThn8_N3aaa9GG22312223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312223barEv,_ZThn20_N3aaa9GG22312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22312223barEv,_ZThn28_N3aaa9GG22312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231222E[];
Class_Descriptor cd__ZN3aaa9GG2231222E = {  "_ZN3aaa9GG2231222E", // class name
  bases__ZN3aaa9GG2231222E, 6,
  &(vtc__ZN3aaa9GG2231222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231223  : ::aaa::EE223 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22312233fooEv
  virtual void  bar(); // _ZN3aaa9GG22312233barEv
  ~GG2231223(); // tgen
  GG2231223(); // tgen
};
//SIG(1 _ZN3aaa9GG2231223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22312233fooEv");}
void  aaa::GG2231223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22312233barEv");}
aaa::GG2231223 ::~GG2231223(){ note_dtor("_ZN3aaa9GG2231223E", this);} // tgen
aaa::GG2231223 ::GG2231223(){ note_ctor("_ZN3aaa9GG2231223E", this);} // tgen
}
static void Test__ZN3aaa9GG2231223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231223E, buf);
    ::aaa::GG2231223 *dp, &lv = *(dp=new (buf) ::aaa::GG2231223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231223E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2231223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2231223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2231223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231223E);
    dp->::aaa::GG2231223::~GG2231223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231223E(Test__ZN3aaa9GG2231223E, "_ZN3aaa9GG2231223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231223C1Ev();
extern void _ZN3aaa9GG2231223D1Ev();
Name_Map name_map__ZN3aaa9GG2231223E[] = {
  NSPAIR(_ZN3aaa9GG2231223C1Ev),
  NSPAIR(_ZN3aaa9GG2231223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2231223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231223E[];
extern void _ZN3aaa9GG22312233barEv();
extern void _ZN3aaa9GG22312233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22312233barEv,_ZThn8_N3aaa9GG22312233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22312233fooEv,_ZThn20_N3aaa9GG22312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22312233barEv,_ZThn20_N3aaa9GG22312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22312233barEv,_ZThn28_N3aaa9GG22312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22312233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22312233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22312233barEv,_ZThn8_N3aaa9GG22312233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312233fooEv,_ZThn20_N3aaa9GG22312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312233barEv,_ZThn20_N3aaa9GG22312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22312233barEv,_ZThn28_N3aaa9GG22312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231223E[];
Class_Descriptor cd__ZN3aaa9GG2231223E = {  "_ZN3aaa9GG2231223E", // class name
  bases__ZN3aaa9GG2231223E, 6,
  &(vtc__ZN3aaa9GG2231223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231231  : ::aaa::EE223 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22312313fooEv
  ~GG2231231(); // tgen
  GG2231231(); // tgen
};
//SIG(1 _ZN3aaa9GG2231231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22312313fooEv");}
aaa::GG2231231 ::~GG2231231(){ note_dtor("_ZN3aaa9GG2231231E", this);} // tgen
aaa::GG2231231 ::GG2231231(){ note_ctor("_ZN3aaa9GG2231231E", this);} // tgen
}
static void Test__ZN3aaa9GG2231231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231231E, buf);
    ::aaa::GG2231231 *dp, &lv = *(dp=new (buf) ::aaa::GG2231231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231231E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2231231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2231231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2231231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231231E);
    dp->::aaa::GG2231231::~GG2231231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231231E(Test__ZN3aaa9GG2231231E, "_ZN3aaa9GG2231231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231231C1Ev();
extern void _ZN3aaa9GG2231231D1Ev();
Name_Map name_map__ZN3aaa9GG2231231E[] = {
  NSPAIR(_ZN3aaa9GG2231231C1Ev),
  NSPAIR(_ZN3aaa9GG2231231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2231231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231231E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22312313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22312313fooEv,_ZThn20_N3aaa9GG22312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22312313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312313fooEv,_ZThn20_N3aaa9GG22312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231231E[];
Class_Descriptor cd__ZN3aaa9GG2231231E = {  "_ZN3aaa9GG2231231E", // class name
  bases__ZN3aaa9GG2231231E, 6,
  &(vtc__ZN3aaa9GG2231231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231232  : ::aaa::EE223 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22312323barEv
  ~GG2231232(); // tgen
  GG2231232(); // tgen
};
//SIG(1 _ZN3aaa9GG2231232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22312323barEv");}
aaa::GG2231232 ::~GG2231232(){ note_dtor("_ZN3aaa9GG2231232E", this);} // tgen
aaa::GG2231232 ::GG2231232(){ note_ctor("_ZN3aaa9GG2231232E", this);} // tgen
}
static void Test__ZN3aaa9GG2231232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231232E, buf);
    ::aaa::GG2231232 *dp, &lv = *(dp=new (buf) ::aaa::GG2231232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231232E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2231232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2231232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2231232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231232E);
    dp->::aaa::GG2231232::~GG2231232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231232E(Test__ZN3aaa9GG2231232E, "_ZN3aaa9GG2231232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231232C1Ev();
extern void _ZN3aaa9GG2231232D1Ev();
Name_Map name_map__ZN3aaa9GG2231232E[] = {
  NSPAIR(_ZN3aaa9GG2231232C1Ev),
  NSPAIR(_ZN3aaa9GG2231232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2231232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231232E[];
extern void _ZN3aaa9GG22312323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22312323barEv,_ZThn8_N3aaa9GG22312323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22312323barEv,_ZThn20_N3aaa9GG22312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22312323barEv,_ZThn28_N3aaa9GG22312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22312323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22312323barEv,_ZThn8_N3aaa9GG22312323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312323barEv,_ZThn20_N3aaa9GG22312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22312323barEv,_ZThn28_N3aaa9GG22312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231232E[];
Class_Descriptor cd__ZN3aaa9GG2231232E = {  "_ZN3aaa9GG2231232E", // class name
  bases__ZN3aaa9GG2231232E, 6,
  &(vtc__ZN3aaa9GG2231232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231233  : ::aaa::EE223 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22312333fooEv
  virtual void  bar(); // _ZN3aaa9GG22312333barEv
  ~GG2231233(); // tgen
  GG2231233(); // tgen
};
//SIG(1 _ZN3aaa9GG2231233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22312333fooEv");}
void  aaa::GG2231233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22312333barEv");}
aaa::GG2231233 ::~GG2231233(){ note_dtor("_ZN3aaa9GG2231233E", this);} // tgen
aaa::GG2231233 ::GG2231233(){ note_ctor("_ZN3aaa9GG2231233E", this);} // tgen
}
static void Test__ZN3aaa9GG2231233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231233E, buf);
    ::aaa::GG2231233 *dp, &lv = *(dp=new (buf) ::aaa::GG2231233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231233E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2231233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2231233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2231233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231233E);
    dp->::aaa::GG2231233::~GG2231233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231233E(Test__ZN3aaa9GG2231233E, "_ZN3aaa9GG2231233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231233C1Ev();
extern void _ZN3aaa9GG2231233D1Ev();
Name_Map name_map__ZN3aaa9GG2231233E[] = {
  NSPAIR(_ZN3aaa9GG2231233C1Ev),
  NSPAIR(_ZN3aaa9GG2231233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2231233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231233E[];
extern void _ZN3aaa9GG22312333barEv();
extern void _ZN3aaa9GG22312333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22312333barEv,_ZThn8_N3aaa9GG22312333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22312333fooEv,_ZThn20_N3aaa9GG22312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22312333barEv,_ZThn20_N3aaa9GG22312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22312333barEv,_ZThn28_N3aaa9GG22312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22312333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22312333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22312333barEv,_ZThn8_N3aaa9GG22312333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312333fooEv,_ZThn20_N3aaa9GG22312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22312333barEv,_ZThn20_N3aaa9GG22312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22312333barEv,_ZThn28_N3aaa9GG22312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231233E[];
Class_Descriptor cd__ZN3aaa9GG2231233E = {  "_ZN3aaa9GG2231233E", // class name
  bases__ZN3aaa9GG2231233E, 6,
  &(vtc__ZN3aaa9GG2231233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231311  : ::aaa::EE223 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22313113fooEv
  ~GG2231311(); // tgen
  GG2231311(); // tgen
};
//SIG(1 _ZN3aaa9GG2231311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22313113fooEv");}
aaa::GG2231311 ::~GG2231311(){ note_dtor("_ZN3aaa9GG2231311E", this);} // tgen
aaa::GG2231311 ::GG2231311(){ note_ctor("_ZN3aaa9GG2231311E", this);} // tgen
}
static void Test__ZN3aaa9GG2231311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231311E, buf);
    ::aaa::GG2231311 *dp, &lv = *(dp=new (buf) ::aaa::GG2231311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231311E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2231311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2231311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2231311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231311E);
    dp->::aaa::GG2231311::~GG2231311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231311E(Test__ZN3aaa9GG2231311E, "_ZN3aaa9GG2231311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231311C1Ev();
extern void _ZN3aaa9GG2231311D1Ev();
Name_Map name_map__ZN3aaa9GG2231311E[] = {
  NSPAIR(_ZN3aaa9GG2231311C1Ev),
  NSPAIR(_ZN3aaa9GG2231311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2231311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231311E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22313113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22313113fooEv,_ZThn20_N3aaa9GG22313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313113fooEv,_ZThn28_N3aaa9GG22313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22313113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313113fooEv,_ZThn20_N3aaa9GG22313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313113fooEv,_ZThn28_N3aaa9GG22313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231311E[];
Class_Descriptor cd__ZN3aaa9GG2231311E = {  "_ZN3aaa9GG2231311E", // class name
  bases__ZN3aaa9GG2231311E, 6,
  &(vtc__ZN3aaa9GG2231311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231312  : ::aaa::EE223 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22313123barEv
  ~GG2231312(); // tgen
  GG2231312(); // tgen
};
//SIG(1 _ZN3aaa9GG2231312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22313123barEv");}
aaa::GG2231312 ::~GG2231312(){ note_dtor("_ZN3aaa9GG2231312E", this);} // tgen
aaa::GG2231312 ::GG2231312(){ note_ctor("_ZN3aaa9GG2231312E", this);} // tgen
}
static void Test__ZN3aaa9GG2231312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231312E, buf);
    ::aaa::GG2231312 *dp, &lv = *(dp=new (buf) ::aaa::GG2231312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231312E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2231312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2231312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2231312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231312E);
    dp->::aaa::GG2231312::~GG2231312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231312E(Test__ZN3aaa9GG2231312E, "_ZN3aaa9GG2231312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231312C1Ev();
extern void _ZN3aaa9GG2231312D1Ev();
Name_Map name_map__ZN3aaa9GG2231312E[] = {
  NSPAIR(_ZN3aaa9GG2231312C1Ev),
  NSPAIR(_ZN3aaa9GG2231312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2231312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231312E[];
extern void _ZN3aaa9GG22313123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22313123barEv,_ZThn8_N3aaa9GG22313123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313123barEv,_ZThn28_N3aaa9GG22313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22313123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22313123barEv,_ZThn8_N3aaa9GG22313123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313123barEv,_ZThn28_N3aaa9GG22313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231312E[];
Class_Descriptor cd__ZN3aaa9GG2231312E = {  "_ZN3aaa9GG2231312E", // class name
  bases__ZN3aaa9GG2231312E, 6,
  &(vtc__ZN3aaa9GG2231312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231313  : ::aaa::EE223 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22313133fooEv
  virtual void  bar(); // _ZN3aaa9GG22313133barEv
  ~GG2231313(); // tgen
  GG2231313(); // tgen
};
//SIG(1 _ZN3aaa9GG2231313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22313133fooEv");}
void  aaa::GG2231313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22313133barEv");}
aaa::GG2231313 ::~GG2231313(){ note_dtor("_ZN3aaa9GG2231313E", this);} // tgen
aaa::GG2231313 ::GG2231313(){ note_ctor("_ZN3aaa9GG2231313E", this);} // tgen
}
static void Test__ZN3aaa9GG2231313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231313E, buf);
    ::aaa::GG2231313 *dp, &lv = *(dp=new (buf) ::aaa::GG2231313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231313E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2231313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2231313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2231313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231313E);
    dp->::aaa::GG2231313::~GG2231313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231313E(Test__ZN3aaa9GG2231313E, "_ZN3aaa9GG2231313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231313C1Ev();
extern void _ZN3aaa9GG2231313D1Ev();
Name_Map name_map__ZN3aaa9GG2231313E[] = {
  NSPAIR(_ZN3aaa9GG2231313C1Ev),
  NSPAIR(_ZN3aaa9GG2231313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2231313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231313E[];
extern void _ZN3aaa9GG22313133barEv();
extern void _ZN3aaa9GG22313133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22313133barEv,_ZThn8_N3aaa9GG22313133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22313133fooEv,_ZThn20_N3aaa9GG22313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313133fooEv,_ZThn28_N3aaa9GG22313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313133barEv,_ZThn28_N3aaa9GG22313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22313133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22313133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22313133barEv,_ZThn8_N3aaa9GG22313133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313133fooEv,_ZThn20_N3aaa9GG22313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313133fooEv,_ZThn28_N3aaa9GG22313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313133barEv,_ZThn28_N3aaa9GG22313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231313E[];
Class_Descriptor cd__ZN3aaa9GG2231313E = {  "_ZN3aaa9GG2231313E", // class name
  bases__ZN3aaa9GG2231313E, 6,
  &(vtc__ZN3aaa9GG2231313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231321  : ::aaa::EE223 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22313213fooEv
  ~GG2231321(); // tgen
  GG2231321(); // tgen
};
//SIG(1 _ZN3aaa9GG2231321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22313213fooEv");}
aaa::GG2231321 ::~GG2231321(){ note_dtor("_ZN3aaa9GG2231321E", this);} // tgen
aaa::GG2231321 ::GG2231321(){ note_ctor("_ZN3aaa9GG2231321E", this);} // tgen
}
static void Test__ZN3aaa9GG2231321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231321E, buf);
    ::aaa::GG2231321 *dp, &lv = *(dp=new (buf) ::aaa::GG2231321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231321E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2231321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2231321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2231321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231321E);
    dp->::aaa::GG2231321::~GG2231321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231321E(Test__ZN3aaa9GG2231321E, "_ZN3aaa9GG2231321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231321C1Ev();
extern void _ZN3aaa9GG2231321D1Ev();
Name_Map name_map__ZN3aaa9GG2231321E[] = {
  NSPAIR(_ZN3aaa9GG2231321C1Ev),
  NSPAIR(_ZN3aaa9GG2231321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2231321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231321E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22313213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22313213fooEv,_ZThn20_N3aaa9GG22313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22313213fooEv,_ZThn28_N3aaa9GG22313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22313213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313213fooEv,_ZThn20_N3aaa9GG22313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313213fooEv,_ZThn28_N3aaa9GG22313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231321E[];
Class_Descriptor cd__ZN3aaa9GG2231321E = {  "_ZN3aaa9GG2231321E", // class name
  bases__ZN3aaa9GG2231321E, 6,
  &(vtc__ZN3aaa9GG2231321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231322  : ::aaa::EE223 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22313223barEv
  ~GG2231322(); // tgen
  GG2231322(); // tgen
};
//SIG(1 _ZN3aaa9GG2231322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22313223barEv");}
aaa::GG2231322 ::~GG2231322(){ note_dtor("_ZN3aaa9GG2231322E", this);} // tgen
aaa::GG2231322 ::GG2231322(){ note_ctor("_ZN3aaa9GG2231322E", this);} // tgen
}
static void Test__ZN3aaa9GG2231322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231322E, buf);
    ::aaa::GG2231322 *dp, &lv = *(dp=new (buf) ::aaa::GG2231322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231322E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2231322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2231322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2231322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231322E);
    dp->::aaa::GG2231322::~GG2231322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231322E(Test__ZN3aaa9GG2231322E, "_ZN3aaa9GG2231322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231322C1Ev();
extern void _ZN3aaa9GG2231322D1Ev();
Name_Map name_map__ZN3aaa9GG2231322E[] = {
  NSPAIR(_ZN3aaa9GG2231322C1Ev),
  NSPAIR(_ZN3aaa9GG2231322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2231322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231322E[];
extern void _ZN3aaa9GG22313223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22313223barEv,_ZThn8_N3aaa9GG22313223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22313223barEv,_ZThn20_N3aaa9GG22313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22313223barEv,_ZThn28_N3aaa9GG22313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22313223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22313223barEv,_ZThn8_N3aaa9GG22313223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313223barEv,_ZThn20_N3aaa9GG22313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313223barEv,_ZThn28_N3aaa9GG22313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231322E[];
Class_Descriptor cd__ZN3aaa9GG2231322E = {  "_ZN3aaa9GG2231322E", // class name
  bases__ZN3aaa9GG2231322E, 6,
  &(vtc__ZN3aaa9GG2231322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231323  : ::aaa::EE223 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22313233fooEv
  virtual void  bar(); // _ZN3aaa9GG22313233barEv
  ~GG2231323(); // tgen
  GG2231323(); // tgen
};
//SIG(1 _ZN3aaa9GG2231323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22313233fooEv");}
void  aaa::GG2231323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22313233barEv");}
aaa::GG2231323 ::~GG2231323(){ note_dtor("_ZN3aaa9GG2231323E", this);} // tgen
aaa::GG2231323 ::GG2231323(){ note_ctor("_ZN3aaa9GG2231323E", this);} // tgen
}
static void Test__ZN3aaa9GG2231323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231323E, buf);
    ::aaa::GG2231323 *dp, &lv = *(dp=new (buf) ::aaa::GG2231323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231323E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2231323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2231323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2231323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231323E);
    dp->::aaa::GG2231323::~GG2231323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231323E(Test__ZN3aaa9GG2231323E, "_ZN3aaa9GG2231323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231323C1Ev();
extern void _ZN3aaa9GG2231323D1Ev();
Name_Map name_map__ZN3aaa9GG2231323E[] = {
  NSPAIR(_ZN3aaa9GG2231323C1Ev),
  NSPAIR(_ZN3aaa9GG2231323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2231323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231323E[];
extern void _ZN3aaa9GG22313233barEv();
extern void _ZN3aaa9GG22313233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22313233barEv,_ZThn8_N3aaa9GG22313233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22313233fooEv,_ZThn20_N3aaa9GG22313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22313233barEv,_ZThn20_N3aaa9GG22313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313233fooEv,_ZThn28_N3aaa9GG22313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313233barEv,_ZThn28_N3aaa9GG22313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22313233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22313233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22313233barEv,_ZThn8_N3aaa9GG22313233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313233fooEv,_ZThn20_N3aaa9GG22313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313233barEv,_ZThn20_N3aaa9GG22313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313233fooEv,_ZThn28_N3aaa9GG22313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313233barEv,_ZThn28_N3aaa9GG22313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231323E[];
Class_Descriptor cd__ZN3aaa9GG2231323E = {  "_ZN3aaa9GG2231323E", // class name
  bases__ZN3aaa9GG2231323E, 6,
  &(vtc__ZN3aaa9GG2231323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231331  : ::aaa::EE223 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22313313fooEv
  ~GG2231331(); // tgen
  GG2231331(); // tgen
};
//SIG(1 _ZN3aaa9GG2231331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22313313fooEv");}
aaa::GG2231331 ::~GG2231331(){ note_dtor("_ZN3aaa9GG2231331E", this);} // tgen
aaa::GG2231331 ::GG2231331(){ note_ctor("_ZN3aaa9GG2231331E", this);} // tgen
}
static void Test__ZN3aaa9GG2231331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231331E, buf);
    ::aaa::GG2231331 *dp, &lv = *(dp=new (buf) ::aaa::GG2231331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231331E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2231331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2231331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2231331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231331E);
    dp->::aaa::GG2231331::~GG2231331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231331E(Test__ZN3aaa9GG2231331E, "_ZN3aaa9GG2231331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231331C1Ev();
extern void _ZN3aaa9GG2231331D1Ev();
Name_Map name_map__ZN3aaa9GG2231331E[] = {
  NSPAIR(_ZN3aaa9GG2231331C1Ev),
  NSPAIR(_ZN3aaa9GG2231331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2231331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231331E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22313313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22313313fooEv,_ZThn20_N3aaa9GG22313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22313313fooEv,_ZThn28_N3aaa9GG22313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22313313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313313fooEv,_ZThn20_N3aaa9GG22313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313313fooEv,_ZThn28_N3aaa9GG22313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231331E[];
Class_Descriptor cd__ZN3aaa9GG2231331E = {  "_ZN3aaa9GG2231331E", // class name
  bases__ZN3aaa9GG2231331E, 6,
  &(vtc__ZN3aaa9GG2231331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231332  : ::aaa::EE223 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22313323barEv
  ~GG2231332(); // tgen
  GG2231332(); // tgen
};
//SIG(1 _ZN3aaa9GG2231332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2231332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22313323barEv");}
aaa::GG2231332 ::~GG2231332(){ note_dtor("_ZN3aaa9GG2231332E", this);} // tgen
aaa::GG2231332 ::GG2231332(){ note_ctor("_ZN3aaa9GG2231332E", this);} // tgen
}
static void Test__ZN3aaa9GG2231332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231332E, buf);
    ::aaa::GG2231332 *dp, &lv = *(dp=new (buf) ::aaa::GG2231332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231332E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2231332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2231332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2231332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231332E);
    dp->::aaa::GG2231332::~GG2231332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231332E(Test__ZN3aaa9GG2231332E, "_ZN3aaa9GG2231332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231332C1Ev();
extern void _ZN3aaa9GG2231332D1Ev();
Name_Map name_map__ZN3aaa9GG2231332E[] = {
  NSPAIR(_ZN3aaa9GG2231332C1Ev),
  NSPAIR(_ZN3aaa9GG2231332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2231332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231332E[];
extern void _ZN3aaa9GG22313323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22313323barEv,_ZThn8_N3aaa9GG22313323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22313323barEv,_ZThn20_N3aaa9GG22313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313323barEv,_ZThn28_N3aaa9GG22313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22313323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22313323barEv,_ZThn8_N3aaa9GG22313323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313323barEv,_ZThn20_N3aaa9GG22313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313323barEv,_ZThn28_N3aaa9GG22313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231332E[];
Class_Descriptor cd__ZN3aaa9GG2231332E = {  "_ZN3aaa9GG2231332E", // class name
  bases__ZN3aaa9GG2231332E, 6,
  &(vtc__ZN3aaa9GG2231332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2231333  : ::aaa::EE223 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22313333fooEv
  virtual void  bar(); // _ZN3aaa9GG22313333barEv
  ~GG2231333(); // tgen
  GG2231333(); // tgen
};
//SIG(1 _ZN3aaa9GG2231333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2231333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22313333fooEv");}
void  aaa::GG2231333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22313333barEv");}
aaa::GG2231333 ::~GG2231333(){ note_dtor("_ZN3aaa9GG2231333E", this);} // tgen
aaa::GG2231333 ::GG2231333(){ note_ctor("_ZN3aaa9GG2231333E", this);} // tgen
}
static void Test__ZN3aaa9GG2231333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2231333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2231333E, buf);
    ::aaa::GG2231333 *dp, &lv = *(dp=new (buf) ::aaa::GG2231333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2231333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2231333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2231333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2231333E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2231333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2231333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2231333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2231333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2231333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2231333E);
    dp->::aaa::GG2231333::~GG2231333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2231333E(Test__ZN3aaa9GG2231333E, "_ZN3aaa9GG2231333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2231333C1Ev();
extern void _ZN3aaa9GG2231333D1Ev();
Name_Map name_map__ZN3aaa9GG2231333E[] = {
  NSPAIR(_ZN3aaa9GG2231333C1Ev),
  NSPAIR(_ZN3aaa9GG2231333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2231333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2231333E[];
extern void _ZN3aaa9GG22313333barEv();
extern void _ZN3aaa9GG22313333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22313333barEv,_ZThn8_N3aaa9GG22313333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22313333fooEv,_ZThn20_N3aaa9GG22313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22313333barEv,_ZThn20_N3aaa9GG22313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313333fooEv,_ZThn28_N3aaa9GG22313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22313333barEv,_ZThn28_N3aaa9GG22313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2231333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22313333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22313333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22313333barEv,_ZThn8_N3aaa9GG22313333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313333fooEv,_ZThn20_N3aaa9GG22313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22313333barEv,_ZThn20_N3aaa9GG22313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313333fooEv,_ZThn28_N3aaa9GG22313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22313333barEv,_ZThn28_N3aaa9GG22313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2231333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2231333E[];
Class_Descriptor cd__ZN3aaa9GG2231333E = {  "_ZN3aaa9GG2231333E", // class name
  bases__ZN3aaa9GG2231333E, 6,
  &(vtc__ZN3aaa9GG2231333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2231333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2231333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232111  : ::aaa::EE223 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22321113fooEv
  ~GG2232111(); // tgen
  GG2232111(); // tgen
};
//SIG(1 _ZN3aaa9GG2232111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22321113fooEv");}
aaa::GG2232111 ::~GG2232111(){ note_dtor("_ZN3aaa9GG2232111E", this);} // tgen
aaa::GG2232111 ::GG2232111(){ note_ctor("_ZN3aaa9GG2232111E", this);} // tgen
}
static void Test__ZN3aaa9GG2232111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232111E, buf);
    ::aaa::GG2232111 *dp, &lv = *(dp=new (buf) ::aaa::GG2232111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232111E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2232111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2232111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2232111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232111E);
    dp->::aaa::GG2232111::~GG2232111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232111E(Test__ZN3aaa9GG2232111E, "_ZN3aaa9GG2232111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232111C1Ev();
extern void _ZN3aaa9GG2232111D1Ev();
Name_Map name_map__ZN3aaa9GG2232111E[] = {
  NSPAIR(_ZN3aaa9GG2232111C1Ev),
  NSPAIR(_ZN3aaa9GG2232111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2232111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232111E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22321113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22321113fooEv,_ZThn20_N3aaa9GG22321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22321113fooEv,_ZThn28_N3aaa9GG22321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22321113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321113fooEv,_ZThn20_N3aaa9GG22321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22321113fooEv,_ZThn28_N3aaa9GG22321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232111E[];
Class_Descriptor cd__ZN3aaa9GG2232111E = {  "_ZN3aaa9GG2232111E", // class name
  bases__ZN3aaa9GG2232111E, 6,
  &(vtc__ZN3aaa9GG2232111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232112  : ::aaa::EE223 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22321123barEv
  ~GG2232112(); // tgen
  GG2232112(); // tgen
};
//SIG(1 _ZN3aaa9GG2232112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22321123barEv");}
aaa::GG2232112 ::~GG2232112(){ note_dtor("_ZN3aaa9GG2232112E", this);} // tgen
aaa::GG2232112 ::GG2232112(){ note_ctor("_ZN3aaa9GG2232112E", this);} // tgen
}
static void Test__ZN3aaa9GG2232112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232112E, buf);
    ::aaa::GG2232112 *dp, &lv = *(dp=new (buf) ::aaa::GG2232112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232112E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2232112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2232112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2232112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232112E);
    dp->::aaa::GG2232112::~GG2232112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232112E(Test__ZN3aaa9GG2232112E, "_ZN3aaa9GG2232112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232112C1Ev();
extern void _ZN3aaa9GG2232112D1Ev();
Name_Map name_map__ZN3aaa9GG2232112E[] = {
  NSPAIR(_ZN3aaa9GG2232112C1Ev),
  NSPAIR(_ZN3aaa9GG2232112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2232112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232112E[];
extern void _ZN3aaa9GG22321123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22321123barEv,_ZThn8_N3aaa9GG22321123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22321123barEv,_ZThn20_N3aaa9GG22321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22321123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22321123barEv,_ZThn8_N3aaa9GG22321123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321123barEv,_ZThn20_N3aaa9GG22321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232112E[];
Class_Descriptor cd__ZN3aaa9GG2232112E = {  "_ZN3aaa9GG2232112E", // class name
  bases__ZN3aaa9GG2232112E, 6,
  &(vtc__ZN3aaa9GG2232112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232113  : ::aaa::EE223 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22321133fooEv
  virtual void  bar(); // _ZN3aaa9GG22321133barEv
  ~GG2232113(); // tgen
  GG2232113(); // tgen
};
//SIG(1 _ZN3aaa9GG2232113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22321133fooEv");}
void  aaa::GG2232113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22321133barEv");}
aaa::GG2232113 ::~GG2232113(){ note_dtor("_ZN3aaa9GG2232113E", this);} // tgen
aaa::GG2232113 ::GG2232113(){ note_ctor("_ZN3aaa9GG2232113E", this);} // tgen
}
static void Test__ZN3aaa9GG2232113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232113E, buf);
    ::aaa::GG2232113 *dp, &lv = *(dp=new (buf) ::aaa::GG2232113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232113E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2232113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2232113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2232113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232113E);
    dp->::aaa::GG2232113::~GG2232113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232113E(Test__ZN3aaa9GG2232113E, "_ZN3aaa9GG2232113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232113C1Ev();
extern void _ZN3aaa9GG2232113D1Ev();
Name_Map name_map__ZN3aaa9GG2232113E[] = {
  NSPAIR(_ZN3aaa9GG2232113C1Ev),
  NSPAIR(_ZN3aaa9GG2232113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2232113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232113E[];
extern void _ZN3aaa9GG22321133barEv();
extern void _ZN3aaa9GG22321133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22321133barEv,_ZThn8_N3aaa9GG22321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22321133barEv,_ZThn20_N3aaa9GG22321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22321133fooEv,_ZThn20_N3aaa9GG22321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22321133fooEv,_ZThn28_N3aaa9GG22321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22321133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22321133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22321133barEv,_ZThn8_N3aaa9GG22321133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321133barEv,_ZThn20_N3aaa9GG22321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321133fooEv,_ZThn20_N3aaa9GG22321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22321133fooEv,_ZThn28_N3aaa9GG22321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232113E[];
Class_Descriptor cd__ZN3aaa9GG2232113E = {  "_ZN3aaa9GG2232113E", // class name
  bases__ZN3aaa9GG2232113E, 6,
  &(vtc__ZN3aaa9GG2232113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232121  : ::aaa::EE223 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22321213fooEv
  ~GG2232121(); // tgen
  GG2232121(); // tgen
};
//SIG(1 _ZN3aaa9GG2232121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22321213fooEv");}
aaa::GG2232121 ::~GG2232121(){ note_dtor("_ZN3aaa9GG2232121E", this);} // tgen
aaa::GG2232121 ::GG2232121(){ note_ctor("_ZN3aaa9GG2232121E", this);} // tgen
}
static void Test__ZN3aaa9GG2232121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232121E, buf);
    ::aaa::GG2232121 *dp, &lv = *(dp=new (buf) ::aaa::GG2232121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232121E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2232121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2232121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2232121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232121E);
    dp->::aaa::GG2232121::~GG2232121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232121E(Test__ZN3aaa9GG2232121E, "_ZN3aaa9GG2232121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232121C1Ev();
extern void _ZN3aaa9GG2232121D1Ev();
Name_Map name_map__ZN3aaa9GG2232121E[] = {
  NSPAIR(_ZN3aaa9GG2232121C1Ev),
  NSPAIR(_ZN3aaa9GG2232121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2232121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232121E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22321213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22321213fooEv,_ZThn28_N3aaa9GG22321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22321213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22321213fooEv,_ZThn28_N3aaa9GG22321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232121E[];
Class_Descriptor cd__ZN3aaa9GG2232121E = {  "_ZN3aaa9GG2232121E", // class name
  bases__ZN3aaa9GG2232121E, 6,
  &(vtc__ZN3aaa9GG2232121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232122  : ::aaa::EE223 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22321223barEv
  ~GG2232122(); // tgen
  GG2232122(); // tgen
};
//SIG(1 _ZN3aaa9GG2232122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22321223barEv");}
aaa::GG2232122 ::~GG2232122(){ note_dtor("_ZN3aaa9GG2232122E", this);} // tgen
aaa::GG2232122 ::GG2232122(){ note_ctor("_ZN3aaa9GG2232122E", this);} // tgen
}
static void Test__ZN3aaa9GG2232122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232122E, buf);
    ::aaa::GG2232122 *dp, &lv = *(dp=new (buf) ::aaa::GG2232122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232122E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2232122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2232122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2232122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232122E);
    dp->::aaa::GG2232122::~GG2232122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232122E(Test__ZN3aaa9GG2232122E, "_ZN3aaa9GG2232122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232122C1Ev();
extern void _ZN3aaa9GG2232122D1Ev();
Name_Map name_map__ZN3aaa9GG2232122E[] = {
  NSPAIR(_ZN3aaa9GG2232122C1Ev),
  NSPAIR(_ZN3aaa9GG2232122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2232122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232122E[];
extern void _ZN3aaa9GG22321223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22321223barEv,_ZThn8_N3aaa9GG22321223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22321223barEv,_ZThn20_N3aaa9GG22321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22321223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22321223barEv,_ZThn8_N3aaa9GG22321223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321223barEv,_ZThn20_N3aaa9GG22321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232122E[];
Class_Descriptor cd__ZN3aaa9GG2232122E = {  "_ZN3aaa9GG2232122E", // class name
  bases__ZN3aaa9GG2232122E, 6,
  &(vtc__ZN3aaa9GG2232122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232123  : ::aaa::EE223 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22321233fooEv
  virtual void  bar(); // _ZN3aaa9GG22321233barEv
  ~GG2232123(); // tgen
  GG2232123(); // tgen
};
//SIG(1 _ZN3aaa9GG2232123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22321233fooEv");}
void  aaa::GG2232123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22321233barEv");}
aaa::GG2232123 ::~GG2232123(){ note_dtor("_ZN3aaa9GG2232123E", this);} // tgen
aaa::GG2232123 ::GG2232123(){ note_ctor("_ZN3aaa9GG2232123E", this);} // tgen
}
static void Test__ZN3aaa9GG2232123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232123E, buf);
    ::aaa::GG2232123 *dp, &lv = *(dp=new (buf) ::aaa::GG2232123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232123E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2232123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2232123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2232123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232123E);
    dp->::aaa::GG2232123::~GG2232123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232123E(Test__ZN3aaa9GG2232123E, "_ZN3aaa9GG2232123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232123C1Ev();
extern void _ZN3aaa9GG2232123D1Ev();
Name_Map name_map__ZN3aaa9GG2232123E[] = {
  NSPAIR(_ZN3aaa9GG2232123C1Ev),
  NSPAIR(_ZN3aaa9GG2232123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2232123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232123E[];
extern void _ZN3aaa9GG22321233barEv();
extern void _ZN3aaa9GG22321233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22321233barEv,_ZThn8_N3aaa9GG22321233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22321233barEv,_ZThn20_N3aaa9GG22321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22321233fooEv,_ZThn28_N3aaa9GG22321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22321233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22321233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22321233barEv,_ZThn8_N3aaa9GG22321233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321233barEv,_ZThn20_N3aaa9GG22321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22321233fooEv,_ZThn28_N3aaa9GG22321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232123E[];
Class_Descriptor cd__ZN3aaa9GG2232123E = {  "_ZN3aaa9GG2232123E", // class name
  bases__ZN3aaa9GG2232123E, 6,
  &(vtc__ZN3aaa9GG2232123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232131  : ::aaa::EE223 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22321313fooEv
  ~GG2232131(); // tgen
  GG2232131(); // tgen
};
//SIG(1 _ZN3aaa9GG2232131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22321313fooEv");}
aaa::GG2232131 ::~GG2232131(){ note_dtor("_ZN3aaa9GG2232131E", this);} // tgen
aaa::GG2232131 ::GG2232131(){ note_ctor("_ZN3aaa9GG2232131E", this);} // tgen
}
static void Test__ZN3aaa9GG2232131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232131E, buf);
    ::aaa::GG2232131 *dp, &lv = *(dp=new (buf) ::aaa::GG2232131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232131E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2232131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2232131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2232131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232131E);
    dp->::aaa::GG2232131::~GG2232131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232131E(Test__ZN3aaa9GG2232131E, "_ZN3aaa9GG2232131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232131C1Ev();
extern void _ZN3aaa9GG2232131D1Ev();
Name_Map name_map__ZN3aaa9GG2232131E[] = {
  NSPAIR(_ZN3aaa9GG2232131C1Ev),
  NSPAIR(_ZN3aaa9GG2232131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2232131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232131E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22321313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22321313fooEv,_ZThn20_N3aaa9GG22321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22321313fooEv,_ZThn28_N3aaa9GG22321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22321313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321313fooEv,_ZThn20_N3aaa9GG22321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22321313fooEv,_ZThn28_N3aaa9GG22321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232131E[];
Class_Descriptor cd__ZN3aaa9GG2232131E = {  "_ZN3aaa9GG2232131E", // class name
  bases__ZN3aaa9GG2232131E, 6,
  &(vtc__ZN3aaa9GG2232131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232132  : ::aaa::EE223 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22321323barEv
  ~GG2232132(); // tgen
  GG2232132(); // tgen
};
//SIG(1 _ZN3aaa9GG2232132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22321323barEv");}
aaa::GG2232132 ::~GG2232132(){ note_dtor("_ZN3aaa9GG2232132E", this);} // tgen
aaa::GG2232132 ::GG2232132(){ note_ctor("_ZN3aaa9GG2232132E", this);} // tgen
}
static void Test__ZN3aaa9GG2232132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232132E, buf);
    ::aaa::GG2232132 *dp, &lv = *(dp=new (buf) ::aaa::GG2232132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232132E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2232132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2232132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2232132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232132E);
    dp->::aaa::GG2232132::~GG2232132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232132E(Test__ZN3aaa9GG2232132E, "_ZN3aaa9GG2232132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232132C1Ev();
extern void _ZN3aaa9GG2232132D1Ev();
Name_Map name_map__ZN3aaa9GG2232132E[] = {
  NSPAIR(_ZN3aaa9GG2232132C1Ev),
  NSPAIR(_ZN3aaa9GG2232132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2232132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232132E[];
extern void _ZN3aaa9GG22321323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22321323barEv,_ZThn8_N3aaa9GG22321323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22321323barEv,_ZThn20_N3aaa9GG22321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22321323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22321323barEv,_ZThn8_N3aaa9GG22321323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321323barEv,_ZThn20_N3aaa9GG22321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232132E[];
Class_Descriptor cd__ZN3aaa9GG2232132E = {  "_ZN3aaa9GG2232132E", // class name
  bases__ZN3aaa9GG2232132E, 6,
  &(vtc__ZN3aaa9GG2232132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232133  : ::aaa::EE223 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22321333fooEv
  virtual void  bar(); // _ZN3aaa9GG22321333barEv
  ~GG2232133(); // tgen
  GG2232133(); // tgen
};
//SIG(1 _ZN3aaa9GG2232133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22321333fooEv");}
void  aaa::GG2232133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22321333barEv");}
aaa::GG2232133 ::~GG2232133(){ note_dtor("_ZN3aaa9GG2232133E", this);} // tgen
aaa::GG2232133 ::GG2232133(){ note_ctor("_ZN3aaa9GG2232133E", this);} // tgen
}
static void Test__ZN3aaa9GG2232133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232133E, buf);
    ::aaa::GG2232133 *dp, &lv = *(dp=new (buf) ::aaa::GG2232133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232133E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2232133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2232133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2232133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232133E);
    dp->::aaa::GG2232133::~GG2232133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232133E(Test__ZN3aaa9GG2232133E, "_ZN3aaa9GG2232133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232133C1Ev();
extern void _ZN3aaa9GG2232133D1Ev();
Name_Map name_map__ZN3aaa9GG2232133E[] = {
  NSPAIR(_ZN3aaa9GG2232133C1Ev),
  NSPAIR(_ZN3aaa9GG2232133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2232133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232133E[];
extern void _ZN3aaa9GG22321333barEv();
extern void _ZN3aaa9GG22321333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22321333barEv,_ZThn8_N3aaa9GG22321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22321333barEv,_ZThn20_N3aaa9GG22321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22321333fooEv,_ZThn20_N3aaa9GG22321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22321333fooEv,_ZThn28_N3aaa9GG22321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22321333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22321333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22321333barEv,_ZThn8_N3aaa9GG22321333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321333barEv,_ZThn20_N3aaa9GG22321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22321333fooEv,_ZThn20_N3aaa9GG22321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22321333fooEv,_ZThn28_N3aaa9GG22321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232133E[];
Class_Descriptor cd__ZN3aaa9GG2232133E = {  "_ZN3aaa9GG2232133E", // class name
  bases__ZN3aaa9GG2232133E, 6,
  &(vtc__ZN3aaa9GG2232133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232211  : ::aaa::EE223 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22322113fooEv
  ~GG2232211(); // tgen
  GG2232211(); // tgen
};
//SIG(1 _ZN3aaa9GG2232211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22322113fooEv");}
aaa::GG2232211 ::~GG2232211(){ note_dtor("_ZN3aaa9GG2232211E", this);} // tgen
aaa::GG2232211 ::GG2232211(){ note_ctor("_ZN3aaa9GG2232211E", this);} // tgen
}
static void Test__ZN3aaa9GG2232211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232211E, buf);
    ::aaa::GG2232211 *dp, &lv = *(dp=new (buf) ::aaa::GG2232211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232211E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2232211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2232211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2232211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232211E);
    dp->::aaa::GG2232211::~GG2232211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232211E(Test__ZN3aaa9GG2232211E, "_ZN3aaa9GG2232211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232211C1Ev();
extern void _ZN3aaa9GG2232211D1Ev();
Name_Map name_map__ZN3aaa9GG2232211E[] = {
  NSPAIR(_ZN3aaa9GG2232211C1Ev),
  NSPAIR(_ZN3aaa9GG2232211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2232211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232211E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22322113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22322113fooEv,_ZThn20_N3aaa9GG22322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22322113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322113fooEv,_ZThn20_N3aaa9GG22322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232211E[];
Class_Descriptor cd__ZN3aaa9GG2232211E = {  "_ZN3aaa9GG2232211E", // class name
  bases__ZN3aaa9GG2232211E, 6,
  &(vtc__ZN3aaa9GG2232211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232212  : ::aaa::EE223 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22322123barEv
  ~GG2232212(); // tgen
  GG2232212(); // tgen
};
//SIG(1 _ZN3aaa9GG2232212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22322123barEv");}
aaa::GG2232212 ::~GG2232212(){ note_dtor("_ZN3aaa9GG2232212E", this);} // tgen
aaa::GG2232212 ::GG2232212(){ note_ctor("_ZN3aaa9GG2232212E", this);} // tgen
}
static void Test__ZN3aaa9GG2232212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232212E, buf);
    ::aaa::GG2232212 *dp, &lv = *(dp=new (buf) ::aaa::GG2232212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232212E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2232212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2232212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2232212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232212E);
    dp->::aaa::GG2232212::~GG2232212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232212E(Test__ZN3aaa9GG2232212E, "_ZN3aaa9GG2232212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232212C1Ev();
extern void _ZN3aaa9GG2232212D1Ev();
Name_Map name_map__ZN3aaa9GG2232212E[] = {
  NSPAIR(_ZN3aaa9GG2232212C1Ev),
  NSPAIR(_ZN3aaa9GG2232212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2232212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232212E[];
extern void _ZN3aaa9GG22322123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22322123barEv,_ZThn8_N3aaa9GG22322123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22322123barEv,_ZThn20_N3aaa9GG22322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22322123barEv,_ZThn28_N3aaa9GG22322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22322123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22322123barEv,_ZThn8_N3aaa9GG22322123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322123barEv,_ZThn20_N3aaa9GG22322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22322123barEv,_ZThn28_N3aaa9GG22322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232212E[];
Class_Descriptor cd__ZN3aaa9GG2232212E = {  "_ZN3aaa9GG2232212E", // class name
  bases__ZN3aaa9GG2232212E, 6,
  &(vtc__ZN3aaa9GG2232212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232213  : ::aaa::EE223 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22322133fooEv
  virtual void  bar(); // _ZN3aaa9GG22322133barEv
  ~GG2232213(); // tgen
  GG2232213(); // tgen
};
//SIG(1 _ZN3aaa9GG2232213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22322133fooEv");}
void  aaa::GG2232213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22322133barEv");}
aaa::GG2232213 ::~GG2232213(){ note_dtor("_ZN3aaa9GG2232213E", this);} // tgen
aaa::GG2232213 ::GG2232213(){ note_ctor("_ZN3aaa9GG2232213E", this);} // tgen
}
static void Test__ZN3aaa9GG2232213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232213E, buf);
    ::aaa::GG2232213 *dp, &lv = *(dp=new (buf) ::aaa::GG2232213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232213E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2232213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2232213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2232213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232213E);
    dp->::aaa::GG2232213::~GG2232213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232213E(Test__ZN3aaa9GG2232213E, "_ZN3aaa9GG2232213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232213C1Ev();
extern void _ZN3aaa9GG2232213D1Ev();
Name_Map name_map__ZN3aaa9GG2232213E[] = {
  NSPAIR(_ZN3aaa9GG2232213C1Ev),
  NSPAIR(_ZN3aaa9GG2232213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2232213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232213E[];
extern void _ZN3aaa9GG22322133barEv();
extern void _ZN3aaa9GG22322133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22322133barEv,_ZThn8_N3aaa9GG22322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22322133barEv,_ZThn20_N3aaa9GG22322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22322133fooEv,_ZThn20_N3aaa9GG22322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22322133barEv,_ZThn28_N3aaa9GG22322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22322133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22322133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22322133barEv,_ZThn8_N3aaa9GG22322133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322133barEv,_ZThn20_N3aaa9GG22322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322133fooEv,_ZThn20_N3aaa9GG22322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22322133barEv,_ZThn28_N3aaa9GG22322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232213E[];
Class_Descriptor cd__ZN3aaa9GG2232213E = {  "_ZN3aaa9GG2232213E", // class name
  bases__ZN3aaa9GG2232213E, 6,
  &(vtc__ZN3aaa9GG2232213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232221  : ::aaa::EE223 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22322213fooEv
  ~GG2232221(); // tgen
  GG2232221(); // tgen
};
//SIG(1 _ZN3aaa9GG2232221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22322213fooEv");}
aaa::GG2232221 ::~GG2232221(){ note_dtor("_ZN3aaa9GG2232221E", this);} // tgen
aaa::GG2232221 ::GG2232221(){ note_ctor("_ZN3aaa9GG2232221E", this);} // tgen
}
static void Test__ZN3aaa9GG2232221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232221E, buf);
    ::aaa::GG2232221 *dp, &lv = *(dp=new (buf) ::aaa::GG2232221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232221E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2232221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2232221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2232221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232221E);
    dp->::aaa::GG2232221::~GG2232221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232221E(Test__ZN3aaa9GG2232221E, "_ZN3aaa9GG2232221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232221C1Ev();
extern void _ZN3aaa9GG2232221D1Ev();
Name_Map name_map__ZN3aaa9GG2232221E[] = {
  NSPAIR(_ZN3aaa9GG2232221C1Ev),
  NSPAIR(_ZN3aaa9GG2232221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2232221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232221E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22322213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22322213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232221E[];
Class_Descriptor cd__ZN3aaa9GG2232221E = {  "_ZN3aaa9GG2232221E", // class name
  bases__ZN3aaa9GG2232221E, 6,
  &(vtc__ZN3aaa9GG2232221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232222  : ::aaa::EE223 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22322223barEv
  ~GG2232222(); // tgen
  GG2232222(); // tgen
};
//SIG(1 _ZN3aaa9GG2232222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22322223barEv");}
aaa::GG2232222 ::~GG2232222(){ note_dtor("_ZN3aaa9GG2232222E", this);} // tgen
aaa::GG2232222 ::GG2232222(){ note_ctor("_ZN3aaa9GG2232222E", this);} // tgen
}
static void Test__ZN3aaa9GG2232222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232222E, buf);
    ::aaa::GG2232222 *dp, &lv = *(dp=new (buf) ::aaa::GG2232222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232222E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2232222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2232222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2232222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232222E);
    dp->::aaa::GG2232222::~GG2232222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232222E(Test__ZN3aaa9GG2232222E, "_ZN3aaa9GG2232222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232222C1Ev();
extern void _ZN3aaa9GG2232222D1Ev();
Name_Map name_map__ZN3aaa9GG2232222E[] = {
  NSPAIR(_ZN3aaa9GG2232222C1Ev),
  NSPAIR(_ZN3aaa9GG2232222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2232222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232222E[];
extern void _ZN3aaa9GG22322223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22322223barEv,_ZThn8_N3aaa9GG22322223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22322223barEv,_ZThn20_N3aaa9GG22322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22322223barEv,_ZThn28_N3aaa9GG22322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22322223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22322223barEv,_ZThn8_N3aaa9GG22322223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322223barEv,_ZThn20_N3aaa9GG22322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22322223barEv,_ZThn28_N3aaa9GG22322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232222E[];
Class_Descriptor cd__ZN3aaa9GG2232222E = {  "_ZN3aaa9GG2232222E", // class name
  bases__ZN3aaa9GG2232222E, 6,
  &(vtc__ZN3aaa9GG2232222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232223  : ::aaa::EE223 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22322233fooEv
  virtual void  bar(); // _ZN3aaa9GG22322233barEv
  ~GG2232223(); // tgen
  GG2232223(); // tgen
};
//SIG(1 _ZN3aaa9GG2232223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22322233fooEv");}
void  aaa::GG2232223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22322233barEv");}
aaa::GG2232223 ::~GG2232223(){ note_dtor("_ZN3aaa9GG2232223E", this);} // tgen
aaa::GG2232223 ::GG2232223(){ note_ctor("_ZN3aaa9GG2232223E", this);} // tgen
}
static void Test__ZN3aaa9GG2232223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232223E, buf);
    ::aaa::GG2232223 *dp, &lv = *(dp=new (buf) ::aaa::GG2232223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232223E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2232223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2232223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2232223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232223E);
    dp->::aaa::GG2232223::~GG2232223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232223E(Test__ZN3aaa9GG2232223E, "_ZN3aaa9GG2232223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232223C1Ev();
extern void _ZN3aaa9GG2232223D1Ev();
Name_Map name_map__ZN3aaa9GG2232223E[] = {
  NSPAIR(_ZN3aaa9GG2232223C1Ev),
  NSPAIR(_ZN3aaa9GG2232223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2232223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232223E[];
extern void _ZN3aaa9GG22322233barEv();
extern void _ZN3aaa9GG22322233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22322233barEv,_ZThn8_N3aaa9GG22322233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22322233barEv,_ZThn20_N3aaa9GG22322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22322233barEv,_ZThn28_N3aaa9GG22322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22322233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22322233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22322233barEv,_ZThn8_N3aaa9GG22322233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322233barEv,_ZThn20_N3aaa9GG22322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22322233barEv,_ZThn28_N3aaa9GG22322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232223E[];
Class_Descriptor cd__ZN3aaa9GG2232223E = {  "_ZN3aaa9GG2232223E", // class name
  bases__ZN3aaa9GG2232223E, 6,
  &(vtc__ZN3aaa9GG2232223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232231  : ::aaa::EE223 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22322313fooEv
  ~GG2232231(); // tgen
  GG2232231(); // tgen
};
//SIG(1 _ZN3aaa9GG2232231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22322313fooEv");}
aaa::GG2232231 ::~GG2232231(){ note_dtor("_ZN3aaa9GG2232231E", this);} // tgen
aaa::GG2232231 ::GG2232231(){ note_ctor("_ZN3aaa9GG2232231E", this);} // tgen
}
static void Test__ZN3aaa9GG2232231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232231E, buf);
    ::aaa::GG2232231 *dp, &lv = *(dp=new (buf) ::aaa::GG2232231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232231E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2232231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2232231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2232231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232231E);
    dp->::aaa::GG2232231::~GG2232231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232231E(Test__ZN3aaa9GG2232231E, "_ZN3aaa9GG2232231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232231C1Ev();
extern void _ZN3aaa9GG2232231D1Ev();
Name_Map name_map__ZN3aaa9GG2232231E[] = {
  NSPAIR(_ZN3aaa9GG2232231C1Ev),
  NSPAIR(_ZN3aaa9GG2232231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2232231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232231E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22322313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22322313fooEv,_ZThn20_N3aaa9GG22322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22322313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322313fooEv,_ZThn20_N3aaa9GG22322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232231E[];
Class_Descriptor cd__ZN3aaa9GG2232231E = {  "_ZN3aaa9GG2232231E", // class name
  bases__ZN3aaa9GG2232231E, 6,
  &(vtc__ZN3aaa9GG2232231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232232  : ::aaa::EE223 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22322323barEv
  ~GG2232232(); // tgen
  GG2232232(); // tgen
};
//SIG(1 _ZN3aaa9GG2232232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22322323barEv");}
aaa::GG2232232 ::~GG2232232(){ note_dtor("_ZN3aaa9GG2232232E", this);} // tgen
aaa::GG2232232 ::GG2232232(){ note_ctor("_ZN3aaa9GG2232232E", this);} // tgen
}
static void Test__ZN3aaa9GG2232232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232232E, buf);
    ::aaa::GG2232232 *dp, &lv = *(dp=new (buf) ::aaa::GG2232232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232232E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2232232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2232232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2232232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232232E);
    dp->::aaa::GG2232232::~GG2232232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232232E(Test__ZN3aaa9GG2232232E, "_ZN3aaa9GG2232232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232232C1Ev();
extern void _ZN3aaa9GG2232232D1Ev();
Name_Map name_map__ZN3aaa9GG2232232E[] = {
  NSPAIR(_ZN3aaa9GG2232232C1Ev),
  NSPAIR(_ZN3aaa9GG2232232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2232232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232232E[];
extern void _ZN3aaa9GG22322323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22322323barEv,_ZThn8_N3aaa9GG22322323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22322323barEv,_ZThn20_N3aaa9GG22322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22322323barEv,_ZThn28_N3aaa9GG22322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22322323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22322323barEv,_ZThn8_N3aaa9GG22322323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322323barEv,_ZThn20_N3aaa9GG22322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22322323barEv,_ZThn28_N3aaa9GG22322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232232E[];
Class_Descriptor cd__ZN3aaa9GG2232232E = {  "_ZN3aaa9GG2232232E", // class name
  bases__ZN3aaa9GG2232232E, 6,
  &(vtc__ZN3aaa9GG2232232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232233  : ::aaa::EE223 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22322333fooEv
  virtual void  bar(); // _ZN3aaa9GG22322333barEv
  ~GG2232233(); // tgen
  GG2232233(); // tgen
};
//SIG(1 _ZN3aaa9GG2232233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22322333fooEv");}
void  aaa::GG2232233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22322333barEv");}
aaa::GG2232233 ::~GG2232233(){ note_dtor("_ZN3aaa9GG2232233E", this);} // tgen
aaa::GG2232233 ::GG2232233(){ note_ctor("_ZN3aaa9GG2232233E", this);} // tgen
}
static void Test__ZN3aaa9GG2232233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232233E, buf);
    ::aaa::GG2232233 *dp, &lv = *(dp=new (buf) ::aaa::GG2232233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232233E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2232233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2232233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2232233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232233E);
    dp->::aaa::GG2232233::~GG2232233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232233E(Test__ZN3aaa9GG2232233E, "_ZN3aaa9GG2232233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232233C1Ev();
extern void _ZN3aaa9GG2232233D1Ev();
Name_Map name_map__ZN3aaa9GG2232233E[] = {
  NSPAIR(_ZN3aaa9GG2232233C1Ev),
  NSPAIR(_ZN3aaa9GG2232233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2232233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232233E[];
extern void _ZN3aaa9GG22322333barEv();
extern void _ZN3aaa9GG22322333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22322333barEv,_ZThn8_N3aaa9GG22322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22322333barEv,_ZThn20_N3aaa9GG22322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22322333fooEv,_ZThn20_N3aaa9GG22322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22322333barEv,_ZThn28_N3aaa9GG22322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22322333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22322333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22322333barEv,_ZThn8_N3aaa9GG22322333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322333barEv,_ZThn20_N3aaa9GG22322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22322333fooEv,_ZThn20_N3aaa9GG22322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22322333barEv,_ZThn28_N3aaa9GG22322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232233E[];
Class_Descriptor cd__ZN3aaa9GG2232233E = {  "_ZN3aaa9GG2232233E", // class name
  bases__ZN3aaa9GG2232233E, 6,
  &(vtc__ZN3aaa9GG2232233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232311  : ::aaa::EE223 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22323113fooEv
  ~GG2232311(); // tgen
  GG2232311(); // tgen
};
//SIG(1 _ZN3aaa9GG2232311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22323113fooEv");}
aaa::GG2232311 ::~GG2232311(){ note_dtor("_ZN3aaa9GG2232311E", this);} // tgen
aaa::GG2232311 ::GG2232311(){ note_ctor("_ZN3aaa9GG2232311E", this);} // tgen
}
static void Test__ZN3aaa9GG2232311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232311E, buf);
    ::aaa::GG2232311 *dp, &lv = *(dp=new (buf) ::aaa::GG2232311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232311E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2232311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2232311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2232311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232311E);
    dp->::aaa::GG2232311::~GG2232311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232311E(Test__ZN3aaa9GG2232311E, "_ZN3aaa9GG2232311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232311C1Ev();
extern void _ZN3aaa9GG2232311D1Ev();
Name_Map name_map__ZN3aaa9GG2232311E[] = {
  NSPAIR(_ZN3aaa9GG2232311C1Ev),
  NSPAIR(_ZN3aaa9GG2232311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2232311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232311E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22323113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22323113fooEv,_ZThn20_N3aaa9GG22323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323113fooEv,_ZThn28_N3aaa9GG22323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22323113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323113fooEv,_ZThn20_N3aaa9GG22323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323113fooEv,_ZThn28_N3aaa9GG22323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232311E[];
Class_Descriptor cd__ZN3aaa9GG2232311E = {  "_ZN3aaa9GG2232311E", // class name
  bases__ZN3aaa9GG2232311E, 6,
  &(vtc__ZN3aaa9GG2232311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232312  : ::aaa::EE223 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22323123barEv
  ~GG2232312(); // tgen
  GG2232312(); // tgen
};
//SIG(1 _ZN3aaa9GG2232312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22323123barEv");}
aaa::GG2232312 ::~GG2232312(){ note_dtor("_ZN3aaa9GG2232312E", this);} // tgen
aaa::GG2232312 ::GG2232312(){ note_ctor("_ZN3aaa9GG2232312E", this);} // tgen
}
static void Test__ZN3aaa9GG2232312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232312E, buf);
    ::aaa::GG2232312 *dp, &lv = *(dp=new (buf) ::aaa::GG2232312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232312E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2232312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2232312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2232312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232312E);
    dp->::aaa::GG2232312::~GG2232312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232312E(Test__ZN3aaa9GG2232312E, "_ZN3aaa9GG2232312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232312C1Ev();
extern void _ZN3aaa9GG2232312D1Ev();
Name_Map name_map__ZN3aaa9GG2232312E[] = {
  NSPAIR(_ZN3aaa9GG2232312C1Ev),
  NSPAIR(_ZN3aaa9GG2232312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2232312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232312E[];
extern void _ZN3aaa9GG22323123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22323123barEv,_ZThn8_N3aaa9GG22323123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22323123barEv,_ZThn20_N3aaa9GG22323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323123barEv,_ZThn28_N3aaa9GG22323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22323123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22323123barEv,_ZThn8_N3aaa9GG22323123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323123barEv,_ZThn20_N3aaa9GG22323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323123barEv,_ZThn28_N3aaa9GG22323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232312E[];
Class_Descriptor cd__ZN3aaa9GG2232312E = {  "_ZN3aaa9GG2232312E", // class name
  bases__ZN3aaa9GG2232312E, 6,
  &(vtc__ZN3aaa9GG2232312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232313  : ::aaa::EE223 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22323133fooEv
  virtual void  bar(); // _ZN3aaa9GG22323133barEv
  ~GG2232313(); // tgen
  GG2232313(); // tgen
};
//SIG(1 _ZN3aaa9GG2232313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22323133fooEv");}
void  aaa::GG2232313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22323133barEv");}
aaa::GG2232313 ::~GG2232313(){ note_dtor("_ZN3aaa9GG2232313E", this);} // tgen
aaa::GG2232313 ::GG2232313(){ note_ctor("_ZN3aaa9GG2232313E", this);} // tgen
}
static void Test__ZN3aaa9GG2232313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232313E, buf);
    ::aaa::GG2232313 *dp, &lv = *(dp=new (buf) ::aaa::GG2232313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232313E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2232313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2232313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2232313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232313E);
    dp->::aaa::GG2232313::~GG2232313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232313E(Test__ZN3aaa9GG2232313E, "_ZN3aaa9GG2232313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232313C1Ev();
extern void _ZN3aaa9GG2232313D1Ev();
Name_Map name_map__ZN3aaa9GG2232313E[] = {
  NSPAIR(_ZN3aaa9GG2232313C1Ev),
  NSPAIR(_ZN3aaa9GG2232313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2232313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232313E[];
extern void _ZN3aaa9GG22323133barEv();
extern void _ZN3aaa9GG22323133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22323133barEv,_ZThn8_N3aaa9GG22323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22323133barEv,_ZThn20_N3aaa9GG22323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22323133fooEv,_ZThn20_N3aaa9GG22323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323133fooEv,_ZThn28_N3aaa9GG22323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323133barEv,_ZThn28_N3aaa9GG22323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22323133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22323133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22323133barEv,_ZThn8_N3aaa9GG22323133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323133barEv,_ZThn20_N3aaa9GG22323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323133fooEv,_ZThn20_N3aaa9GG22323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323133fooEv,_ZThn28_N3aaa9GG22323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323133barEv,_ZThn28_N3aaa9GG22323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232313E[];
Class_Descriptor cd__ZN3aaa9GG2232313E = {  "_ZN3aaa9GG2232313E", // class name
  bases__ZN3aaa9GG2232313E, 6,
  &(vtc__ZN3aaa9GG2232313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232321  : ::aaa::EE223 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22323213fooEv
  ~GG2232321(); // tgen
  GG2232321(); // tgen
};
//SIG(1 _ZN3aaa9GG2232321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22323213fooEv");}
aaa::GG2232321 ::~GG2232321(){ note_dtor("_ZN3aaa9GG2232321E", this);} // tgen
aaa::GG2232321 ::GG2232321(){ note_ctor("_ZN3aaa9GG2232321E", this);} // tgen
}
static void Test__ZN3aaa9GG2232321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232321E, buf);
    ::aaa::GG2232321 *dp, &lv = *(dp=new (buf) ::aaa::GG2232321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232321E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2232321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2232321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2232321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232321E);
    dp->::aaa::GG2232321::~GG2232321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232321E(Test__ZN3aaa9GG2232321E, "_ZN3aaa9GG2232321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232321C1Ev();
extern void _ZN3aaa9GG2232321D1Ev();
Name_Map name_map__ZN3aaa9GG2232321E[] = {
  NSPAIR(_ZN3aaa9GG2232321C1Ev),
  NSPAIR(_ZN3aaa9GG2232321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2232321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232321E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22323213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22323213fooEv,_ZThn28_N3aaa9GG22323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22323213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323213fooEv,_ZThn28_N3aaa9GG22323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232321E[];
Class_Descriptor cd__ZN3aaa9GG2232321E = {  "_ZN3aaa9GG2232321E", // class name
  bases__ZN3aaa9GG2232321E, 6,
  &(vtc__ZN3aaa9GG2232321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232322  : ::aaa::EE223 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22323223barEv
  ~GG2232322(); // tgen
  GG2232322(); // tgen
};
//SIG(1 _ZN3aaa9GG2232322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22323223barEv");}
aaa::GG2232322 ::~GG2232322(){ note_dtor("_ZN3aaa9GG2232322E", this);} // tgen
aaa::GG2232322 ::GG2232322(){ note_ctor("_ZN3aaa9GG2232322E", this);} // tgen
}
static void Test__ZN3aaa9GG2232322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232322E, buf);
    ::aaa::GG2232322 *dp, &lv = *(dp=new (buf) ::aaa::GG2232322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232322E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2232322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2232322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2232322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232322E);
    dp->::aaa::GG2232322::~GG2232322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232322E(Test__ZN3aaa9GG2232322E, "_ZN3aaa9GG2232322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232322C1Ev();
extern void _ZN3aaa9GG2232322D1Ev();
Name_Map name_map__ZN3aaa9GG2232322E[] = {
  NSPAIR(_ZN3aaa9GG2232322C1Ev),
  NSPAIR(_ZN3aaa9GG2232322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2232322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232322E[];
extern void _ZN3aaa9GG22323223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22323223barEv,_ZThn8_N3aaa9GG22323223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22323223barEv,_ZThn20_N3aaa9GG22323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22323223barEv,_ZThn28_N3aaa9GG22323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22323223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22323223barEv,_ZThn8_N3aaa9GG22323223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323223barEv,_ZThn20_N3aaa9GG22323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323223barEv,_ZThn28_N3aaa9GG22323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232322E[];
Class_Descriptor cd__ZN3aaa9GG2232322E = {  "_ZN3aaa9GG2232322E", // class name
  bases__ZN3aaa9GG2232322E, 6,
  &(vtc__ZN3aaa9GG2232322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232323  : ::aaa::EE223 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22323233fooEv
  virtual void  bar(); // _ZN3aaa9GG22323233barEv
  ~GG2232323(); // tgen
  GG2232323(); // tgen
};
//SIG(1 _ZN3aaa9GG2232323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22323233fooEv");}
void  aaa::GG2232323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22323233barEv");}
aaa::GG2232323 ::~GG2232323(){ note_dtor("_ZN3aaa9GG2232323E", this);} // tgen
aaa::GG2232323 ::GG2232323(){ note_ctor("_ZN3aaa9GG2232323E", this);} // tgen
}
static void Test__ZN3aaa9GG2232323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232323E, buf);
    ::aaa::GG2232323 *dp, &lv = *(dp=new (buf) ::aaa::GG2232323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232323E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2232323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2232323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2232323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232323E);
    dp->::aaa::GG2232323::~GG2232323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232323E(Test__ZN3aaa9GG2232323E, "_ZN3aaa9GG2232323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232323C1Ev();
extern void _ZN3aaa9GG2232323D1Ev();
Name_Map name_map__ZN3aaa9GG2232323E[] = {
  NSPAIR(_ZN3aaa9GG2232323C1Ev),
  NSPAIR(_ZN3aaa9GG2232323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2232323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232323E[];
extern void _ZN3aaa9GG22323233barEv();
extern void _ZN3aaa9GG22323233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22323233barEv,_ZThn8_N3aaa9GG22323233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22323233barEv,_ZThn20_N3aaa9GG22323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323233fooEv,_ZThn28_N3aaa9GG22323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323233barEv,_ZThn28_N3aaa9GG22323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22323233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22323233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22323233barEv,_ZThn8_N3aaa9GG22323233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323233barEv,_ZThn20_N3aaa9GG22323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323233fooEv,_ZThn28_N3aaa9GG22323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323233barEv,_ZThn28_N3aaa9GG22323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232323E[];
Class_Descriptor cd__ZN3aaa9GG2232323E = {  "_ZN3aaa9GG2232323E", // class name
  bases__ZN3aaa9GG2232323E, 6,
  &(vtc__ZN3aaa9GG2232323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232331  : ::aaa::EE223 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22323313fooEv
  ~GG2232331(); // tgen
  GG2232331(); // tgen
};
//SIG(1 _ZN3aaa9GG2232331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22323313fooEv");}
aaa::GG2232331 ::~GG2232331(){ note_dtor("_ZN3aaa9GG2232331E", this);} // tgen
aaa::GG2232331 ::GG2232331(){ note_ctor("_ZN3aaa9GG2232331E", this);} // tgen
}
static void Test__ZN3aaa9GG2232331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232331E, buf);
    ::aaa::GG2232331 *dp, &lv = *(dp=new (buf) ::aaa::GG2232331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232331E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2232331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2232331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2232331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232331E);
    dp->::aaa::GG2232331::~GG2232331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232331E(Test__ZN3aaa9GG2232331E, "_ZN3aaa9GG2232331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232331C1Ev();
extern void _ZN3aaa9GG2232331D1Ev();
Name_Map name_map__ZN3aaa9GG2232331E[] = {
  NSPAIR(_ZN3aaa9GG2232331C1Ev),
  NSPAIR(_ZN3aaa9GG2232331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2232331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232331E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22323313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22323313fooEv,_ZThn20_N3aaa9GG22323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323313fooEv,_ZThn28_N3aaa9GG22323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22323313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323313fooEv,_ZThn20_N3aaa9GG22323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323313fooEv,_ZThn28_N3aaa9GG22323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232331E[];
Class_Descriptor cd__ZN3aaa9GG2232331E = {  "_ZN3aaa9GG2232331E", // class name
  bases__ZN3aaa9GG2232331E, 6,
  &(vtc__ZN3aaa9GG2232331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232332  : ::aaa::EE223 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22323323barEv
  ~GG2232332(); // tgen
  GG2232332(); // tgen
};
//SIG(1 _ZN3aaa9GG2232332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2232332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22323323barEv");}
aaa::GG2232332 ::~GG2232332(){ note_dtor("_ZN3aaa9GG2232332E", this);} // tgen
aaa::GG2232332 ::GG2232332(){ note_ctor("_ZN3aaa9GG2232332E", this);} // tgen
}
static void Test__ZN3aaa9GG2232332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232332E, buf);
    ::aaa::GG2232332 *dp, &lv = *(dp=new (buf) ::aaa::GG2232332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232332E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2232332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2232332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2232332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232332E);
    dp->::aaa::GG2232332::~GG2232332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232332E(Test__ZN3aaa9GG2232332E, "_ZN3aaa9GG2232332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232332C1Ev();
extern void _ZN3aaa9GG2232332D1Ev();
Name_Map name_map__ZN3aaa9GG2232332E[] = {
  NSPAIR(_ZN3aaa9GG2232332C1Ev),
  NSPAIR(_ZN3aaa9GG2232332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2232332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232332E[];
extern void _ZN3aaa9GG22323323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22323323barEv,_ZThn8_N3aaa9GG22323323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22323323barEv,_ZThn20_N3aaa9GG22323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323323barEv,_ZThn28_N3aaa9GG22323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22323323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22323323barEv,_ZThn8_N3aaa9GG22323323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323323barEv,_ZThn20_N3aaa9GG22323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323323barEv,_ZThn28_N3aaa9GG22323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232332E[];
Class_Descriptor cd__ZN3aaa9GG2232332E = {  "_ZN3aaa9GG2232332E", // class name
  bases__ZN3aaa9GG2232332E, 6,
  &(vtc__ZN3aaa9GG2232332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2232333  : ::aaa::EE223 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22323333fooEv
  virtual void  bar(); // _ZN3aaa9GG22323333barEv
  ~GG2232333(); // tgen
  GG2232333(); // tgen
};
//SIG(1 _ZN3aaa9GG2232333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2232333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22323333fooEv");}
void  aaa::GG2232333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22323333barEv");}
aaa::GG2232333 ::~GG2232333(){ note_dtor("_ZN3aaa9GG2232333E", this);} // tgen
aaa::GG2232333 ::GG2232333(){ note_ctor("_ZN3aaa9GG2232333E", this);} // tgen
}
static void Test__ZN3aaa9GG2232333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2232333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2232333E, buf);
    ::aaa::GG2232333 *dp, &lv = *(dp=new (buf) ::aaa::GG2232333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2232333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2232333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2232333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2232333E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2232333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2232333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2232333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2232333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2232333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2232333E);
    dp->::aaa::GG2232333::~GG2232333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2232333E(Test__ZN3aaa9GG2232333E, "_ZN3aaa9GG2232333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2232333C1Ev();
extern void _ZN3aaa9GG2232333D1Ev();
Name_Map name_map__ZN3aaa9GG2232333E[] = {
  NSPAIR(_ZN3aaa9GG2232333C1Ev),
  NSPAIR(_ZN3aaa9GG2232333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2232333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2232333E[];
extern void _ZN3aaa9GG22323333barEv();
extern void _ZN3aaa9GG22323333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22323333barEv,_ZThn8_N3aaa9GG22323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22323333barEv,_ZThn20_N3aaa9GG22323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22323333fooEv,_ZThn20_N3aaa9GG22323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323333fooEv,_ZThn28_N3aaa9GG22323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22323333barEv,_ZThn28_N3aaa9GG22323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2232333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22323333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22323333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22323333barEv,_ZThn8_N3aaa9GG22323333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323333barEv,_ZThn20_N3aaa9GG22323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22323333fooEv,_ZThn20_N3aaa9GG22323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323333fooEv,_ZThn28_N3aaa9GG22323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22323333barEv,_ZThn28_N3aaa9GG22323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2232333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2232333E[];
Class_Descriptor cd__ZN3aaa9GG2232333E = {  "_ZN3aaa9GG2232333E", // class name
  bases__ZN3aaa9GG2232333E, 6,
  &(vtc__ZN3aaa9GG2232333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2232333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2232333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233111  : ::aaa::EE223 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22331113fooEv
  ~GG2233111(); // tgen
  GG2233111(); // tgen
};
//SIG(1 _ZN3aaa9GG2233111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233111 ::foo(){vfunc_called(this, "_ZN3aaa9GG22331113fooEv");}
aaa::GG2233111 ::~GG2233111(){ note_dtor("_ZN3aaa9GG2233111E", this);} // tgen
aaa::GG2233111 ::GG2233111(){ note_ctor("_ZN3aaa9GG2233111E", this);} // tgen
}
static void Test__ZN3aaa9GG2233111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233111E, buf);
    ::aaa::GG2233111 *dp, &lv = *(dp=new (buf) ::aaa::GG2233111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233111E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2233111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2233111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2233111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233111E);
    dp->::aaa::GG2233111::~GG2233111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233111E(Test__ZN3aaa9GG2233111E, "_ZN3aaa9GG2233111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233111C1Ev();
extern void _ZN3aaa9GG2233111D1Ev();
Name_Map name_map__ZN3aaa9GG2233111E[] = {
  NSPAIR(_ZN3aaa9GG2233111C1Ev),
  NSPAIR(_ZN3aaa9GG2233111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2233111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233111E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22331113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331113fooEv,_ZThn20_N3aaa9GG22331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22331113fooEv,_ZThn28_N3aaa9GG22331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22331113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331113fooEv,_ZThn20_N3aaa9GG22331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22331113fooEv,_ZThn28_N3aaa9GG22331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233111E[];
Class_Descriptor cd__ZN3aaa9GG2233111E = {  "_ZN3aaa9GG2233111E", // class name
  bases__ZN3aaa9GG2233111E, 6,
  &(vtc__ZN3aaa9GG2233111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233112  : ::aaa::EE223 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22331123barEv
  ~GG2233112(); // tgen
  GG2233112(); // tgen
};
//SIG(1 _ZN3aaa9GG2233112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233112 ::bar(){vfunc_called(this, "_ZN3aaa9GG22331123barEv");}
aaa::GG2233112 ::~GG2233112(){ note_dtor("_ZN3aaa9GG2233112E", this);} // tgen
aaa::GG2233112 ::GG2233112(){ note_ctor("_ZN3aaa9GG2233112E", this);} // tgen
}
static void Test__ZN3aaa9GG2233112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233112E, buf);
    ::aaa::GG2233112 *dp, &lv = *(dp=new (buf) ::aaa::GG2233112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233112E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2233112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2233112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2233112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233112E);
    dp->::aaa::GG2233112::~GG2233112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233112E(Test__ZN3aaa9GG2233112E, "_ZN3aaa9GG2233112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233112C1Ev();
extern void _ZN3aaa9GG2233112D1Ev();
Name_Map name_map__ZN3aaa9GG2233112E[] = {
  NSPAIR(_ZN3aaa9GG2233112C1Ev),
  NSPAIR(_ZN3aaa9GG2233112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2233112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233112E[];
extern void _ZN3aaa9GG22331123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22331123barEv,_ZThn8_N3aaa9GG22331123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22331123barEv,_ZThn20_N3aaa9GG22331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22331123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22331123barEv,_ZThn8_N3aaa9GG22331123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331123barEv,_ZThn20_N3aaa9GG22331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233112E[];
Class_Descriptor cd__ZN3aaa9GG2233112E = {  "_ZN3aaa9GG2233112E", // class name
  bases__ZN3aaa9GG2233112E, 6,
  &(vtc__ZN3aaa9GG2233112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233113  : ::aaa::EE223 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22331133fooEv
  virtual void  bar(); // _ZN3aaa9GG22331133barEv
  ~GG2233113(); // tgen
  GG2233113(); // tgen
};
//SIG(1 _ZN3aaa9GG2233113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233113 ::foo(){vfunc_called(this, "_ZN3aaa9GG22331133fooEv");}
void  aaa::GG2233113 ::bar(){vfunc_called(this, "_ZN3aaa9GG22331133barEv");}
aaa::GG2233113 ::~GG2233113(){ note_dtor("_ZN3aaa9GG2233113E", this);} // tgen
aaa::GG2233113 ::GG2233113(){ note_ctor("_ZN3aaa9GG2233113E", this);} // tgen
}
static void Test__ZN3aaa9GG2233113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233113E, buf);
    ::aaa::GG2233113 *dp, &lv = *(dp=new (buf) ::aaa::GG2233113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233113E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2233113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2233113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2233113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233113E);
    dp->::aaa::GG2233113::~GG2233113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233113E(Test__ZN3aaa9GG2233113E, "_ZN3aaa9GG2233113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233113C1Ev();
extern void _ZN3aaa9GG2233113D1Ev();
Name_Map name_map__ZN3aaa9GG2233113E[] = {
  NSPAIR(_ZN3aaa9GG2233113C1Ev),
  NSPAIR(_ZN3aaa9GG2233113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2233113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233113E[];
extern void _ZN3aaa9GG22331133barEv();
extern void _ZN3aaa9GG22331133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22331133barEv,_ZThn8_N3aaa9GG22331133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331133fooEv,_ZThn20_N3aaa9GG22331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331133barEv,_ZThn20_N3aaa9GG22331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22331133fooEv,_ZThn28_N3aaa9GG22331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22331133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22331133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22331133barEv,_ZThn8_N3aaa9GG22331133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331133fooEv,_ZThn20_N3aaa9GG22331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331133barEv,_ZThn20_N3aaa9GG22331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22331133fooEv,_ZThn28_N3aaa9GG22331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233113E[];
Class_Descriptor cd__ZN3aaa9GG2233113E = {  "_ZN3aaa9GG2233113E", // class name
  bases__ZN3aaa9GG2233113E, 6,
  &(vtc__ZN3aaa9GG2233113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233121  : ::aaa::EE223 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22331213fooEv
  ~GG2233121(); // tgen
  GG2233121(); // tgen
};
//SIG(1 _ZN3aaa9GG2233121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233121 ::foo(){vfunc_called(this, "_ZN3aaa9GG22331213fooEv");}
aaa::GG2233121 ::~GG2233121(){ note_dtor("_ZN3aaa9GG2233121E", this);} // tgen
aaa::GG2233121 ::GG2233121(){ note_ctor("_ZN3aaa9GG2233121E", this);} // tgen
}
static void Test__ZN3aaa9GG2233121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233121E, buf);
    ::aaa::GG2233121 *dp, &lv = *(dp=new (buf) ::aaa::GG2233121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233121E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2233121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2233121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2233121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233121E);
    dp->::aaa::GG2233121::~GG2233121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233121E(Test__ZN3aaa9GG2233121E, "_ZN3aaa9GG2233121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233121C1Ev();
extern void _ZN3aaa9GG2233121D1Ev();
Name_Map name_map__ZN3aaa9GG2233121E[] = {
  NSPAIR(_ZN3aaa9GG2233121C1Ev),
  NSPAIR(_ZN3aaa9GG2233121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2233121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233121E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22331213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331213fooEv,_ZThn20_N3aaa9GG22331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22331213fooEv,_ZThn28_N3aaa9GG22331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22331213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331213fooEv,_ZThn20_N3aaa9GG22331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22331213fooEv,_ZThn28_N3aaa9GG22331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233121E[];
Class_Descriptor cd__ZN3aaa9GG2233121E = {  "_ZN3aaa9GG2233121E", // class name
  bases__ZN3aaa9GG2233121E, 6,
  &(vtc__ZN3aaa9GG2233121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233122  : ::aaa::EE223 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22331223barEv
  ~GG2233122(); // tgen
  GG2233122(); // tgen
};
//SIG(1 _ZN3aaa9GG2233122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233122 ::bar(){vfunc_called(this, "_ZN3aaa9GG22331223barEv");}
aaa::GG2233122 ::~GG2233122(){ note_dtor("_ZN3aaa9GG2233122E", this);} // tgen
aaa::GG2233122 ::GG2233122(){ note_ctor("_ZN3aaa9GG2233122E", this);} // tgen
}
static void Test__ZN3aaa9GG2233122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233122E, buf);
    ::aaa::GG2233122 *dp, &lv = *(dp=new (buf) ::aaa::GG2233122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233122E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2233122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2233122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2233122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233122E);
    dp->::aaa::GG2233122::~GG2233122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233122E(Test__ZN3aaa9GG2233122E, "_ZN3aaa9GG2233122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233122C1Ev();
extern void _ZN3aaa9GG2233122D1Ev();
Name_Map name_map__ZN3aaa9GG2233122E[] = {
  NSPAIR(_ZN3aaa9GG2233122C1Ev),
  NSPAIR(_ZN3aaa9GG2233122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2233122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233122E[];
extern void _ZN3aaa9GG22331223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22331223barEv,_ZThn8_N3aaa9GG22331223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22331223barEv,_ZThn20_N3aaa9GG22331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22331223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22331223barEv,_ZThn8_N3aaa9GG22331223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331223barEv,_ZThn20_N3aaa9GG22331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233122E[];
Class_Descriptor cd__ZN3aaa9GG2233122E = {  "_ZN3aaa9GG2233122E", // class name
  bases__ZN3aaa9GG2233122E, 6,
  &(vtc__ZN3aaa9GG2233122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233123  : ::aaa::EE223 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22331233fooEv
  virtual void  bar(); // _ZN3aaa9GG22331233barEv
  ~GG2233123(); // tgen
  GG2233123(); // tgen
};
//SIG(1 _ZN3aaa9GG2233123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233123 ::foo(){vfunc_called(this, "_ZN3aaa9GG22331233fooEv");}
void  aaa::GG2233123 ::bar(){vfunc_called(this, "_ZN3aaa9GG22331233barEv");}
aaa::GG2233123 ::~GG2233123(){ note_dtor("_ZN3aaa9GG2233123E", this);} // tgen
aaa::GG2233123 ::GG2233123(){ note_ctor("_ZN3aaa9GG2233123E", this);} // tgen
}
static void Test__ZN3aaa9GG2233123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233123E, buf);
    ::aaa::GG2233123 *dp, &lv = *(dp=new (buf) ::aaa::GG2233123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233123E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2233123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2233123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2233123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233123E);
    dp->::aaa::GG2233123::~GG2233123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233123E(Test__ZN3aaa9GG2233123E, "_ZN3aaa9GG2233123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233123C1Ev();
extern void _ZN3aaa9GG2233123D1Ev();
Name_Map name_map__ZN3aaa9GG2233123E[] = {
  NSPAIR(_ZN3aaa9GG2233123C1Ev),
  NSPAIR(_ZN3aaa9GG2233123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2233123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233123E[];
extern void _ZN3aaa9GG22331233barEv();
extern void _ZN3aaa9GG22331233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22331233barEv,_ZThn8_N3aaa9GG22331233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331233fooEv,_ZThn20_N3aaa9GG22331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331233barEv,_ZThn20_N3aaa9GG22331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22331233fooEv,_ZThn28_N3aaa9GG22331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22331233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22331233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22331233barEv,_ZThn8_N3aaa9GG22331233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331233fooEv,_ZThn20_N3aaa9GG22331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331233barEv,_ZThn20_N3aaa9GG22331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22331233fooEv,_ZThn28_N3aaa9GG22331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233123E[];
Class_Descriptor cd__ZN3aaa9GG2233123E = {  "_ZN3aaa9GG2233123E", // class name
  bases__ZN3aaa9GG2233123E, 6,
  &(vtc__ZN3aaa9GG2233123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233131  : ::aaa::EE223 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22331313fooEv
  ~GG2233131(); // tgen
  GG2233131(); // tgen
};
//SIG(1 _ZN3aaa9GG2233131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233131 ::foo(){vfunc_called(this, "_ZN3aaa9GG22331313fooEv");}
aaa::GG2233131 ::~GG2233131(){ note_dtor("_ZN3aaa9GG2233131E", this);} // tgen
aaa::GG2233131 ::GG2233131(){ note_ctor("_ZN3aaa9GG2233131E", this);} // tgen
}
static void Test__ZN3aaa9GG2233131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233131E, buf);
    ::aaa::GG2233131 *dp, &lv = *(dp=new (buf) ::aaa::GG2233131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233131E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2233131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2233131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2233131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233131E);
    dp->::aaa::GG2233131::~GG2233131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233131E(Test__ZN3aaa9GG2233131E, "_ZN3aaa9GG2233131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233131C1Ev();
extern void _ZN3aaa9GG2233131D1Ev();
Name_Map name_map__ZN3aaa9GG2233131E[] = {
  NSPAIR(_ZN3aaa9GG2233131C1Ev),
  NSPAIR(_ZN3aaa9GG2233131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2233131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233131E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22331313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331313fooEv,_ZThn20_N3aaa9GG22331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22331313fooEv,_ZThn28_N3aaa9GG22331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22331313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331313fooEv,_ZThn20_N3aaa9GG22331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22331313fooEv,_ZThn28_N3aaa9GG22331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233131E[];
Class_Descriptor cd__ZN3aaa9GG2233131E = {  "_ZN3aaa9GG2233131E", // class name
  bases__ZN3aaa9GG2233131E, 6,
  &(vtc__ZN3aaa9GG2233131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233132  : ::aaa::EE223 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22331323barEv
  ~GG2233132(); // tgen
  GG2233132(); // tgen
};
//SIG(1 _ZN3aaa9GG2233132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233132 ::bar(){vfunc_called(this, "_ZN3aaa9GG22331323barEv");}
aaa::GG2233132 ::~GG2233132(){ note_dtor("_ZN3aaa9GG2233132E", this);} // tgen
aaa::GG2233132 ::GG2233132(){ note_ctor("_ZN3aaa9GG2233132E", this);} // tgen
}
static void Test__ZN3aaa9GG2233132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233132E, buf);
    ::aaa::GG2233132 *dp, &lv = *(dp=new (buf) ::aaa::GG2233132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233132E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2233132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2233132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2233132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233132E);
    dp->::aaa::GG2233132::~GG2233132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233132E(Test__ZN3aaa9GG2233132E, "_ZN3aaa9GG2233132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233132C1Ev();
extern void _ZN3aaa9GG2233132D1Ev();
Name_Map name_map__ZN3aaa9GG2233132E[] = {
  NSPAIR(_ZN3aaa9GG2233132C1Ev),
  NSPAIR(_ZN3aaa9GG2233132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2233132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233132E[];
extern void _ZN3aaa9GG22331323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22331323barEv,_ZThn8_N3aaa9GG22331323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22331323barEv,_ZThn20_N3aaa9GG22331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22331323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22331323barEv,_ZThn8_N3aaa9GG22331323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331323barEv,_ZThn20_N3aaa9GG22331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233132E[];
Class_Descriptor cd__ZN3aaa9GG2233132E = {  "_ZN3aaa9GG2233132E", // class name
  bases__ZN3aaa9GG2233132E, 6,
  &(vtc__ZN3aaa9GG2233132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233133  : ::aaa::EE223 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22331333fooEv
  virtual void  bar(); // _ZN3aaa9GG22331333barEv
  ~GG2233133(); // tgen
  GG2233133(); // tgen
};
//SIG(1 _ZN3aaa9GG2233133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233133 ::foo(){vfunc_called(this, "_ZN3aaa9GG22331333fooEv");}
void  aaa::GG2233133 ::bar(){vfunc_called(this, "_ZN3aaa9GG22331333barEv");}
aaa::GG2233133 ::~GG2233133(){ note_dtor("_ZN3aaa9GG2233133E", this);} // tgen
aaa::GG2233133 ::GG2233133(){ note_ctor("_ZN3aaa9GG2233133E", this);} // tgen
}
static void Test__ZN3aaa9GG2233133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233133E, buf);
    ::aaa::GG2233133 *dp, &lv = *(dp=new (buf) ::aaa::GG2233133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233133E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2233133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2233133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2233133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233133E);
    dp->::aaa::GG2233133::~GG2233133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233133E(Test__ZN3aaa9GG2233133E, "_ZN3aaa9GG2233133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233133C1Ev();
extern void _ZN3aaa9GG2233133D1Ev();
Name_Map name_map__ZN3aaa9GG2233133E[] = {
  NSPAIR(_ZN3aaa9GG2233133C1Ev),
  NSPAIR(_ZN3aaa9GG2233133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2233133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233133E[];
extern void _ZN3aaa9GG22331333barEv();
extern void _ZN3aaa9GG22331333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22331333barEv,_ZThn8_N3aaa9GG22331333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331333fooEv,_ZThn20_N3aaa9GG22331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22331333barEv,_ZThn20_N3aaa9GG22331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22331333fooEv,_ZThn28_N3aaa9GG22331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22331333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22331333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22331333barEv,_ZThn8_N3aaa9GG22331333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331333fooEv,_ZThn20_N3aaa9GG22331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22331333barEv,_ZThn20_N3aaa9GG22331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22331333fooEv,_ZThn28_N3aaa9GG22331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233133E[];
Class_Descriptor cd__ZN3aaa9GG2233133E = {  "_ZN3aaa9GG2233133E", // class name
  bases__ZN3aaa9GG2233133E, 6,
  &(vtc__ZN3aaa9GG2233133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233211  : ::aaa::EE223 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22332113fooEv
  ~GG2233211(); // tgen
  GG2233211(); // tgen
};
//SIG(1 _ZN3aaa9GG2233211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233211 ::foo(){vfunc_called(this, "_ZN3aaa9GG22332113fooEv");}
aaa::GG2233211 ::~GG2233211(){ note_dtor("_ZN3aaa9GG2233211E", this);} // tgen
aaa::GG2233211 ::GG2233211(){ note_ctor("_ZN3aaa9GG2233211E", this);} // tgen
}
static void Test__ZN3aaa9GG2233211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233211E, buf);
    ::aaa::GG2233211 *dp, &lv = *(dp=new (buf) ::aaa::GG2233211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233211E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2233211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2233211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2233211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233211E);
    dp->::aaa::GG2233211::~GG2233211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233211E(Test__ZN3aaa9GG2233211E, "_ZN3aaa9GG2233211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233211C1Ev();
extern void _ZN3aaa9GG2233211D1Ev();
Name_Map name_map__ZN3aaa9GG2233211E[] = {
  NSPAIR(_ZN3aaa9GG2233211C1Ev),
  NSPAIR(_ZN3aaa9GG2233211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2233211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233211E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22332113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332113fooEv,_ZThn20_N3aaa9GG22332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22332113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332113fooEv,_ZThn20_N3aaa9GG22332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233211E[];
Class_Descriptor cd__ZN3aaa9GG2233211E = {  "_ZN3aaa9GG2233211E", // class name
  bases__ZN3aaa9GG2233211E, 6,
  &(vtc__ZN3aaa9GG2233211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233212  : ::aaa::EE223 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22332123barEv
  ~GG2233212(); // tgen
  GG2233212(); // tgen
};
//SIG(1 _ZN3aaa9GG2233212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233212 ::bar(){vfunc_called(this, "_ZN3aaa9GG22332123barEv");}
aaa::GG2233212 ::~GG2233212(){ note_dtor("_ZN3aaa9GG2233212E", this);} // tgen
aaa::GG2233212 ::GG2233212(){ note_ctor("_ZN3aaa9GG2233212E", this);} // tgen
}
static void Test__ZN3aaa9GG2233212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233212E, buf);
    ::aaa::GG2233212 *dp, &lv = *(dp=new (buf) ::aaa::GG2233212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233212E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2233212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2233212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2233212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233212E);
    dp->::aaa::GG2233212::~GG2233212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233212E(Test__ZN3aaa9GG2233212E, "_ZN3aaa9GG2233212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233212C1Ev();
extern void _ZN3aaa9GG2233212D1Ev();
Name_Map name_map__ZN3aaa9GG2233212E[] = {
  NSPAIR(_ZN3aaa9GG2233212C1Ev),
  NSPAIR(_ZN3aaa9GG2233212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2233212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233212E[];
extern void _ZN3aaa9GG22332123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22332123barEv,_ZThn8_N3aaa9GG22332123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22332123barEv,_ZThn20_N3aaa9GG22332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22332123barEv,_ZThn28_N3aaa9GG22332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22332123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22332123barEv,_ZThn8_N3aaa9GG22332123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332123barEv,_ZThn20_N3aaa9GG22332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22332123barEv,_ZThn28_N3aaa9GG22332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233212E[];
Class_Descriptor cd__ZN3aaa9GG2233212E = {  "_ZN3aaa9GG2233212E", // class name
  bases__ZN3aaa9GG2233212E, 6,
  &(vtc__ZN3aaa9GG2233212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233213  : ::aaa::EE223 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22332133fooEv
  virtual void  bar(); // _ZN3aaa9GG22332133barEv
  ~GG2233213(); // tgen
  GG2233213(); // tgen
};
//SIG(1 _ZN3aaa9GG2233213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233213 ::foo(){vfunc_called(this, "_ZN3aaa9GG22332133fooEv");}
void  aaa::GG2233213 ::bar(){vfunc_called(this, "_ZN3aaa9GG22332133barEv");}
aaa::GG2233213 ::~GG2233213(){ note_dtor("_ZN3aaa9GG2233213E", this);} // tgen
aaa::GG2233213 ::GG2233213(){ note_ctor("_ZN3aaa9GG2233213E", this);} // tgen
}
static void Test__ZN3aaa9GG2233213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233213E, buf);
    ::aaa::GG2233213 *dp, &lv = *(dp=new (buf) ::aaa::GG2233213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233213E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2233213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2233213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2233213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233213E);
    dp->::aaa::GG2233213::~GG2233213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233213E(Test__ZN3aaa9GG2233213E, "_ZN3aaa9GG2233213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233213C1Ev();
extern void _ZN3aaa9GG2233213D1Ev();
Name_Map name_map__ZN3aaa9GG2233213E[] = {
  NSPAIR(_ZN3aaa9GG2233213C1Ev),
  NSPAIR(_ZN3aaa9GG2233213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2233213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233213E[];
extern void _ZN3aaa9GG22332133barEv();
extern void _ZN3aaa9GG22332133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22332133barEv,_ZThn8_N3aaa9GG22332133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332133fooEv,_ZThn20_N3aaa9GG22332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332133barEv,_ZThn20_N3aaa9GG22332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22332133barEv,_ZThn28_N3aaa9GG22332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22332133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22332133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22332133barEv,_ZThn8_N3aaa9GG22332133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332133fooEv,_ZThn20_N3aaa9GG22332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332133barEv,_ZThn20_N3aaa9GG22332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22332133barEv,_ZThn28_N3aaa9GG22332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233213E[];
Class_Descriptor cd__ZN3aaa9GG2233213E = {  "_ZN3aaa9GG2233213E", // class name
  bases__ZN3aaa9GG2233213E, 6,
  &(vtc__ZN3aaa9GG2233213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233221  : ::aaa::EE223 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22332213fooEv
  ~GG2233221(); // tgen
  GG2233221(); // tgen
};
//SIG(1 _ZN3aaa9GG2233221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233221 ::foo(){vfunc_called(this, "_ZN3aaa9GG22332213fooEv");}
aaa::GG2233221 ::~GG2233221(){ note_dtor("_ZN3aaa9GG2233221E", this);} // tgen
aaa::GG2233221 ::GG2233221(){ note_ctor("_ZN3aaa9GG2233221E", this);} // tgen
}
static void Test__ZN3aaa9GG2233221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233221E, buf);
    ::aaa::GG2233221 *dp, &lv = *(dp=new (buf) ::aaa::GG2233221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233221E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2233221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2233221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2233221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233221E);
    dp->::aaa::GG2233221::~GG2233221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233221E(Test__ZN3aaa9GG2233221E, "_ZN3aaa9GG2233221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233221C1Ev();
extern void _ZN3aaa9GG2233221D1Ev();
Name_Map name_map__ZN3aaa9GG2233221E[] = {
  NSPAIR(_ZN3aaa9GG2233221C1Ev),
  NSPAIR(_ZN3aaa9GG2233221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2233221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233221E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22332213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332213fooEv,_ZThn20_N3aaa9GG22332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22332213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332213fooEv,_ZThn20_N3aaa9GG22332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233221E[];
Class_Descriptor cd__ZN3aaa9GG2233221E = {  "_ZN3aaa9GG2233221E", // class name
  bases__ZN3aaa9GG2233221E, 6,
  &(vtc__ZN3aaa9GG2233221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233222  : ::aaa::EE223 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22332223barEv
  ~GG2233222(); // tgen
  GG2233222(); // tgen
};
//SIG(1 _ZN3aaa9GG2233222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233222 ::bar(){vfunc_called(this, "_ZN3aaa9GG22332223barEv");}
aaa::GG2233222 ::~GG2233222(){ note_dtor("_ZN3aaa9GG2233222E", this);} // tgen
aaa::GG2233222 ::GG2233222(){ note_ctor("_ZN3aaa9GG2233222E", this);} // tgen
}
static void Test__ZN3aaa9GG2233222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233222E, buf);
    ::aaa::GG2233222 *dp, &lv = *(dp=new (buf) ::aaa::GG2233222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233222E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2233222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2233222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2233222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233222E);
    dp->::aaa::GG2233222::~GG2233222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233222E(Test__ZN3aaa9GG2233222E, "_ZN3aaa9GG2233222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233222C1Ev();
extern void _ZN3aaa9GG2233222D1Ev();
Name_Map name_map__ZN3aaa9GG2233222E[] = {
  NSPAIR(_ZN3aaa9GG2233222C1Ev),
  NSPAIR(_ZN3aaa9GG2233222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2233222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233222E[];
extern void _ZN3aaa9GG22332223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22332223barEv,_ZThn8_N3aaa9GG22332223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22332223barEv,_ZThn20_N3aaa9GG22332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22332223barEv,_ZThn28_N3aaa9GG22332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22332223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22332223barEv,_ZThn8_N3aaa9GG22332223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332223barEv,_ZThn20_N3aaa9GG22332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22332223barEv,_ZThn28_N3aaa9GG22332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233222E[];
Class_Descriptor cd__ZN3aaa9GG2233222E = {  "_ZN3aaa9GG2233222E", // class name
  bases__ZN3aaa9GG2233222E, 6,
  &(vtc__ZN3aaa9GG2233222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233223  : ::aaa::EE223 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22332233fooEv
  virtual void  bar(); // _ZN3aaa9GG22332233barEv
  ~GG2233223(); // tgen
  GG2233223(); // tgen
};
//SIG(1 _ZN3aaa9GG2233223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233223 ::foo(){vfunc_called(this, "_ZN3aaa9GG22332233fooEv");}
void  aaa::GG2233223 ::bar(){vfunc_called(this, "_ZN3aaa9GG22332233barEv");}
aaa::GG2233223 ::~GG2233223(){ note_dtor("_ZN3aaa9GG2233223E", this);} // tgen
aaa::GG2233223 ::GG2233223(){ note_ctor("_ZN3aaa9GG2233223E", this);} // tgen
}
static void Test__ZN3aaa9GG2233223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233223E, buf);
    ::aaa::GG2233223 *dp, &lv = *(dp=new (buf) ::aaa::GG2233223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233223E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2233223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2233223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2233223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233223E);
    dp->::aaa::GG2233223::~GG2233223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233223E(Test__ZN3aaa9GG2233223E, "_ZN3aaa9GG2233223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233223C1Ev();
extern void _ZN3aaa9GG2233223D1Ev();
Name_Map name_map__ZN3aaa9GG2233223E[] = {
  NSPAIR(_ZN3aaa9GG2233223C1Ev),
  NSPAIR(_ZN3aaa9GG2233223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2233223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233223E[];
extern void _ZN3aaa9GG22332233barEv();
extern void _ZN3aaa9GG22332233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22332233barEv,_ZThn8_N3aaa9GG22332233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332233fooEv,_ZThn20_N3aaa9GG22332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332233barEv,_ZThn20_N3aaa9GG22332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22332233barEv,_ZThn28_N3aaa9GG22332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22332233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22332233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22332233barEv,_ZThn8_N3aaa9GG22332233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332233fooEv,_ZThn20_N3aaa9GG22332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332233barEv,_ZThn20_N3aaa9GG22332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22332233barEv,_ZThn28_N3aaa9GG22332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233223E[];
Class_Descriptor cd__ZN3aaa9GG2233223E = {  "_ZN3aaa9GG2233223E", // class name
  bases__ZN3aaa9GG2233223E, 6,
  &(vtc__ZN3aaa9GG2233223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233231  : ::aaa::EE223 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22332313fooEv
  ~GG2233231(); // tgen
  GG2233231(); // tgen
};
//SIG(1 _ZN3aaa9GG2233231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233231 ::foo(){vfunc_called(this, "_ZN3aaa9GG22332313fooEv");}
aaa::GG2233231 ::~GG2233231(){ note_dtor("_ZN3aaa9GG2233231E", this);} // tgen
aaa::GG2233231 ::GG2233231(){ note_ctor("_ZN3aaa9GG2233231E", this);} // tgen
}
static void Test__ZN3aaa9GG2233231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233231E, buf);
    ::aaa::GG2233231 *dp, &lv = *(dp=new (buf) ::aaa::GG2233231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233231E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2233231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2233231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2233231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233231E);
    dp->::aaa::GG2233231::~GG2233231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233231E(Test__ZN3aaa9GG2233231E, "_ZN3aaa9GG2233231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233231C1Ev();
extern void _ZN3aaa9GG2233231D1Ev();
Name_Map name_map__ZN3aaa9GG2233231E[] = {
  NSPAIR(_ZN3aaa9GG2233231C1Ev),
  NSPAIR(_ZN3aaa9GG2233231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2233231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233231E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22332313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332313fooEv,_ZThn20_N3aaa9GG22332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22332313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332313fooEv,_ZThn20_N3aaa9GG22332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233231E[];
Class_Descriptor cd__ZN3aaa9GG2233231E = {  "_ZN3aaa9GG2233231E", // class name
  bases__ZN3aaa9GG2233231E, 6,
  &(vtc__ZN3aaa9GG2233231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233232  : ::aaa::EE223 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22332323barEv
  ~GG2233232(); // tgen
  GG2233232(); // tgen
};
//SIG(1 _ZN3aaa9GG2233232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233232 ::bar(){vfunc_called(this, "_ZN3aaa9GG22332323barEv");}
aaa::GG2233232 ::~GG2233232(){ note_dtor("_ZN3aaa9GG2233232E", this);} // tgen
aaa::GG2233232 ::GG2233232(){ note_ctor("_ZN3aaa9GG2233232E", this);} // tgen
}
static void Test__ZN3aaa9GG2233232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233232E, buf);
    ::aaa::GG2233232 *dp, &lv = *(dp=new (buf) ::aaa::GG2233232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233232E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2233232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2233232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2233232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233232E);
    dp->::aaa::GG2233232::~GG2233232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233232E(Test__ZN3aaa9GG2233232E, "_ZN3aaa9GG2233232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233232C1Ev();
extern void _ZN3aaa9GG2233232D1Ev();
Name_Map name_map__ZN3aaa9GG2233232E[] = {
  NSPAIR(_ZN3aaa9GG2233232C1Ev),
  NSPAIR(_ZN3aaa9GG2233232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2233232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233232E[];
extern void _ZN3aaa9GG22332323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22332323barEv,_ZThn8_N3aaa9GG22332323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22332323barEv,_ZThn20_N3aaa9GG22332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22332323barEv,_ZThn28_N3aaa9GG22332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22332323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22332323barEv,_ZThn8_N3aaa9GG22332323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332323barEv,_ZThn20_N3aaa9GG22332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22332323barEv,_ZThn28_N3aaa9GG22332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233232E[];
Class_Descriptor cd__ZN3aaa9GG2233232E = {  "_ZN3aaa9GG2233232E", // class name
  bases__ZN3aaa9GG2233232E, 6,
  &(vtc__ZN3aaa9GG2233232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233233  : ::aaa::EE223 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22332333fooEv
  virtual void  bar(); // _ZN3aaa9GG22332333barEv
  ~GG2233233(); // tgen
  GG2233233(); // tgen
};
//SIG(1 _ZN3aaa9GG2233233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233233 ::foo(){vfunc_called(this, "_ZN3aaa9GG22332333fooEv");}
void  aaa::GG2233233 ::bar(){vfunc_called(this, "_ZN3aaa9GG22332333barEv");}
aaa::GG2233233 ::~GG2233233(){ note_dtor("_ZN3aaa9GG2233233E", this);} // tgen
aaa::GG2233233 ::GG2233233(){ note_ctor("_ZN3aaa9GG2233233E", this);} // tgen
}
static void Test__ZN3aaa9GG2233233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233233E, buf);
    ::aaa::GG2233233 *dp, &lv = *(dp=new (buf) ::aaa::GG2233233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233233E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2233233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2233233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2233233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233233E);
    dp->::aaa::GG2233233::~GG2233233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233233E(Test__ZN3aaa9GG2233233E, "_ZN3aaa9GG2233233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233233C1Ev();
extern void _ZN3aaa9GG2233233D1Ev();
Name_Map name_map__ZN3aaa9GG2233233E[] = {
  NSPAIR(_ZN3aaa9GG2233233C1Ev),
  NSPAIR(_ZN3aaa9GG2233233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2233233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233233E[];
extern void _ZN3aaa9GG22332333barEv();
extern void _ZN3aaa9GG22332333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22332333barEv,_ZThn8_N3aaa9GG22332333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332333fooEv,_ZThn20_N3aaa9GG22332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22332333barEv,_ZThn20_N3aaa9GG22332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22332333barEv,_ZThn28_N3aaa9GG22332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22332333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22332333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22332333barEv,_ZThn8_N3aaa9GG22332333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332333fooEv,_ZThn20_N3aaa9GG22332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22332333barEv,_ZThn20_N3aaa9GG22332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22332333barEv,_ZThn28_N3aaa9GG22332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233233E[];
Class_Descriptor cd__ZN3aaa9GG2233233E = {  "_ZN3aaa9GG2233233E", // class name
  bases__ZN3aaa9GG2233233E, 6,
  &(vtc__ZN3aaa9GG2233233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233311  : ::aaa::EE223 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22333113fooEv
  ~GG2233311(); // tgen
  GG2233311(); // tgen
};
//SIG(1 _ZN3aaa9GG2233311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233311 ::foo(){vfunc_called(this, "_ZN3aaa9GG22333113fooEv");}
aaa::GG2233311 ::~GG2233311(){ note_dtor("_ZN3aaa9GG2233311E", this);} // tgen
aaa::GG2233311 ::GG2233311(){ note_ctor("_ZN3aaa9GG2233311E", this);} // tgen
}
static void Test__ZN3aaa9GG2233311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233311E, buf);
    ::aaa::GG2233311 *dp, &lv = *(dp=new (buf) ::aaa::GG2233311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233311E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2233311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2233311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2233311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233311E);
    dp->::aaa::GG2233311::~GG2233311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233311E(Test__ZN3aaa9GG2233311E, "_ZN3aaa9GG2233311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233311C1Ev();
extern void _ZN3aaa9GG2233311D1Ev();
Name_Map name_map__ZN3aaa9GG2233311E[] = {
  NSPAIR(_ZN3aaa9GG2233311C1Ev),
  NSPAIR(_ZN3aaa9GG2233311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2233311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233311E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22333113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333113fooEv,_ZThn20_N3aaa9GG22333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22333113fooEv,_ZThn28_N3aaa9GG22333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22333113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333113fooEv,_ZThn20_N3aaa9GG22333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333113fooEv,_ZThn28_N3aaa9GG22333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233311E[];
Class_Descriptor cd__ZN3aaa9GG2233311E = {  "_ZN3aaa9GG2233311E", // class name
  bases__ZN3aaa9GG2233311E, 6,
  &(vtc__ZN3aaa9GG2233311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233312  : ::aaa::EE223 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22333123barEv
  ~GG2233312(); // tgen
  GG2233312(); // tgen
};
//SIG(1 _ZN3aaa9GG2233312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233312 ::bar(){vfunc_called(this, "_ZN3aaa9GG22333123barEv");}
aaa::GG2233312 ::~GG2233312(){ note_dtor("_ZN3aaa9GG2233312E", this);} // tgen
aaa::GG2233312 ::GG2233312(){ note_ctor("_ZN3aaa9GG2233312E", this);} // tgen
}
static void Test__ZN3aaa9GG2233312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233312E, buf);
    ::aaa::GG2233312 *dp, &lv = *(dp=new (buf) ::aaa::GG2233312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233312E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2233312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2233312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2233312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233312E);
    dp->::aaa::GG2233312::~GG2233312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233312E(Test__ZN3aaa9GG2233312E, "_ZN3aaa9GG2233312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233312C1Ev();
extern void _ZN3aaa9GG2233312D1Ev();
Name_Map name_map__ZN3aaa9GG2233312E[] = {
  NSPAIR(_ZN3aaa9GG2233312C1Ev),
  NSPAIR(_ZN3aaa9GG2233312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2233312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233312E[];
extern void _ZN3aaa9GG22333123barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22333123barEv,_ZThn8_N3aaa9GG22333123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22333123barEv,_ZThn20_N3aaa9GG22333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22333123barEv,_ZThn28_N3aaa9GG22333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22333123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22333123barEv,_ZThn8_N3aaa9GG22333123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333123barEv,_ZThn20_N3aaa9GG22333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333123barEv,_ZThn28_N3aaa9GG22333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233312E[];
Class_Descriptor cd__ZN3aaa9GG2233312E = {  "_ZN3aaa9GG2233312E", // class name
  bases__ZN3aaa9GG2233312E, 6,
  &(vtc__ZN3aaa9GG2233312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233313  : ::aaa::EE223 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22333133fooEv
  virtual void  bar(); // _ZN3aaa9GG22333133barEv
  ~GG2233313(); // tgen
  GG2233313(); // tgen
};
//SIG(1 _ZN3aaa9GG2233313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233313 ::foo(){vfunc_called(this, "_ZN3aaa9GG22333133fooEv");}
void  aaa::GG2233313 ::bar(){vfunc_called(this, "_ZN3aaa9GG22333133barEv");}
aaa::GG2233313 ::~GG2233313(){ note_dtor("_ZN3aaa9GG2233313E", this);} // tgen
aaa::GG2233313 ::GG2233313(){ note_ctor("_ZN3aaa9GG2233313E", this);} // tgen
}
static void Test__ZN3aaa9GG2233313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233313E, buf);
    ::aaa::GG2233313 *dp, &lv = *(dp=new (buf) ::aaa::GG2233313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233313E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2233313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2233313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2233313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233313E);
    dp->::aaa::GG2233313::~GG2233313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233313E(Test__ZN3aaa9GG2233313E, "_ZN3aaa9GG2233313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233313C1Ev();
extern void _ZN3aaa9GG2233313D1Ev();
Name_Map name_map__ZN3aaa9GG2233313E[] = {
  NSPAIR(_ZN3aaa9GG2233313C1Ev),
  NSPAIR(_ZN3aaa9GG2233313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2233313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233313E[];
extern void _ZN3aaa9GG22333133barEv();
extern void _ZN3aaa9GG22333133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22333133barEv,_ZThn8_N3aaa9GG22333133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333133fooEv,_ZThn20_N3aaa9GG22333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333133barEv,_ZThn20_N3aaa9GG22333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22333133fooEv,_ZThn28_N3aaa9GG22333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22333133barEv,_ZThn28_N3aaa9GG22333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22333133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22333133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22333133barEv,_ZThn8_N3aaa9GG22333133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333133fooEv,_ZThn20_N3aaa9GG22333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333133barEv,_ZThn20_N3aaa9GG22333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333133fooEv,_ZThn28_N3aaa9GG22333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333133barEv,_ZThn28_N3aaa9GG22333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233313E[];
Class_Descriptor cd__ZN3aaa9GG2233313E = {  "_ZN3aaa9GG2233313E", // class name
  bases__ZN3aaa9GG2233313E, 6,
  &(vtc__ZN3aaa9GG2233313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233321  : ::aaa::EE223 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22333213fooEv
  ~GG2233321(); // tgen
  GG2233321(); // tgen
};
//SIG(1 _ZN3aaa9GG2233321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233321 ::foo(){vfunc_called(this, "_ZN3aaa9GG22333213fooEv");}
aaa::GG2233321 ::~GG2233321(){ note_dtor("_ZN3aaa9GG2233321E", this);} // tgen
aaa::GG2233321 ::GG2233321(){ note_ctor("_ZN3aaa9GG2233321E", this);} // tgen
}
static void Test__ZN3aaa9GG2233321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233321E, buf);
    ::aaa::GG2233321 *dp, &lv = *(dp=new (buf) ::aaa::GG2233321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233321E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2233321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2233321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2233321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233321E);
    dp->::aaa::GG2233321::~GG2233321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233321E(Test__ZN3aaa9GG2233321E, "_ZN3aaa9GG2233321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233321C1Ev();
extern void _ZN3aaa9GG2233321D1Ev();
Name_Map name_map__ZN3aaa9GG2233321E[] = {
  NSPAIR(_ZN3aaa9GG2233321C1Ev),
  NSPAIR(_ZN3aaa9GG2233321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2233321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233321E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22333213fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333213fooEv,_ZThn20_N3aaa9GG22333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22333213fooEv,_ZThn28_N3aaa9GG22333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22333213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333213fooEv,_ZThn20_N3aaa9GG22333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333213fooEv,_ZThn28_N3aaa9GG22333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233321E[];
Class_Descriptor cd__ZN3aaa9GG2233321E = {  "_ZN3aaa9GG2233321E", // class name
  bases__ZN3aaa9GG2233321E, 6,
  &(vtc__ZN3aaa9GG2233321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233322  : ::aaa::EE223 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22333223barEv
  ~GG2233322(); // tgen
  GG2233322(); // tgen
};
//SIG(1 _ZN3aaa9GG2233322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233322 ::bar(){vfunc_called(this, "_ZN3aaa9GG22333223barEv");}
aaa::GG2233322 ::~GG2233322(){ note_dtor("_ZN3aaa9GG2233322E", this);} // tgen
aaa::GG2233322 ::GG2233322(){ note_ctor("_ZN3aaa9GG2233322E", this);} // tgen
}
static void Test__ZN3aaa9GG2233322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233322E, buf);
    ::aaa::GG2233322 *dp, &lv = *(dp=new (buf) ::aaa::GG2233322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233322E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2233322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2233322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2233322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233322E);
    dp->::aaa::GG2233322::~GG2233322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233322E(Test__ZN3aaa9GG2233322E, "_ZN3aaa9GG2233322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233322C1Ev();
extern void _ZN3aaa9GG2233322D1Ev();
Name_Map name_map__ZN3aaa9GG2233322E[] = {
  NSPAIR(_ZN3aaa9GG2233322C1Ev),
  NSPAIR(_ZN3aaa9GG2233322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2233322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233322E[];
extern void _ZN3aaa9GG22333223barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22333223barEv,_ZThn8_N3aaa9GG22333223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22333223barEv,_ZThn20_N3aaa9GG22333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22333223barEv,_ZThn28_N3aaa9GG22333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22333223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22333223barEv,_ZThn8_N3aaa9GG22333223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333223barEv,_ZThn20_N3aaa9GG22333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333223barEv,_ZThn28_N3aaa9GG22333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233322E[];
Class_Descriptor cd__ZN3aaa9GG2233322E = {  "_ZN3aaa9GG2233322E", // class name
  bases__ZN3aaa9GG2233322E, 6,
  &(vtc__ZN3aaa9GG2233322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233323  : ::aaa::EE223 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22333233fooEv
  virtual void  bar(); // _ZN3aaa9GG22333233barEv
  ~GG2233323(); // tgen
  GG2233323(); // tgen
};
//SIG(1 _ZN3aaa9GG2233323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233323 ::foo(){vfunc_called(this, "_ZN3aaa9GG22333233fooEv");}
void  aaa::GG2233323 ::bar(){vfunc_called(this, "_ZN3aaa9GG22333233barEv");}
aaa::GG2233323 ::~GG2233323(){ note_dtor("_ZN3aaa9GG2233323E", this);} // tgen
aaa::GG2233323 ::GG2233323(){ note_ctor("_ZN3aaa9GG2233323E", this);} // tgen
}
static void Test__ZN3aaa9GG2233323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233323E, buf);
    ::aaa::GG2233323 *dp, &lv = *(dp=new (buf) ::aaa::GG2233323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233323E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2233323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2233323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2233323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233323E);
    dp->::aaa::GG2233323::~GG2233323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233323E(Test__ZN3aaa9GG2233323E, "_ZN3aaa9GG2233323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233323C1Ev();
extern void _ZN3aaa9GG2233323D1Ev();
Name_Map name_map__ZN3aaa9GG2233323E[] = {
  NSPAIR(_ZN3aaa9GG2233323C1Ev),
  NSPAIR(_ZN3aaa9GG2233323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2233323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233323E[];
extern void _ZN3aaa9GG22333233barEv();
extern void _ZN3aaa9GG22333233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22333233barEv,_ZThn8_N3aaa9GG22333233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333233fooEv,_ZThn20_N3aaa9GG22333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333233barEv,_ZThn20_N3aaa9GG22333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22333233fooEv,_ZThn28_N3aaa9GG22333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22333233barEv,_ZThn28_N3aaa9GG22333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22333233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22333233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22333233barEv,_ZThn8_N3aaa9GG22333233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333233fooEv,_ZThn20_N3aaa9GG22333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333233barEv,_ZThn20_N3aaa9GG22333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333233fooEv,_ZThn28_N3aaa9GG22333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333233barEv,_ZThn28_N3aaa9GG22333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233323E[];
Class_Descriptor cd__ZN3aaa9GG2233323E = {  "_ZN3aaa9GG2233323E", // class name
  bases__ZN3aaa9GG2233323E, 6,
  &(vtc__ZN3aaa9GG2233323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233331  : ::aaa::EE223 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22333313fooEv
  ~GG2233331(); // tgen
  GG2233331(); // tgen
};
//SIG(1 _ZN3aaa9GG2233331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233331 ::foo(){vfunc_called(this, "_ZN3aaa9GG22333313fooEv");}
aaa::GG2233331 ::~GG2233331(){ note_dtor("_ZN3aaa9GG2233331E", this);} // tgen
aaa::GG2233331 ::GG2233331(){ note_ctor("_ZN3aaa9GG2233331E", this);} // tgen
}
static void Test__ZN3aaa9GG2233331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233331E, buf);
    ::aaa::GG2233331 *dp, &lv = *(dp=new (buf) ::aaa::GG2233331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233331E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2233331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2233331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2233331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233331E);
    dp->::aaa::GG2233331::~GG2233331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233331E(Test__ZN3aaa9GG2233331E, "_ZN3aaa9GG2233331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233331C1Ev();
extern void _ZN3aaa9GG2233331D1Ev();
Name_Map name_map__ZN3aaa9GG2233331E[] = {
  NSPAIR(_ZN3aaa9GG2233331C1Ev),
  NSPAIR(_ZN3aaa9GG2233331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2233331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233331E[];
extern void _ZN3aaa5EE2233barEv();
extern void _ZN3aaa9GG22333313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333313fooEv,_ZThn20_N3aaa9GG22333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG22333313fooEv,_ZThn28_N3aaa9GG22333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22333313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2233barEv,_ZThn8_N3aaa5EE2233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333313fooEv,_ZThn20_N3aaa9GG22333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333313fooEv,_ZThn28_N3aaa9GG22333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233331E[];
Class_Descriptor cd__ZN3aaa9GG2233331E = {  "_ZN3aaa9GG2233331E", // class name
  bases__ZN3aaa9GG2233331E, 6,
  &(vtc__ZN3aaa9GG2233331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233332  : ::aaa::EE223 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG22333323barEv
  ~GG2233332(); // tgen
  GG2233332(); // tgen
};
//SIG(1 _ZN3aaa9GG2233332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2233332 ::bar(){vfunc_called(this, "_ZN3aaa9GG22333323barEv");}
aaa::GG2233332 ::~GG2233332(){ note_dtor("_ZN3aaa9GG2233332E", this);} // tgen
aaa::GG2233332 ::GG2233332(){ note_ctor("_ZN3aaa9GG2233332E", this);} // tgen
}
static void Test__ZN3aaa9GG2233332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233332E, buf);
    ::aaa::GG2233332 *dp, &lv = *(dp=new (buf) ::aaa::GG2233332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233332E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2233332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2233332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2233332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233332E);
    dp->::aaa::GG2233332::~GG2233332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233332E(Test__ZN3aaa9GG2233332E, "_ZN3aaa9GG2233332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233332C1Ev();
extern void _ZN3aaa9GG2233332D1Ev();
Name_Map name_map__ZN3aaa9GG2233332E[] = {
  NSPAIR(_ZN3aaa9GG2233332C1Ev),
  NSPAIR(_ZN3aaa9GG2233332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2233332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233332E[];
extern void _ZN3aaa9GG22333323barEv();
extern void _ZN3aaa5EE2233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22333323barEv,_ZThn8_N3aaa9GG22333323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG22333323barEv,_ZThn20_N3aaa9GG22333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22333323barEv,_ZThn28_N3aaa9GG22333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22333323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22333323barEv,_ZThn8_N3aaa9GG22333323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333323barEv,_ZThn20_N3aaa9GG22333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333323barEv,_ZThn28_N3aaa9GG22333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233332E[];
Class_Descriptor cd__ZN3aaa9GG2233332E = {  "_ZN3aaa9GG2233332E", // class name
  bases__ZN3aaa9GG2233332E, 6,
  &(vtc__ZN3aaa9GG2233332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2233333  : ::aaa::EE223 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG22333333fooEv
  virtual void  bar(); // _ZN3aaa9GG22333333barEv
  ~GG2233333(); // tgen
  GG2233333(); // tgen
};
//SIG(1 _ZN3aaa9GG2233333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2233333 ::foo(){vfunc_called(this, "_ZN3aaa9GG22333333fooEv");}
void  aaa::GG2233333 ::bar(){vfunc_called(this, "_ZN3aaa9GG22333333barEv");}
aaa::GG2233333 ::~GG2233333(){ note_dtor("_ZN3aaa9GG2233333E", this);} // tgen
aaa::GG2233333 ::GG2233333(){ note_ctor("_ZN3aaa9GG2233333E", this);} // tgen
}
static void Test__ZN3aaa9GG2233333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2233333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2233333E, buf);
    ::aaa::GG2233333 *dp, &lv = *(dp=new (buf) ::aaa::GG2233333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2233333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2233333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE223*), 0, "_ZN3aaa9GG2233333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE223*), ABISELECT(16,8), "_ZN3aaa9GG2233333E");
    check_base_class_offset(lv, (::aaa::EE223*), 0, "_ZN3aaa9GG2233333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2233333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2233333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2233333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2233333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2233333E);
    dp->::aaa::GG2233333::~GG2233333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2233333E(Test__ZN3aaa9GG2233333E, "_ZN3aaa9GG2233333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2233333C1Ev();
extern void _ZN3aaa9GG2233333D1Ev();
Name_Map name_map__ZN3aaa9GG2233333E[] = {
  NSPAIR(_ZN3aaa9GG2233333C1Ev),
  NSPAIR(_ZN3aaa9GG2233333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE223E;
extern VTBL_ENTRY _ZTIN3aaa5EE223E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE223E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2233333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE223E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2233333E[];
extern void _ZN3aaa9GG22333333barEv();
extern void _ZN3aaa9GG22333333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG22333333barEv,_ZThn8_N3aaa9GG22333333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333333fooEv,_ZThn20_N3aaa9GG22333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG22333333barEv,_ZThn20_N3aaa9GG22333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22333333fooEv,_ZThn28_N3aaa9GG22333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG22333333barEv,_ZThn28_N3aaa9GG22333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2233333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG22333333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG22333333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG22333333barEv,_ZThn8_N3aaa9GG22333333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333333fooEv,_ZThn20_N3aaa9GG22333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG22333333barEv,_ZThn20_N3aaa9GG22333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333333fooEv,_ZThn28_N3aaa9GG22333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG22333333barEv,_ZThn28_N3aaa9GG22333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2233333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2233333E[];
Class_Descriptor cd__ZN3aaa9GG2233333E = {  "_ZN3aaa9GG2233333E", // class name
  bases__ZN3aaa9GG2233333E, 6,
  &(vtc__ZN3aaa9GG2233333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2233333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2233333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311111  : ::aaa::EE231 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23111113fooEv
  ~GG2311111(); // tgen
  GG2311111(); // tgen
};
//SIG(1 _ZN3aaa9GG2311111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23111113fooEv");}
aaa::GG2311111 ::~GG2311111(){ note_dtor("_ZN3aaa9GG2311111E", this);} // tgen
aaa::GG2311111 ::GG2311111(){ note_ctor("_ZN3aaa9GG2311111E", this);} // tgen
}
static void Test__ZN3aaa9GG2311111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311111E, buf);
    ::aaa::GG2311111 *dp, &lv = *(dp=new (buf) ::aaa::GG2311111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311111E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2311111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2311111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2311111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311111E);
    dp->::aaa::GG2311111::~GG2311111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311111E(Test__ZN3aaa9GG2311111E, "_ZN3aaa9GG2311111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311111C1Ev();
extern void _ZN3aaa9GG2311111D1Ev();
Name_Map name_map__ZN3aaa9GG2311111E[] = {
  NSPAIR(_ZN3aaa9GG2311111C1Ev),
  NSPAIR(_ZN3aaa9GG2311111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2311111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23111113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23111113fooEv,_ZThn8_N3aaa9GG23111113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23111113fooEv,_ZThn20_N3aaa9GG23111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23111113fooEv,_ZThn28_N3aaa9GG23111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23111113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111113fooEv,_ZThn8_N3aaa9GG23111113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111113fooEv,_ZThn20_N3aaa9GG23111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23111113fooEv,_ZThn28_N3aaa9GG23111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311111E[];
Class_Descriptor cd__ZN3aaa9GG2311111E = {  "_ZN3aaa9GG2311111E", // class name
  bases__ZN3aaa9GG2311111E, 6,
  &(vtc__ZN3aaa9GG2311111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311112  : ::aaa::EE231 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23111123barEv
  ~GG2311112(); // tgen
  GG2311112(); // tgen
};
//SIG(1 _ZN3aaa9GG2311112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23111123barEv");}
aaa::GG2311112 ::~GG2311112(){ note_dtor("_ZN3aaa9GG2311112E", this);} // tgen
aaa::GG2311112 ::GG2311112(){ note_ctor("_ZN3aaa9GG2311112E", this);} // tgen
}
static void Test__ZN3aaa9GG2311112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311112E, buf);
    ::aaa::GG2311112 *dp, &lv = *(dp=new (buf) ::aaa::GG2311112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311112E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2311112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2311112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2311112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311112E);
    dp->::aaa::GG2311112::~GG2311112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311112E(Test__ZN3aaa9GG2311112E, "_ZN3aaa9GG2311112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311112C1Ev();
extern void _ZN3aaa9GG2311112D1Ev();
Name_Map name_map__ZN3aaa9GG2311112E[] = {
  NSPAIR(_ZN3aaa9GG2311112C1Ev),
  NSPAIR(_ZN3aaa9GG2311112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2311112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311112E[];
extern void _ZN3aaa9GG23111123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23111123barEv,_ZThn8_N3aaa9GG23111123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23111123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111123barEv,_ZThn8_N3aaa9GG23111123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311112E[];
Class_Descriptor cd__ZN3aaa9GG2311112E = {  "_ZN3aaa9GG2311112E", // class name
  bases__ZN3aaa9GG2311112E, 6,
  &(vtc__ZN3aaa9GG2311112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311113  : ::aaa::EE231 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23111133fooEv
  virtual void  bar(); // _ZN3aaa9GG23111133barEv
  ~GG2311113(); // tgen
  GG2311113(); // tgen
};
//SIG(1 _ZN3aaa9GG2311113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23111133fooEv");}
void  aaa::GG2311113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23111133barEv");}
aaa::GG2311113 ::~GG2311113(){ note_dtor("_ZN3aaa9GG2311113E", this);} // tgen
aaa::GG2311113 ::GG2311113(){ note_ctor("_ZN3aaa9GG2311113E", this);} // tgen
}
static void Test__ZN3aaa9GG2311113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311113E, buf);
    ::aaa::GG2311113 *dp, &lv = *(dp=new (buf) ::aaa::GG2311113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311113E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2311113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2311113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2311113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311113E);
    dp->::aaa::GG2311113::~GG2311113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311113E(Test__ZN3aaa9GG2311113E, "_ZN3aaa9GG2311113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311113C1Ev();
extern void _ZN3aaa9GG2311113D1Ev();
Name_Map name_map__ZN3aaa9GG2311113E[] = {
  NSPAIR(_ZN3aaa9GG2311113C1Ev),
  NSPAIR(_ZN3aaa9GG2311113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2311113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311113E[];
extern void _ZN3aaa9GG23111133barEv();
extern void _ZN3aaa9GG23111133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23111133fooEv,_ZThn8_N3aaa9GG23111133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23111133barEv,_ZThn8_N3aaa9GG23111133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23111133fooEv,_ZThn20_N3aaa9GG23111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23111133fooEv,_ZThn28_N3aaa9GG23111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23111133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23111133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111133fooEv,_ZThn8_N3aaa9GG23111133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111133barEv,_ZThn8_N3aaa9GG23111133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111133fooEv,_ZThn20_N3aaa9GG23111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23111133fooEv,_ZThn28_N3aaa9GG23111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311113E[];
Class_Descriptor cd__ZN3aaa9GG2311113E = {  "_ZN3aaa9GG2311113E", // class name
  bases__ZN3aaa9GG2311113E, 6,
  &(vtc__ZN3aaa9GG2311113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311121  : ::aaa::EE231 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23111213fooEv
  ~GG2311121(); // tgen
  GG2311121(); // tgen
};
//SIG(1 _ZN3aaa9GG2311121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23111213fooEv");}
aaa::GG2311121 ::~GG2311121(){ note_dtor("_ZN3aaa9GG2311121E", this);} // tgen
aaa::GG2311121 ::GG2311121(){ note_ctor("_ZN3aaa9GG2311121E", this);} // tgen
}
static void Test__ZN3aaa9GG2311121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311121E, buf);
    ::aaa::GG2311121 *dp, &lv = *(dp=new (buf) ::aaa::GG2311121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311121E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2311121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2311121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2311121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311121E);
    dp->::aaa::GG2311121::~GG2311121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311121E(Test__ZN3aaa9GG2311121E, "_ZN3aaa9GG2311121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311121C1Ev();
extern void _ZN3aaa9GG2311121D1Ev();
Name_Map name_map__ZN3aaa9GG2311121E[] = {
  NSPAIR(_ZN3aaa9GG2311121C1Ev),
  NSPAIR(_ZN3aaa9GG2311121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2311121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23111213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23111213fooEv,_ZThn8_N3aaa9GG23111213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23111213fooEv,_ZThn20_N3aaa9GG23111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23111213fooEv,_ZThn28_N3aaa9GG23111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23111213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111213fooEv,_ZThn8_N3aaa9GG23111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111213fooEv,_ZThn20_N3aaa9GG23111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23111213fooEv,_ZThn28_N3aaa9GG23111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311121E[];
Class_Descriptor cd__ZN3aaa9GG2311121E = {  "_ZN3aaa9GG2311121E", // class name
  bases__ZN3aaa9GG2311121E, 6,
  &(vtc__ZN3aaa9GG2311121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311122  : ::aaa::EE231 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23111223barEv
  ~GG2311122(); // tgen
  GG2311122(); // tgen
};
//SIG(1 _ZN3aaa9GG2311122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23111223barEv");}
aaa::GG2311122 ::~GG2311122(){ note_dtor("_ZN3aaa9GG2311122E", this);} // tgen
aaa::GG2311122 ::GG2311122(){ note_ctor("_ZN3aaa9GG2311122E", this);} // tgen
}
static void Test__ZN3aaa9GG2311122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311122E, buf);
    ::aaa::GG2311122 *dp, &lv = *(dp=new (buf) ::aaa::GG2311122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311122E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2311122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2311122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2311122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311122E);
    dp->::aaa::GG2311122::~GG2311122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311122E(Test__ZN3aaa9GG2311122E, "_ZN3aaa9GG2311122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311122C1Ev();
extern void _ZN3aaa9GG2311122D1Ev();
Name_Map name_map__ZN3aaa9GG2311122E[] = {
  NSPAIR(_ZN3aaa9GG2311122C1Ev),
  NSPAIR(_ZN3aaa9GG2311122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2311122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311122E[];
extern void _ZN3aaa9GG23111223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23111223barEv,_ZThn8_N3aaa9GG23111223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23111223barEv,_ZThn20_N3aaa9GG23111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23111223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111223barEv,_ZThn8_N3aaa9GG23111223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111223barEv,_ZThn20_N3aaa9GG23111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311122E[];
Class_Descriptor cd__ZN3aaa9GG2311122E = {  "_ZN3aaa9GG2311122E", // class name
  bases__ZN3aaa9GG2311122E, 6,
  &(vtc__ZN3aaa9GG2311122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311123  : ::aaa::EE231 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23111233fooEv
  virtual void  bar(); // _ZN3aaa9GG23111233barEv
  ~GG2311123(); // tgen
  GG2311123(); // tgen
};
//SIG(1 _ZN3aaa9GG2311123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23111233fooEv");}
void  aaa::GG2311123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23111233barEv");}
aaa::GG2311123 ::~GG2311123(){ note_dtor("_ZN3aaa9GG2311123E", this);} // tgen
aaa::GG2311123 ::GG2311123(){ note_ctor("_ZN3aaa9GG2311123E", this);} // tgen
}
static void Test__ZN3aaa9GG2311123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311123E, buf);
    ::aaa::GG2311123 *dp, &lv = *(dp=new (buf) ::aaa::GG2311123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311123E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2311123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2311123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2311123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311123E);
    dp->::aaa::GG2311123::~GG2311123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311123E(Test__ZN3aaa9GG2311123E, "_ZN3aaa9GG2311123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311123C1Ev();
extern void _ZN3aaa9GG2311123D1Ev();
Name_Map name_map__ZN3aaa9GG2311123E[] = {
  NSPAIR(_ZN3aaa9GG2311123C1Ev),
  NSPAIR(_ZN3aaa9GG2311123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2311123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311123E[];
extern void _ZN3aaa9GG23111233barEv();
extern void _ZN3aaa9GG23111233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23111233fooEv,_ZThn8_N3aaa9GG23111233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23111233barEv,_ZThn8_N3aaa9GG23111233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23111233fooEv,_ZThn20_N3aaa9GG23111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23111233barEv,_ZThn20_N3aaa9GG23111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23111233fooEv,_ZThn28_N3aaa9GG23111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23111233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23111233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111233fooEv,_ZThn8_N3aaa9GG23111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111233barEv,_ZThn8_N3aaa9GG23111233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111233fooEv,_ZThn20_N3aaa9GG23111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111233barEv,_ZThn20_N3aaa9GG23111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23111233fooEv,_ZThn28_N3aaa9GG23111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311123E[];
Class_Descriptor cd__ZN3aaa9GG2311123E = {  "_ZN3aaa9GG2311123E", // class name
  bases__ZN3aaa9GG2311123E, 6,
  &(vtc__ZN3aaa9GG2311123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311131  : ::aaa::EE231 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23111313fooEv
  ~GG2311131(); // tgen
  GG2311131(); // tgen
};
//SIG(1 _ZN3aaa9GG2311131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23111313fooEv");}
aaa::GG2311131 ::~GG2311131(){ note_dtor("_ZN3aaa9GG2311131E", this);} // tgen
aaa::GG2311131 ::GG2311131(){ note_ctor("_ZN3aaa9GG2311131E", this);} // tgen
}
static void Test__ZN3aaa9GG2311131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311131E, buf);
    ::aaa::GG2311131 *dp, &lv = *(dp=new (buf) ::aaa::GG2311131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311131E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2311131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2311131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2311131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311131E);
    dp->::aaa::GG2311131::~GG2311131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311131E(Test__ZN3aaa9GG2311131E, "_ZN3aaa9GG2311131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311131C1Ev();
extern void _ZN3aaa9GG2311131D1Ev();
Name_Map name_map__ZN3aaa9GG2311131E[] = {
  NSPAIR(_ZN3aaa9GG2311131C1Ev),
  NSPAIR(_ZN3aaa9GG2311131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2311131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23111313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23111313fooEv,_ZThn8_N3aaa9GG23111313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23111313fooEv,_ZThn20_N3aaa9GG23111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23111313fooEv,_ZThn28_N3aaa9GG23111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23111313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111313fooEv,_ZThn8_N3aaa9GG23111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111313fooEv,_ZThn20_N3aaa9GG23111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23111313fooEv,_ZThn28_N3aaa9GG23111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311131E[];
Class_Descriptor cd__ZN3aaa9GG2311131E = {  "_ZN3aaa9GG2311131E", // class name
  bases__ZN3aaa9GG2311131E, 6,
  &(vtc__ZN3aaa9GG2311131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311132  : ::aaa::EE231 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23111323barEv
  ~GG2311132(); // tgen
  GG2311132(); // tgen
};
//SIG(1 _ZN3aaa9GG2311132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23111323barEv");}
aaa::GG2311132 ::~GG2311132(){ note_dtor("_ZN3aaa9GG2311132E", this);} // tgen
aaa::GG2311132 ::GG2311132(){ note_ctor("_ZN3aaa9GG2311132E", this);} // tgen
}
static void Test__ZN3aaa9GG2311132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311132E, buf);
    ::aaa::GG2311132 *dp, &lv = *(dp=new (buf) ::aaa::GG2311132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311132E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2311132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2311132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2311132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311132E);
    dp->::aaa::GG2311132::~GG2311132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311132E(Test__ZN3aaa9GG2311132E, "_ZN3aaa9GG2311132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311132C1Ev();
extern void _ZN3aaa9GG2311132D1Ev();
Name_Map name_map__ZN3aaa9GG2311132E[] = {
  NSPAIR(_ZN3aaa9GG2311132C1Ev),
  NSPAIR(_ZN3aaa9GG2311132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2311132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311132E[];
extern void _ZN3aaa9GG23111323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23111323barEv,_ZThn8_N3aaa9GG23111323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23111323barEv,_ZThn20_N3aaa9GG23111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23111323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111323barEv,_ZThn8_N3aaa9GG23111323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111323barEv,_ZThn20_N3aaa9GG23111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311132E[];
Class_Descriptor cd__ZN3aaa9GG2311132E = {  "_ZN3aaa9GG2311132E", // class name
  bases__ZN3aaa9GG2311132E, 6,
  &(vtc__ZN3aaa9GG2311132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311133  : ::aaa::EE231 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23111333fooEv
  virtual void  bar(); // _ZN3aaa9GG23111333barEv
  ~GG2311133(); // tgen
  GG2311133(); // tgen
};
//SIG(1 _ZN3aaa9GG2311133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23111333fooEv");}
void  aaa::GG2311133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23111333barEv");}
aaa::GG2311133 ::~GG2311133(){ note_dtor("_ZN3aaa9GG2311133E", this);} // tgen
aaa::GG2311133 ::GG2311133(){ note_ctor("_ZN3aaa9GG2311133E", this);} // tgen
}
static void Test__ZN3aaa9GG2311133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311133E, buf);
    ::aaa::GG2311133 *dp, &lv = *(dp=new (buf) ::aaa::GG2311133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311133E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2311133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2311133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2311133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311133E);
    dp->::aaa::GG2311133::~GG2311133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311133E(Test__ZN3aaa9GG2311133E, "_ZN3aaa9GG2311133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311133C1Ev();
extern void _ZN3aaa9GG2311133D1Ev();
Name_Map name_map__ZN3aaa9GG2311133E[] = {
  NSPAIR(_ZN3aaa9GG2311133C1Ev),
  NSPAIR(_ZN3aaa9GG2311133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2311133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311133E[];
extern void _ZN3aaa9GG23111333barEv();
extern void _ZN3aaa9GG23111333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23111333fooEv,_ZThn8_N3aaa9GG23111333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23111333barEv,_ZThn8_N3aaa9GG23111333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23111333fooEv,_ZThn20_N3aaa9GG23111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23111333barEv,_ZThn20_N3aaa9GG23111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23111333fooEv,_ZThn28_N3aaa9GG23111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23111333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23111333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111333fooEv,_ZThn8_N3aaa9GG23111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23111333barEv,_ZThn8_N3aaa9GG23111333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111333fooEv,_ZThn20_N3aaa9GG23111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23111333barEv,_ZThn20_N3aaa9GG23111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23111333fooEv,_ZThn28_N3aaa9GG23111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311133E[];
Class_Descriptor cd__ZN3aaa9GG2311133E = {  "_ZN3aaa9GG2311133E", // class name
  bases__ZN3aaa9GG2311133E, 6,
  &(vtc__ZN3aaa9GG2311133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311211  : ::aaa::EE231 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23112113fooEv
  ~GG2311211(); // tgen
  GG2311211(); // tgen
};
//SIG(1 _ZN3aaa9GG2311211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23112113fooEv");}
aaa::GG2311211 ::~GG2311211(){ note_dtor("_ZN3aaa9GG2311211E", this);} // tgen
aaa::GG2311211 ::GG2311211(){ note_ctor("_ZN3aaa9GG2311211E", this);} // tgen
}
static void Test__ZN3aaa9GG2311211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311211E, buf);
    ::aaa::GG2311211 *dp, &lv = *(dp=new (buf) ::aaa::GG2311211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311211E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2311211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2311211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2311211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311211E);
    dp->::aaa::GG2311211::~GG2311211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311211E(Test__ZN3aaa9GG2311211E, "_ZN3aaa9GG2311211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311211C1Ev();
extern void _ZN3aaa9GG2311211D1Ev();
Name_Map name_map__ZN3aaa9GG2311211E[] = {
  NSPAIR(_ZN3aaa9GG2311211C1Ev),
  NSPAIR(_ZN3aaa9GG2311211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2311211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23112113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23112113fooEv,_ZThn8_N3aaa9GG23112113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23112113fooEv,_ZThn20_N3aaa9GG23112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23112113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112113fooEv,_ZThn8_N3aaa9GG23112113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112113fooEv,_ZThn20_N3aaa9GG23112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311211E[];
Class_Descriptor cd__ZN3aaa9GG2311211E = {  "_ZN3aaa9GG2311211E", // class name
  bases__ZN3aaa9GG2311211E, 6,
  &(vtc__ZN3aaa9GG2311211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311212  : ::aaa::EE231 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23112123barEv
  ~GG2311212(); // tgen
  GG2311212(); // tgen
};
//SIG(1 _ZN3aaa9GG2311212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23112123barEv");}
aaa::GG2311212 ::~GG2311212(){ note_dtor("_ZN3aaa9GG2311212E", this);} // tgen
aaa::GG2311212 ::GG2311212(){ note_ctor("_ZN3aaa9GG2311212E", this);} // tgen
}
static void Test__ZN3aaa9GG2311212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311212E, buf);
    ::aaa::GG2311212 *dp, &lv = *(dp=new (buf) ::aaa::GG2311212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311212E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2311212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2311212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2311212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311212E);
    dp->::aaa::GG2311212::~GG2311212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311212E(Test__ZN3aaa9GG2311212E, "_ZN3aaa9GG2311212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311212C1Ev();
extern void _ZN3aaa9GG2311212D1Ev();
Name_Map name_map__ZN3aaa9GG2311212E[] = {
  NSPAIR(_ZN3aaa9GG2311212C1Ev),
  NSPAIR(_ZN3aaa9GG2311212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2311212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311212E[];
extern void _ZN3aaa9GG23112123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23112123barEv,_ZThn8_N3aaa9GG23112123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23112123barEv,_ZThn28_N3aaa9GG23112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23112123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112123barEv,_ZThn8_N3aaa9GG23112123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23112123barEv,_ZThn28_N3aaa9GG23112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311212E[];
Class_Descriptor cd__ZN3aaa9GG2311212E = {  "_ZN3aaa9GG2311212E", // class name
  bases__ZN3aaa9GG2311212E, 6,
  &(vtc__ZN3aaa9GG2311212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311213  : ::aaa::EE231 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23112133fooEv
  virtual void  bar(); // _ZN3aaa9GG23112133barEv
  ~GG2311213(); // tgen
  GG2311213(); // tgen
};
//SIG(1 _ZN3aaa9GG2311213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23112133fooEv");}
void  aaa::GG2311213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23112133barEv");}
aaa::GG2311213 ::~GG2311213(){ note_dtor("_ZN3aaa9GG2311213E", this);} // tgen
aaa::GG2311213 ::GG2311213(){ note_ctor("_ZN3aaa9GG2311213E", this);} // tgen
}
static void Test__ZN3aaa9GG2311213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311213E, buf);
    ::aaa::GG2311213 *dp, &lv = *(dp=new (buf) ::aaa::GG2311213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311213E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2311213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2311213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2311213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311213E);
    dp->::aaa::GG2311213::~GG2311213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311213E(Test__ZN3aaa9GG2311213E, "_ZN3aaa9GG2311213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311213C1Ev();
extern void _ZN3aaa9GG2311213D1Ev();
Name_Map name_map__ZN3aaa9GG2311213E[] = {
  NSPAIR(_ZN3aaa9GG2311213C1Ev),
  NSPAIR(_ZN3aaa9GG2311213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2311213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311213E[];
extern void _ZN3aaa9GG23112133barEv();
extern void _ZN3aaa9GG23112133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23112133fooEv,_ZThn8_N3aaa9GG23112133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23112133barEv,_ZThn8_N3aaa9GG23112133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23112133fooEv,_ZThn20_N3aaa9GG23112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23112133barEv,_ZThn28_N3aaa9GG23112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23112133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23112133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112133fooEv,_ZThn8_N3aaa9GG23112133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112133barEv,_ZThn8_N3aaa9GG23112133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112133fooEv,_ZThn20_N3aaa9GG23112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23112133barEv,_ZThn28_N3aaa9GG23112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311213E[];
Class_Descriptor cd__ZN3aaa9GG2311213E = {  "_ZN3aaa9GG2311213E", // class name
  bases__ZN3aaa9GG2311213E, 6,
  &(vtc__ZN3aaa9GG2311213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311221  : ::aaa::EE231 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23112213fooEv
  ~GG2311221(); // tgen
  GG2311221(); // tgen
};
//SIG(1 _ZN3aaa9GG2311221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23112213fooEv");}
aaa::GG2311221 ::~GG2311221(){ note_dtor("_ZN3aaa9GG2311221E", this);} // tgen
aaa::GG2311221 ::GG2311221(){ note_ctor("_ZN3aaa9GG2311221E", this);} // tgen
}
static void Test__ZN3aaa9GG2311221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311221E, buf);
    ::aaa::GG2311221 *dp, &lv = *(dp=new (buf) ::aaa::GG2311221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311221E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2311221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2311221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2311221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311221E);
    dp->::aaa::GG2311221::~GG2311221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311221E(Test__ZN3aaa9GG2311221E, "_ZN3aaa9GG2311221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311221C1Ev();
extern void _ZN3aaa9GG2311221D1Ev();
Name_Map name_map__ZN3aaa9GG2311221E[] = {
  NSPAIR(_ZN3aaa9GG2311221C1Ev),
  NSPAIR(_ZN3aaa9GG2311221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2311221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23112213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23112213fooEv,_ZThn8_N3aaa9GG23112213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23112213fooEv,_ZThn20_N3aaa9GG23112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23112213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112213fooEv,_ZThn8_N3aaa9GG23112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112213fooEv,_ZThn20_N3aaa9GG23112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311221E[];
Class_Descriptor cd__ZN3aaa9GG2311221E = {  "_ZN3aaa9GG2311221E", // class name
  bases__ZN3aaa9GG2311221E, 6,
  &(vtc__ZN3aaa9GG2311221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311222  : ::aaa::EE231 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23112223barEv
  ~GG2311222(); // tgen
  GG2311222(); // tgen
};
//SIG(1 _ZN3aaa9GG2311222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23112223barEv");}
aaa::GG2311222 ::~GG2311222(){ note_dtor("_ZN3aaa9GG2311222E", this);} // tgen
aaa::GG2311222 ::GG2311222(){ note_ctor("_ZN3aaa9GG2311222E", this);} // tgen
}
static void Test__ZN3aaa9GG2311222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311222E, buf);
    ::aaa::GG2311222 *dp, &lv = *(dp=new (buf) ::aaa::GG2311222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311222E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2311222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2311222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2311222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311222E);
    dp->::aaa::GG2311222::~GG2311222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311222E(Test__ZN3aaa9GG2311222E, "_ZN3aaa9GG2311222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311222C1Ev();
extern void _ZN3aaa9GG2311222D1Ev();
Name_Map name_map__ZN3aaa9GG2311222E[] = {
  NSPAIR(_ZN3aaa9GG2311222C1Ev),
  NSPAIR(_ZN3aaa9GG2311222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2311222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311222E[];
extern void _ZN3aaa9GG23112223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23112223barEv,_ZThn8_N3aaa9GG23112223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23112223barEv,_ZThn20_N3aaa9GG23112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23112223barEv,_ZThn28_N3aaa9GG23112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23112223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112223barEv,_ZThn8_N3aaa9GG23112223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112223barEv,_ZThn20_N3aaa9GG23112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23112223barEv,_ZThn28_N3aaa9GG23112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311222E[];
Class_Descriptor cd__ZN3aaa9GG2311222E = {  "_ZN3aaa9GG2311222E", // class name
  bases__ZN3aaa9GG2311222E, 6,
  &(vtc__ZN3aaa9GG2311222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311223  : ::aaa::EE231 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23112233fooEv
  virtual void  bar(); // _ZN3aaa9GG23112233barEv
  ~GG2311223(); // tgen
  GG2311223(); // tgen
};
//SIG(1 _ZN3aaa9GG2311223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23112233fooEv");}
void  aaa::GG2311223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23112233barEv");}
aaa::GG2311223 ::~GG2311223(){ note_dtor("_ZN3aaa9GG2311223E", this);} // tgen
aaa::GG2311223 ::GG2311223(){ note_ctor("_ZN3aaa9GG2311223E", this);} // tgen
}
static void Test__ZN3aaa9GG2311223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311223E, buf);
    ::aaa::GG2311223 *dp, &lv = *(dp=new (buf) ::aaa::GG2311223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311223E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2311223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2311223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2311223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311223E);
    dp->::aaa::GG2311223::~GG2311223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311223E(Test__ZN3aaa9GG2311223E, "_ZN3aaa9GG2311223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311223C1Ev();
extern void _ZN3aaa9GG2311223D1Ev();
Name_Map name_map__ZN3aaa9GG2311223E[] = {
  NSPAIR(_ZN3aaa9GG2311223C1Ev),
  NSPAIR(_ZN3aaa9GG2311223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2311223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311223E[];
extern void _ZN3aaa9GG23112233barEv();
extern void _ZN3aaa9GG23112233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23112233fooEv,_ZThn8_N3aaa9GG23112233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23112233barEv,_ZThn8_N3aaa9GG23112233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23112233fooEv,_ZThn20_N3aaa9GG23112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23112233barEv,_ZThn20_N3aaa9GG23112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23112233barEv,_ZThn28_N3aaa9GG23112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23112233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23112233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112233fooEv,_ZThn8_N3aaa9GG23112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112233barEv,_ZThn8_N3aaa9GG23112233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112233fooEv,_ZThn20_N3aaa9GG23112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112233barEv,_ZThn20_N3aaa9GG23112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23112233barEv,_ZThn28_N3aaa9GG23112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311223E[];
Class_Descriptor cd__ZN3aaa9GG2311223E = {  "_ZN3aaa9GG2311223E", // class name
  bases__ZN3aaa9GG2311223E, 6,
  &(vtc__ZN3aaa9GG2311223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311231  : ::aaa::EE231 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23112313fooEv
  ~GG2311231(); // tgen
  GG2311231(); // tgen
};
//SIG(1 _ZN3aaa9GG2311231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23112313fooEv");}
aaa::GG2311231 ::~GG2311231(){ note_dtor("_ZN3aaa9GG2311231E", this);} // tgen
aaa::GG2311231 ::GG2311231(){ note_ctor("_ZN3aaa9GG2311231E", this);} // tgen
}
static void Test__ZN3aaa9GG2311231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311231E, buf);
    ::aaa::GG2311231 *dp, &lv = *(dp=new (buf) ::aaa::GG2311231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311231E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2311231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2311231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2311231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311231E);
    dp->::aaa::GG2311231::~GG2311231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311231E(Test__ZN3aaa9GG2311231E, "_ZN3aaa9GG2311231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311231C1Ev();
extern void _ZN3aaa9GG2311231D1Ev();
Name_Map name_map__ZN3aaa9GG2311231E[] = {
  NSPAIR(_ZN3aaa9GG2311231C1Ev),
  NSPAIR(_ZN3aaa9GG2311231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2311231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23112313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23112313fooEv,_ZThn8_N3aaa9GG23112313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23112313fooEv,_ZThn20_N3aaa9GG23112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23112313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112313fooEv,_ZThn8_N3aaa9GG23112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112313fooEv,_ZThn20_N3aaa9GG23112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311231E[];
Class_Descriptor cd__ZN3aaa9GG2311231E = {  "_ZN3aaa9GG2311231E", // class name
  bases__ZN3aaa9GG2311231E, 6,
  &(vtc__ZN3aaa9GG2311231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311232  : ::aaa::EE231 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23112323barEv
  ~GG2311232(); // tgen
  GG2311232(); // tgen
};
//SIG(1 _ZN3aaa9GG2311232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23112323barEv");}
aaa::GG2311232 ::~GG2311232(){ note_dtor("_ZN3aaa9GG2311232E", this);} // tgen
aaa::GG2311232 ::GG2311232(){ note_ctor("_ZN3aaa9GG2311232E", this);} // tgen
}
static void Test__ZN3aaa9GG2311232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311232E, buf);
    ::aaa::GG2311232 *dp, &lv = *(dp=new (buf) ::aaa::GG2311232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311232E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2311232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2311232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2311232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311232E);
    dp->::aaa::GG2311232::~GG2311232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311232E(Test__ZN3aaa9GG2311232E, "_ZN3aaa9GG2311232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311232C1Ev();
extern void _ZN3aaa9GG2311232D1Ev();
Name_Map name_map__ZN3aaa9GG2311232E[] = {
  NSPAIR(_ZN3aaa9GG2311232C1Ev),
  NSPAIR(_ZN3aaa9GG2311232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2311232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311232E[];
extern void _ZN3aaa9GG23112323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23112323barEv,_ZThn8_N3aaa9GG23112323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23112323barEv,_ZThn20_N3aaa9GG23112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23112323barEv,_ZThn28_N3aaa9GG23112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23112323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112323barEv,_ZThn8_N3aaa9GG23112323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112323barEv,_ZThn20_N3aaa9GG23112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23112323barEv,_ZThn28_N3aaa9GG23112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311232E[];
Class_Descriptor cd__ZN3aaa9GG2311232E = {  "_ZN3aaa9GG2311232E", // class name
  bases__ZN3aaa9GG2311232E, 6,
  &(vtc__ZN3aaa9GG2311232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311233  : ::aaa::EE231 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23112333fooEv
  virtual void  bar(); // _ZN3aaa9GG23112333barEv
  ~GG2311233(); // tgen
  GG2311233(); // tgen
};
//SIG(1 _ZN3aaa9GG2311233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23112333fooEv");}
void  aaa::GG2311233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23112333barEv");}
aaa::GG2311233 ::~GG2311233(){ note_dtor("_ZN3aaa9GG2311233E", this);} // tgen
aaa::GG2311233 ::GG2311233(){ note_ctor("_ZN3aaa9GG2311233E", this);} // tgen
}
static void Test__ZN3aaa9GG2311233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311233E, buf);
    ::aaa::GG2311233 *dp, &lv = *(dp=new (buf) ::aaa::GG2311233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311233E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2311233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2311233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2311233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311233E);
    dp->::aaa::GG2311233::~GG2311233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311233E(Test__ZN3aaa9GG2311233E, "_ZN3aaa9GG2311233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311233C1Ev();
extern void _ZN3aaa9GG2311233D1Ev();
Name_Map name_map__ZN3aaa9GG2311233E[] = {
  NSPAIR(_ZN3aaa9GG2311233C1Ev),
  NSPAIR(_ZN3aaa9GG2311233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2311233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311233E[];
extern void _ZN3aaa9GG23112333barEv();
extern void _ZN3aaa9GG23112333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23112333fooEv,_ZThn8_N3aaa9GG23112333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23112333barEv,_ZThn8_N3aaa9GG23112333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23112333fooEv,_ZThn20_N3aaa9GG23112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23112333barEv,_ZThn20_N3aaa9GG23112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23112333barEv,_ZThn28_N3aaa9GG23112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23112333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23112333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112333fooEv,_ZThn8_N3aaa9GG23112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23112333barEv,_ZThn8_N3aaa9GG23112333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112333fooEv,_ZThn20_N3aaa9GG23112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23112333barEv,_ZThn20_N3aaa9GG23112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23112333barEv,_ZThn28_N3aaa9GG23112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311233E[];
Class_Descriptor cd__ZN3aaa9GG2311233E = {  "_ZN3aaa9GG2311233E", // class name
  bases__ZN3aaa9GG2311233E, 6,
  &(vtc__ZN3aaa9GG2311233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311311  : ::aaa::EE231 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23113113fooEv
  ~GG2311311(); // tgen
  GG2311311(); // tgen
};
//SIG(1 _ZN3aaa9GG2311311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23113113fooEv");}
aaa::GG2311311 ::~GG2311311(){ note_dtor("_ZN3aaa9GG2311311E", this);} // tgen
aaa::GG2311311 ::GG2311311(){ note_ctor("_ZN3aaa9GG2311311E", this);} // tgen
}
static void Test__ZN3aaa9GG2311311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311311E, buf);
    ::aaa::GG2311311 *dp, &lv = *(dp=new (buf) ::aaa::GG2311311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311311E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2311311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2311311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2311311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311311E);
    dp->::aaa::GG2311311::~GG2311311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311311E(Test__ZN3aaa9GG2311311E, "_ZN3aaa9GG2311311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311311C1Ev();
extern void _ZN3aaa9GG2311311D1Ev();
Name_Map name_map__ZN3aaa9GG2311311E[] = {
  NSPAIR(_ZN3aaa9GG2311311C1Ev),
  NSPAIR(_ZN3aaa9GG2311311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2311311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23113113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23113113fooEv,_ZThn8_N3aaa9GG23113113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23113113fooEv,_ZThn20_N3aaa9GG23113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113113fooEv,_ZThn28_N3aaa9GG23113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23113113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113113fooEv,_ZThn8_N3aaa9GG23113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113113fooEv,_ZThn20_N3aaa9GG23113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113113fooEv,_ZThn28_N3aaa9GG23113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311311E[];
Class_Descriptor cd__ZN3aaa9GG2311311E = {  "_ZN3aaa9GG2311311E", // class name
  bases__ZN3aaa9GG2311311E, 6,
  &(vtc__ZN3aaa9GG2311311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311312  : ::aaa::EE231 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23113123barEv
  ~GG2311312(); // tgen
  GG2311312(); // tgen
};
//SIG(1 _ZN3aaa9GG2311312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23113123barEv");}
aaa::GG2311312 ::~GG2311312(){ note_dtor("_ZN3aaa9GG2311312E", this);} // tgen
aaa::GG2311312 ::GG2311312(){ note_ctor("_ZN3aaa9GG2311312E", this);} // tgen
}
static void Test__ZN3aaa9GG2311312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311312E, buf);
    ::aaa::GG2311312 *dp, &lv = *(dp=new (buf) ::aaa::GG2311312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311312E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2311312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2311312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2311312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311312E);
    dp->::aaa::GG2311312::~GG2311312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311312E(Test__ZN3aaa9GG2311312E, "_ZN3aaa9GG2311312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311312C1Ev();
extern void _ZN3aaa9GG2311312D1Ev();
Name_Map name_map__ZN3aaa9GG2311312E[] = {
  NSPAIR(_ZN3aaa9GG2311312C1Ev),
  NSPAIR(_ZN3aaa9GG2311312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2311312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311312E[];
extern void _ZN3aaa9GG23113123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23113123barEv,_ZThn8_N3aaa9GG23113123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113123barEv,_ZThn28_N3aaa9GG23113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23113123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113123barEv,_ZThn8_N3aaa9GG23113123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113123barEv,_ZThn28_N3aaa9GG23113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311312E[];
Class_Descriptor cd__ZN3aaa9GG2311312E = {  "_ZN3aaa9GG2311312E", // class name
  bases__ZN3aaa9GG2311312E, 6,
  &(vtc__ZN3aaa9GG2311312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311313  : ::aaa::EE231 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23113133fooEv
  virtual void  bar(); // _ZN3aaa9GG23113133barEv
  ~GG2311313(); // tgen
  GG2311313(); // tgen
};
//SIG(1 _ZN3aaa9GG2311313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23113133fooEv");}
void  aaa::GG2311313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23113133barEv");}
aaa::GG2311313 ::~GG2311313(){ note_dtor("_ZN3aaa9GG2311313E", this);} // tgen
aaa::GG2311313 ::GG2311313(){ note_ctor("_ZN3aaa9GG2311313E", this);} // tgen
}
static void Test__ZN3aaa9GG2311313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311313E, buf);
    ::aaa::GG2311313 *dp, &lv = *(dp=new (buf) ::aaa::GG2311313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311313E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2311313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2311313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2311313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311313E);
    dp->::aaa::GG2311313::~GG2311313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311313E(Test__ZN3aaa9GG2311313E, "_ZN3aaa9GG2311313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311313C1Ev();
extern void _ZN3aaa9GG2311313D1Ev();
Name_Map name_map__ZN3aaa9GG2311313E[] = {
  NSPAIR(_ZN3aaa9GG2311313C1Ev),
  NSPAIR(_ZN3aaa9GG2311313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2311313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311313E[];
extern void _ZN3aaa9GG23113133barEv();
extern void _ZN3aaa9GG23113133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23113133fooEv,_ZThn8_N3aaa9GG23113133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23113133barEv,_ZThn8_N3aaa9GG23113133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23113133fooEv,_ZThn20_N3aaa9GG23113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113133fooEv,_ZThn28_N3aaa9GG23113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113133barEv,_ZThn28_N3aaa9GG23113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23113133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23113133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113133fooEv,_ZThn8_N3aaa9GG23113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113133barEv,_ZThn8_N3aaa9GG23113133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113133fooEv,_ZThn20_N3aaa9GG23113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113133fooEv,_ZThn28_N3aaa9GG23113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113133barEv,_ZThn28_N3aaa9GG23113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311313E[];
Class_Descriptor cd__ZN3aaa9GG2311313E = {  "_ZN3aaa9GG2311313E", // class name
  bases__ZN3aaa9GG2311313E, 6,
  &(vtc__ZN3aaa9GG2311313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311321  : ::aaa::EE231 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23113213fooEv
  ~GG2311321(); // tgen
  GG2311321(); // tgen
};
//SIG(1 _ZN3aaa9GG2311321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23113213fooEv");}
aaa::GG2311321 ::~GG2311321(){ note_dtor("_ZN3aaa9GG2311321E", this);} // tgen
aaa::GG2311321 ::GG2311321(){ note_ctor("_ZN3aaa9GG2311321E", this);} // tgen
}
static void Test__ZN3aaa9GG2311321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311321E, buf);
    ::aaa::GG2311321 *dp, &lv = *(dp=new (buf) ::aaa::GG2311321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311321E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2311321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2311321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2311321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311321E);
    dp->::aaa::GG2311321::~GG2311321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311321E(Test__ZN3aaa9GG2311321E, "_ZN3aaa9GG2311321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311321C1Ev();
extern void _ZN3aaa9GG2311321D1Ev();
Name_Map name_map__ZN3aaa9GG2311321E[] = {
  NSPAIR(_ZN3aaa9GG2311321C1Ev),
  NSPAIR(_ZN3aaa9GG2311321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2311321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23113213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23113213fooEv,_ZThn8_N3aaa9GG23113213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23113213fooEv,_ZThn20_N3aaa9GG23113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23113213fooEv,_ZThn28_N3aaa9GG23113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23113213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113213fooEv,_ZThn8_N3aaa9GG23113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113213fooEv,_ZThn20_N3aaa9GG23113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113213fooEv,_ZThn28_N3aaa9GG23113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311321E[];
Class_Descriptor cd__ZN3aaa9GG2311321E = {  "_ZN3aaa9GG2311321E", // class name
  bases__ZN3aaa9GG2311321E, 6,
  &(vtc__ZN3aaa9GG2311321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311322  : ::aaa::EE231 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23113223barEv
  ~GG2311322(); // tgen
  GG2311322(); // tgen
};
//SIG(1 _ZN3aaa9GG2311322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23113223barEv");}
aaa::GG2311322 ::~GG2311322(){ note_dtor("_ZN3aaa9GG2311322E", this);} // tgen
aaa::GG2311322 ::GG2311322(){ note_ctor("_ZN3aaa9GG2311322E", this);} // tgen
}
static void Test__ZN3aaa9GG2311322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311322E, buf);
    ::aaa::GG2311322 *dp, &lv = *(dp=new (buf) ::aaa::GG2311322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311322E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2311322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2311322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2311322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311322E);
    dp->::aaa::GG2311322::~GG2311322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311322E(Test__ZN3aaa9GG2311322E, "_ZN3aaa9GG2311322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311322C1Ev();
extern void _ZN3aaa9GG2311322D1Ev();
Name_Map name_map__ZN3aaa9GG2311322E[] = {
  NSPAIR(_ZN3aaa9GG2311322C1Ev),
  NSPAIR(_ZN3aaa9GG2311322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2311322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311322E[];
extern void _ZN3aaa9GG23113223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23113223barEv,_ZThn8_N3aaa9GG23113223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23113223barEv,_ZThn20_N3aaa9GG23113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23113223barEv,_ZThn28_N3aaa9GG23113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23113223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113223barEv,_ZThn8_N3aaa9GG23113223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113223barEv,_ZThn20_N3aaa9GG23113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113223barEv,_ZThn28_N3aaa9GG23113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311322E[];
Class_Descriptor cd__ZN3aaa9GG2311322E = {  "_ZN3aaa9GG2311322E", // class name
  bases__ZN3aaa9GG2311322E, 6,
  &(vtc__ZN3aaa9GG2311322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311323  : ::aaa::EE231 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23113233fooEv
  virtual void  bar(); // _ZN3aaa9GG23113233barEv
  ~GG2311323(); // tgen
  GG2311323(); // tgen
};
//SIG(1 _ZN3aaa9GG2311323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23113233fooEv");}
void  aaa::GG2311323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23113233barEv");}
aaa::GG2311323 ::~GG2311323(){ note_dtor("_ZN3aaa9GG2311323E", this);} // tgen
aaa::GG2311323 ::GG2311323(){ note_ctor("_ZN3aaa9GG2311323E", this);} // tgen
}
static void Test__ZN3aaa9GG2311323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311323E, buf);
    ::aaa::GG2311323 *dp, &lv = *(dp=new (buf) ::aaa::GG2311323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311323E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2311323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2311323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2311323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311323E);
    dp->::aaa::GG2311323::~GG2311323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311323E(Test__ZN3aaa9GG2311323E, "_ZN3aaa9GG2311323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311323C1Ev();
extern void _ZN3aaa9GG2311323D1Ev();
Name_Map name_map__ZN3aaa9GG2311323E[] = {
  NSPAIR(_ZN3aaa9GG2311323C1Ev),
  NSPAIR(_ZN3aaa9GG2311323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2311323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311323E[];
extern void _ZN3aaa9GG23113233barEv();
extern void _ZN3aaa9GG23113233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23113233fooEv,_ZThn8_N3aaa9GG23113233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23113233barEv,_ZThn8_N3aaa9GG23113233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23113233fooEv,_ZThn20_N3aaa9GG23113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23113233barEv,_ZThn20_N3aaa9GG23113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113233fooEv,_ZThn28_N3aaa9GG23113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113233barEv,_ZThn28_N3aaa9GG23113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23113233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23113233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113233fooEv,_ZThn8_N3aaa9GG23113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113233barEv,_ZThn8_N3aaa9GG23113233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113233fooEv,_ZThn20_N3aaa9GG23113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113233barEv,_ZThn20_N3aaa9GG23113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113233fooEv,_ZThn28_N3aaa9GG23113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113233barEv,_ZThn28_N3aaa9GG23113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311323E[];
Class_Descriptor cd__ZN3aaa9GG2311323E = {  "_ZN3aaa9GG2311323E", // class name
  bases__ZN3aaa9GG2311323E, 6,
  &(vtc__ZN3aaa9GG2311323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311331  : ::aaa::EE231 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23113313fooEv
  ~GG2311331(); // tgen
  GG2311331(); // tgen
};
//SIG(1 _ZN3aaa9GG2311331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23113313fooEv");}
aaa::GG2311331 ::~GG2311331(){ note_dtor("_ZN3aaa9GG2311331E", this);} // tgen
aaa::GG2311331 ::GG2311331(){ note_ctor("_ZN3aaa9GG2311331E", this);} // tgen
}
static void Test__ZN3aaa9GG2311331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311331E, buf);
    ::aaa::GG2311331 *dp, &lv = *(dp=new (buf) ::aaa::GG2311331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311331E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2311331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2311331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2311331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311331E);
    dp->::aaa::GG2311331::~GG2311331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311331E(Test__ZN3aaa9GG2311331E, "_ZN3aaa9GG2311331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311331C1Ev();
extern void _ZN3aaa9GG2311331D1Ev();
Name_Map name_map__ZN3aaa9GG2311331E[] = {
  NSPAIR(_ZN3aaa9GG2311331C1Ev),
  NSPAIR(_ZN3aaa9GG2311331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2311331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23113313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23113313fooEv,_ZThn8_N3aaa9GG23113313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23113313fooEv,_ZThn20_N3aaa9GG23113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23113313fooEv,_ZThn28_N3aaa9GG23113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23113313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113313fooEv,_ZThn8_N3aaa9GG23113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113313fooEv,_ZThn20_N3aaa9GG23113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113313fooEv,_ZThn28_N3aaa9GG23113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311331E[];
Class_Descriptor cd__ZN3aaa9GG2311331E = {  "_ZN3aaa9GG2311331E", // class name
  bases__ZN3aaa9GG2311331E, 6,
  &(vtc__ZN3aaa9GG2311331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311332  : ::aaa::EE231 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23113323barEv
  ~GG2311332(); // tgen
  GG2311332(); // tgen
};
//SIG(1 _ZN3aaa9GG2311332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2311332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23113323barEv");}
aaa::GG2311332 ::~GG2311332(){ note_dtor("_ZN3aaa9GG2311332E", this);} // tgen
aaa::GG2311332 ::GG2311332(){ note_ctor("_ZN3aaa9GG2311332E", this);} // tgen
}
static void Test__ZN3aaa9GG2311332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311332E, buf);
    ::aaa::GG2311332 *dp, &lv = *(dp=new (buf) ::aaa::GG2311332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311332E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2311332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2311332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2311332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311332E);
    dp->::aaa::GG2311332::~GG2311332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311332E(Test__ZN3aaa9GG2311332E, "_ZN3aaa9GG2311332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311332C1Ev();
extern void _ZN3aaa9GG2311332D1Ev();
Name_Map name_map__ZN3aaa9GG2311332E[] = {
  NSPAIR(_ZN3aaa9GG2311332C1Ev),
  NSPAIR(_ZN3aaa9GG2311332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2311332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311332E[];
extern void _ZN3aaa9GG23113323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23113323barEv,_ZThn8_N3aaa9GG23113323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23113323barEv,_ZThn20_N3aaa9GG23113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113323barEv,_ZThn28_N3aaa9GG23113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23113323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113323barEv,_ZThn8_N3aaa9GG23113323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113323barEv,_ZThn20_N3aaa9GG23113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113323barEv,_ZThn28_N3aaa9GG23113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311332E[];
Class_Descriptor cd__ZN3aaa9GG2311332E = {  "_ZN3aaa9GG2311332E", // class name
  bases__ZN3aaa9GG2311332E, 6,
  &(vtc__ZN3aaa9GG2311332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2311333  : ::aaa::EE231 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23113333fooEv
  virtual void  bar(); // _ZN3aaa9GG23113333barEv
  ~GG2311333(); // tgen
  GG2311333(); // tgen
};
//SIG(1 _ZN3aaa9GG2311333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2311333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23113333fooEv");}
void  aaa::GG2311333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23113333barEv");}
aaa::GG2311333 ::~GG2311333(){ note_dtor("_ZN3aaa9GG2311333E", this);} // tgen
aaa::GG2311333 ::GG2311333(){ note_ctor("_ZN3aaa9GG2311333E", this);} // tgen
}
static void Test__ZN3aaa9GG2311333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2311333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2311333E, buf);
    ::aaa::GG2311333 *dp, &lv = *(dp=new (buf) ::aaa::GG2311333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2311333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2311333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2311333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2311333E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2311333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2311333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2311333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2311333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2311333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2311333E);
    dp->::aaa::GG2311333::~GG2311333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2311333E(Test__ZN3aaa9GG2311333E, "_ZN3aaa9GG2311333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2311333C1Ev();
extern void _ZN3aaa9GG2311333D1Ev();
Name_Map name_map__ZN3aaa9GG2311333E[] = {
  NSPAIR(_ZN3aaa9GG2311333C1Ev),
  NSPAIR(_ZN3aaa9GG2311333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2311333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2311333E[];
extern void _ZN3aaa9GG23113333barEv();
extern void _ZN3aaa9GG23113333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23113333fooEv,_ZThn8_N3aaa9GG23113333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23113333barEv,_ZThn8_N3aaa9GG23113333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23113333fooEv,_ZThn20_N3aaa9GG23113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23113333barEv,_ZThn20_N3aaa9GG23113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113333fooEv,_ZThn28_N3aaa9GG23113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23113333barEv,_ZThn28_N3aaa9GG23113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2311333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23113333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23113333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113333fooEv,_ZThn8_N3aaa9GG23113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23113333barEv,_ZThn8_N3aaa9GG23113333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113333fooEv,_ZThn20_N3aaa9GG23113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23113333barEv,_ZThn20_N3aaa9GG23113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113333fooEv,_ZThn28_N3aaa9GG23113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23113333barEv,_ZThn28_N3aaa9GG23113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2311333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2311333E[];
Class_Descriptor cd__ZN3aaa9GG2311333E = {  "_ZN3aaa9GG2311333E", // class name
  bases__ZN3aaa9GG2311333E, 6,
  &(vtc__ZN3aaa9GG2311333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2311333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2311333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312111  : ::aaa::EE231 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23121113fooEv
  ~GG2312111(); // tgen
  GG2312111(); // tgen
};
//SIG(1 _ZN3aaa9GG2312111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23121113fooEv");}
aaa::GG2312111 ::~GG2312111(){ note_dtor("_ZN3aaa9GG2312111E", this);} // tgen
aaa::GG2312111 ::GG2312111(){ note_ctor("_ZN3aaa9GG2312111E", this);} // tgen
}
static void Test__ZN3aaa9GG2312111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312111E, buf);
    ::aaa::GG2312111 *dp, &lv = *(dp=new (buf) ::aaa::GG2312111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312111E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2312111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2312111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2312111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312111E);
    dp->::aaa::GG2312111::~GG2312111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312111E(Test__ZN3aaa9GG2312111E, "_ZN3aaa9GG2312111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312111C1Ev();
extern void _ZN3aaa9GG2312111D1Ev();
Name_Map name_map__ZN3aaa9GG2312111E[] = {
  NSPAIR(_ZN3aaa9GG2312111C1Ev),
  NSPAIR(_ZN3aaa9GG2312111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2312111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23121113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23121113fooEv,_ZThn8_N3aaa9GG23121113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23121113fooEv,_ZThn20_N3aaa9GG23121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23121113fooEv,_ZThn28_N3aaa9GG23121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23121113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121113fooEv,_ZThn8_N3aaa9GG23121113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121113fooEv,_ZThn20_N3aaa9GG23121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23121113fooEv,_ZThn28_N3aaa9GG23121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312111E[];
Class_Descriptor cd__ZN3aaa9GG2312111E = {  "_ZN3aaa9GG2312111E", // class name
  bases__ZN3aaa9GG2312111E, 6,
  &(vtc__ZN3aaa9GG2312111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312112  : ::aaa::EE231 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23121123barEv
  ~GG2312112(); // tgen
  GG2312112(); // tgen
};
//SIG(1 _ZN3aaa9GG2312112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23121123barEv");}
aaa::GG2312112 ::~GG2312112(){ note_dtor("_ZN3aaa9GG2312112E", this);} // tgen
aaa::GG2312112 ::GG2312112(){ note_ctor("_ZN3aaa9GG2312112E", this);} // tgen
}
static void Test__ZN3aaa9GG2312112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312112E, buf);
    ::aaa::GG2312112 *dp, &lv = *(dp=new (buf) ::aaa::GG2312112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312112E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2312112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2312112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2312112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312112E);
    dp->::aaa::GG2312112::~GG2312112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312112E(Test__ZN3aaa9GG2312112E, "_ZN3aaa9GG2312112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312112C1Ev();
extern void _ZN3aaa9GG2312112D1Ev();
Name_Map name_map__ZN3aaa9GG2312112E[] = {
  NSPAIR(_ZN3aaa9GG2312112C1Ev),
  NSPAIR(_ZN3aaa9GG2312112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2312112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312112E[];
extern void _ZN3aaa9GG23121123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23121123barEv,_ZThn8_N3aaa9GG23121123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23121123barEv,_ZThn20_N3aaa9GG23121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23121123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121123barEv,_ZThn8_N3aaa9GG23121123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121123barEv,_ZThn20_N3aaa9GG23121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312112E[];
Class_Descriptor cd__ZN3aaa9GG2312112E = {  "_ZN3aaa9GG2312112E", // class name
  bases__ZN3aaa9GG2312112E, 6,
  &(vtc__ZN3aaa9GG2312112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312113  : ::aaa::EE231 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23121133fooEv
  virtual void  bar(); // _ZN3aaa9GG23121133barEv
  ~GG2312113(); // tgen
  GG2312113(); // tgen
};
//SIG(1 _ZN3aaa9GG2312113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23121133fooEv");}
void  aaa::GG2312113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23121133barEv");}
aaa::GG2312113 ::~GG2312113(){ note_dtor("_ZN3aaa9GG2312113E", this);} // tgen
aaa::GG2312113 ::GG2312113(){ note_ctor("_ZN3aaa9GG2312113E", this);} // tgen
}
static void Test__ZN3aaa9GG2312113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312113E, buf);
    ::aaa::GG2312113 *dp, &lv = *(dp=new (buf) ::aaa::GG2312113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312113E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2312113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2312113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2312113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312113E);
    dp->::aaa::GG2312113::~GG2312113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312113E(Test__ZN3aaa9GG2312113E, "_ZN3aaa9GG2312113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312113C1Ev();
extern void _ZN3aaa9GG2312113D1Ev();
Name_Map name_map__ZN3aaa9GG2312113E[] = {
  NSPAIR(_ZN3aaa9GG2312113C1Ev),
  NSPAIR(_ZN3aaa9GG2312113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2312113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312113E[];
extern void _ZN3aaa9GG23121133barEv();
extern void _ZN3aaa9GG23121133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23121133fooEv,_ZThn8_N3aaa9GG23121133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23121133barEv,_ZThn8_N3aaa9GG23121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23121133barEv,_ZThn20_N3aaa9GG23121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23121133fooEv,_ZThn20_N3aaa9GG23121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23121133fooEv,_ZThn28_N3aaa9GG23121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23121133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23121133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121133fooEv,_ZThn8_N3aaa9GG23121133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121133barEv,_ZThn8_N3aaa9GG23121133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121133barEv,_ZThn20_N3aaa9GG23121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121133fooEv,_ZThn20_N3aaa9GG23121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23121133fooEv,_ZThn28_N3aaa9GG23121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312113E[];
Class_Descriptor cd__ZN3aaa9GG2312113E = {  "_ZN3aaa9GG2312113E", // class name
  bases__ZN3aaa9GG2312113E, 6,
  &(vtc__ZN3aaa9GG2312113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312121  : ::aaa::EE231 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23121213fooEv
  ~GG2312121(); // tgen
  GG2312121(); // tgen
};
//SIG(1 _ZN3aaa9GG2312121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23121213fooEv");}
aaa::GG2312121 ::~GG2312121(){ note_dtor("_ZN3aaa9GG2312121E", this);} // tgen
aaa::GG2312121 ::GG2312121(){ note_ctor("_ZN3aaa9GG2312121E", this);} // tgen
}
static void Test__ZN3aaa9GG2312121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312121E, buf);
    ::aaa::GG2312121 *dp, &lv = *(dp=new (buf) ::aaa::GG2312121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312121E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2312121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2312121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2312121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312121E);
    dp->::aaa::GG2312121::~GG2312121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312121E(Test__ZN3aaa9GG2312121E, "_ZN3aaa9GG2312121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312121C1Ev();
extern void _ZN3aaa9GG2312121D1Ev();
Name_Map name_map__ZN3aaa9GG2312121E[] = {
  NSPAIR(_ZN3aaa9GG2312121C1Ev),
  NSPAIR(_ZN3aaa9GG2312121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2312121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23121213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23121213fooEv,_ZThn8_N3aaa9GG23121213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23121213fooEv,_ZThn28_N3aaa9GG23121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23121213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121213fooEv,_ZThn8_N3aaa9GG23121213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23121213fooEv,_ZThn28_N3aaa9GG23121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312121E[];
Class_Descriptor cd__ZN3aaa9GG2312121E = {  "_ZN3aaa9GG2312121E", // class name
  bases__ZN3aaa9GG2312121E, 6,
  &(vtc__ZN3aaa9GG2312121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312122  : ::aaa::EE231 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23121223barEv
  ~GG2312122(); // tgen
  GG2312122(); // tgen
};
//SIG(1 _ZN3aaa9GG2312122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23121223barEv");}
aaa::GG2312122 ::~GG2312122(){ note_dtor("_ZN3aaa9GG2312122E", this);} // tgen
aaa::GG2312122 ::GG2312122(){ note_ctor("_ZN3aaa9GG2312122E", this);} // tgen
}
static void Test__ZN3aaa9GG2312122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312122E, buf);
    ::aaa::GG2312122 *dp, &lv = *(dp=new (buf) ::aaa::GG2312122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312122E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2312122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2312122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2312122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312122E);
    dp->::aaa::GG2312122::~GG2312122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312122E(Test__ZN3aaa9GG2312122E, "_ZN3aaa9GG2312122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312122C1Ev();
extern void _ZN3aaa9GG2312122D1Ev();
Name_Map name_map__ZN3aaa9GG2312122E[] = {
  NSPAIR(_ZN3aaa9GG2312122C1Ev),
  NSPAIR(_ZN3aaa9GG2312122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2312122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312122E[];
extern void _ZN3aaa9GG23121223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23121223barEv,_ZThn8_N3aaa9GG23121223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23121223barEv,_ZThn20_N3aaa9GG23121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23121223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121223barEv,_ZThn8_N3aaa9GG23121223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121223barEv,_ZThn20_N3aaa9GG23121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312122E[];
Class_Descriptor cd__ZN3aaa9GG2312122E = {  "_ZN3aaa9GG2312122E", // class name
  bases__ZN3aaa9GG2312122E, 6,
  &(vtc__ZN3aaa9GG2312122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312123  : ::aaa::EE231 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23121233fooEv
  virtual void  bar(); // _ZN3aaa9GG23121233barEv
  ~GG2312123(); // tgen
  GG2312123(); // tgen
};
//SIG(1 _ZN3aaa9GG2312123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23121233fooEv");}
void  aaa::GG2312123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23121233barEv");}
aaa::GG2312123 ::~GG2312123(){ note_dtor("_ZN3aaa9GG2312123E", this);} // tgen
aaa::GG2312123 ::GG2312123(){ note_ctor("_ZN3aaa9GG2312123E", this);} // tgen
}
static void Test__ZN3aaa9GG2312123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312123E, buf);
    ::aaa::GG2312123 *dp, &lv = *(dp=new (buf) ::aaa::GG2312123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312123E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2312123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2312123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2312123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312123E);
    dp->::aaa::GG2312123::~GG2312123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312123E(Test__ZN3aaa9GG2312123E, "_ZN3aaa9GG2312123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312123C1Ev();
extern void _ZN3aaa9GG2312123D1Ev();
Name_Map name_map__ZN3aaa9GG2312123E[] = {
  NSPAIR(_ZN3aaa9GG2312123C1Ev),
  NSPAIR(_ZN3aaa9GG2312123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2312123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312123E[];
extern void _ZN3aaa9GG23121233barEv();
extern void _ZN3aaa9GG23121233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23121233fooEv,_ZThn8_N3aaa9GG23121233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23121233barEv,_ZThn8_N3aaa9GG23121233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23121233barEv,_ZThn20_N3aaa9GG23121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23121233fooEv,_ZThn28_N3aaa9GG23121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23121233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23121233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121233fooEv,_ZThn8_N3aaa9GG23121233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121233barEv,_ZThn8_N3aaa9GG23121233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121233barEv,_ZThn20_N3aaa9GG23121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23121233fooEv,_ZThn28_N3aaa9GG23121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312123E[];
Class_Descriptor cd__ZN3aaa9GG2312123E = {  "_ZN3aaa9GG2312123E", // class name
  bases__ZN3aaa9GG2312123E, 6,
  &(vtc__ZN3aaa9GG2312123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312131  : ::aaa::EE231 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23121313fooEv
  ~GG2312131(); // tgen
  GG2312131(); // tgen
};
//SIG(1 _ZN3aaa9GG2312131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23121313fooEv");}
aaa::GG2312131 ::~GG2312131(){ note_dtor("_ZN3aaa9GG2312131E", this);} // tgen
aaa::GG2312131 ::GG2312131(){ note_ctor("_ZN3aaa9GG2312131E", this);} // tgen
}
static void Test__ZN3aaa9GG2312131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312131E, buf);
    ::aaa::GG2312131 *dp, &lv = *(dp=new (buf) ::aaa::GG2312131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312131E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2312131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2312131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2312131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312131E);
    dp->::aaa::GG2312131::~GG2312131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312131E(Test__ZN3aaa9GG2312131E, "_ZN3aaa9GG2312131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312131C1Ev();
extern void _ZN3aaa9GG2312131D1Ev();
Name_Map name_map__ZN3aaa9GG2312131E[] = {
  NSPAIR(_ZN3aaa9GG2312131C1Ev),
  NSPAIR(_ZN3aaa9GG2312131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2312131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23121313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23121313fooEv,_ZThn8_N3aaa9GG23121313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23121313fooEv,_ZThn20_N3aaa9GG23121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23121313fooEv,_ZThn28_N3aaa9GG23121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23121313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121313fooEv,_ZThn8_N3aaa9GG23121313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121313fooEv,_ZThn20_N3aaa9GG23121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23121313fooEv,_ZThn28_N3aaa9GG23121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312131E[];
Class_Descriptor cd__ZN3aaa9GG2312131E = {  "_ZN3aaa9GG2312131E", // class name
  bases__ZN3aaa9GG2312131E, 6,
  &(vtc__ZN3aaa9GG2312131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312132  : ::aaa::EE231 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23121323barEv
  ~GG2312132(); // tgen
  GG2312132(); // tgen
};
//SIG(1 _ZN3aaa9GG2312132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23121323barEv");}
aaa::GG2312132 ::~GG2312132(){ note_dtor("_ZN3aaa9GG2312132E", this);} // tgen
aaa::GG2312132 ::GG2312132(){ note_ctor("_ZN3aaa9GG2312132E", this);} // tgen
}
static void Test__ZN3aaa9GG2312132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312132E, buf);
    ::aaa::GG2312132 *dp, &lv = *(dp=new (buf) ::aaa::GG2312132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312132E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2312132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2312132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2312132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312132E);
    dp->::aaa::GG2312132::~GG2312132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312132E(Test__ZN3aaa9GG2312132E, "_ZN3aaa9GG2312132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312132C1Ev();
extern void _ZN3aaa9GG2312132D1Ev();
Name_Map name_map__ZN3aaa9GG2312132E[] = {
  NSPAIR(_ZN3aaa9GG2312132C1Ev),
  NSPAIR(_ZN3aaa9GG2312132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2312132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312132E[];
extern void _ZN3aaa9GG23121323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23121323barEv,_ZThn8_N3aaa9GG23121323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23121323barEv,_ZThn20_N3aaa9GG23121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23121323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121323barEv,_ZThn8_N3aaa9GG23121323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121323barEv,_ZThn20_N3aaa9GG23121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312132E[];
Class_Descriptor cd__ZN3aaa9GG2312132E = {  "_ZN3aaa9GG2312132E", // class name
  bases__ZN3aaa9GG2312132E, 6,
  &(vtc__ZN3aaa9GG2312132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312133  : ::aaa::EE231 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23121333fooEv
  virtual void  bar(); // _ZN3aaa9GG23121333barEv
  ~GG2312133(); // tgen
  GG2312133(); // tgen
};
//SIG(1 _ZN3aaa9GG2312133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23121333fooEv");}
void  aaa::GG2312133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23121333barEv");}
aaa::GG2312133 ::~GG2312133(){ note_dtor("_ZN3aaa9GG2312133E", this);} // tgen
aaa::GG2312133 ::GG2312133(){ note_ctor("_ZN3aaa9GG2312133E", this);} // tgen
}
static void Test__ZN3aaa9GG2312133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312133E, buf);
    ::aaa::GG2312133 *dp, &lv = *(dp=new (buf) ::aaa::GG2312133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312133E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2312133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2312133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2312133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312133E);
    dp->::aaa::GG2312133::~GG2312133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312133E(Test__ZN3aaa9GG2312133E, "_ZN3aaa9GG2312133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312133C1Ev();
extern void _ZN3aaa9GG2312133D1Ev();
Name_Map name_map__ZN3aaa9GG2312133E[] = {
  NSPAIR(_ZN3aaa9GG2312133C1Ev),
  NSPAIR(_ZN3aaa9GG2312133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2312133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312133E[];
extern void _ZN3aaa9GG23121333barEv();
extern void _ZN3aaa9GG23121333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23121333fooEv,_ZThn8_N3aaa9GG23121333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23121333barEv,_ZThn8_N3aaa9GG23121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23121333barEv,_ZThn20_N3aaa9GG23121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23121333fooEv,_ZThn20_N3aaa9GG23121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23121333fooEv,_ZThn28_N3aaa9GG23121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23121333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23121333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121333fooEv,_ZThn8_N3aaa9GG23121333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23121333barEv,_ZThn8_N3aaa9GG23121333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121333barEv,_ZThn20_N3aaa9GG23121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23121333fooEv,_ZThn20_N3aaa9GG23121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23121333fooEv,_ZThn28_N3aaa9GG23121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312133E[];
Class_Descriptor cd__ZN3aaa9GG2312133E = {  "_ZN3aaa9GG2312133E", // class name
  bases__ZN3aaa9GG2312133E, 6,
  &(vtc__ZN3aaa9GG2312133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312211  : ::aaa::EE231 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23122113fooEv
  ~GG2312211(); // tgen
  GG2312211(); // tgen
};
//SIG(1 _ZN3aaa9GG2312211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23122113fooEv");}
aaa::GG2312211 ::~GG2312211(){ note_dtor("_ZN3aaa9GG2312211E", this);} // tgen
aaa::GG2312211 ::GG2312211(){ note_ctor("_ZN3aaa9GG2312211E", this);} // tgen
}
static void Test__ZN3aaa9GG2312211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312211E, buf);
    ::aaa::GG2312211 *dp, &lv = *(dp=new (buf) ::aaa::GG2312211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312211E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2312211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2312211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2312211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312211E);
    dp->::aaa::GG2312211::~GG2312211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312211E(Test__ZN3aaa9GG2312211E, "_ZN3aaa9GG2312211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312211C1Ev();
extern void _ZN3aaa9GG2312211D1Ev();
Name_Map name_map__ZN3aaa9GG2312211E[] = {
  NSPAIR(_ZN3aaa9GG2312211C1Ev),
  NSPAIR(_ZN3aaa9GG2312211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2312211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23122113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23122113fooEv,_ZThn8_N3aaa9GG23122113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23122113fooEv,_ZThn20_N3aaa9GG23122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23122113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122113fooEv,_ZThn8_N3aaa9GG23122113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122113fooEv,_ZThn20_N3aaa9GG23122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312211E[];
Class_Descriptor cd__ZN3aaa9GG2312211E = {  "_ZN3aaa9GG2312211E", // class name
  bases__ZN3aaa9GG2312211E, 6,
  &(vtc__ZN3aaa9GG2312211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312212  : ::aaa::EE231 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23122123barEv
  ~GG2312212(); // tgen
  GG2312212(); // tgen
};
//SIG(1 _ZN3aaa9GG2312212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23122123barEv");}
aaa::GG2312212 ::~GG2312212(){ note_dtor("_ZN3aaa9GG2312212E", this);} // tgen
aaa::GG2312212 ::GG2312212(){ note_ctor("_ZN3aaa9GG2312212E", this);} // tgen
}
static void Test__ZN3aaa9GG2312212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312212E, buf);
    ::aaa::GG2312212 *dp, &lv = *(dp=new (buf) ::aaa::GG2312212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312212E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2312212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2312212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2312212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312212E);
    dp->::aaa::GG2312212::~GG2312212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312212E(Test__ZN3aaa9GG2312212E, "_ZN3aaa9GG2312212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312212C1Ev();
extern void _ZN3aaa9GG2312212D1Ev();
Name_Map name_map__ZN3aaa9GG2312212E[] = {
  NSPAIR(_ZN3aaa9GG2312212C1Ev),
  NSPAIR(_ZN3aaa9GG2312212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2312212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312212E[];
extern void _ZN3aaa9GG23122123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23122123barEv,_ZThn8_N3aaa9GG23122123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23122123barEv,_ZThn20_N3aaa9GG23122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23122123barEv,_ZThn28_N3aaa9GG23122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23122123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122123barEv,_ZThn8_N3aaa9GG23122123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122123barEv,_ZThn20_N3aaa9GG23122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23122123barEv,_ZThn28_N3aaa9GG23122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312212E[];
Class_Descriptor cd__ZN3aaa9GG2312212E = {  "_ZN3aaa9GG2312212E", // class name
  bases__ZN3aaa9GG2312212E, 6,
  &(vtc__ZN3aaa9GG2312212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312213  : ::aaa::EE231 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23122133fooEv
  virtual void  bar(); // _ZN3aaa9GG23122133barEv
  ~GG2312213(); // tgen
  GG2312213(); // tgen
};
//SIG(1 _ZN3aaa9GG2312213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23122133fooEv");}
void  aaa::GG2312213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23122133barEv");}
aaa::GG2312213 ::~GG2312213(){ note_dtor("_ZN3aaa9GG2312213E", this);} // tgen
aaa::GG2312213 ::GG2312213(){ note_ctor("_ZN3aaa9GG2312213E", this);} // tgen
}
static void Test__ZN3aaa9GG2312213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312213E, buf);
    ::aaa::GG2312213 *dp, &lv = *(dp=new (buf) ::aaa::GG2312213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312213E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2312213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2312213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2312213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312213E);
    dp->::aaa::GG2312213::~GG2312213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312213E(Test__ZN3aaa9GG2312213E, "_ZN3aaa9GG2312213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312213C1Ev();
extern void _ZN3aaa9GG2312213D1Ev();
Name_Map name_map__ZN3aaa9GG2312213E[] = {
  NSPAIR(_ZN3aaa9GG2312213C1Ev),
  NSPAIR(_ZN3aaa9GG2312213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2312213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312213E[];
extern void _ZN3aaa9GG23122133barEv();
extern void _ZN3aaa9GG23122133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23122133fooEv,_ZThn8_N3aaa9GG23122133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23122133barEv,_ZThn8_N3aaa9GG23122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23122133barEv,_ZThn20_N3aaa9GG23122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23122133fooEv,_ZThn20_N3aaa9GG23122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23122133barEv,_ZThn28_N3aaa9GG23122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23122133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23122133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122133fooEv,_ZThn8_N3aaa9GG23122133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122133barEv,_ZThn8_N3aaa9GG23122133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122133barEv,_ZThn20_N3aaa9GG23122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122133fooEv,_ZThn20_N3aaa9GG23122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23122133barEv,_ZThn28_N3aaa9GG23122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312213E[];
Class_Descriptor cd__ZN3aaa9GG2312213E = {  "_ZN3aaa9GG2312213E", // class name
  bases__ZN3aaa9GG2312213E, 6,
  &(vtc__ZN3aaa9GG2312213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312221  : ::aaa::EE231 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23122213fooEv
  ~GG2312221(); // tgen
  GG2312221(); // tgen
};
//SIG(1 _ZN3aaa9GG2312221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23122213fooEv");}
aaa::GG2312221 ::~GG2312221(){ note_dtor("_ZN3aaa9GG2312221E", this);} // tgen
aaa::GG2312221 ::GG2312221(){ note_ctor("_ZN3aaa9GG2312221E", this);} // tgen
}
static void Test__ZN3aaa9GG2312221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312221E, buf);
    ::aaa::GG2312221 *dp, &lv = *(dp=new (buf) ::aaa::GG2312221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312221E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2312221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2312221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2312221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312221E);
    dp->::aaa::GG2312221::~GG2312221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312221E(Test__ZN3aaa9GG2312221E, "_ZN3aaa9GG2312221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312221C1Ev();
extern void _ZN3aaa9GG2312221D1Ev();
Name_Map name_map__ZN3aaa9GG2312221E[] = {
  NSPAIR(_ZN3aaa9GG2312221C1Ev),
  NSPAIR(_ZN3aaa9GG2312221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2312221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23122213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23122213fooEv,_ZThn8_N3aaa9GG23122213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23122213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122213fooEv,_ZThn8_N3aaa9GG23122213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312221E[];
Class_Descriptor cd__ZN3aaa9GG2312221E = {  "_ZN3aaa9GG2312221E", // class name
  bases__ZN3aaa9GG2312221E, 6,
  &(vtc__ZN3aaa9GG2312221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312222  : ::aaa::EE231 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23122223barEv
  ~GG2312222(); // tgen
  GG2312222(); // tgen
};
//SIG(1 _ZN3aaa9GG2312222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23122223barEv");}
aaa::GG2312222 ::~GG2312222(){ note_dtor("_ZN3aaa9GG2312222E", this);} // tgen
aaa::GG2312222 ::GG2312222(){ note_ctor("_ZN3aaa9GG2312222E", this);} // tgen
}
static void Test__ZN3aaa9GG2312222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312222E, buf);
    ::aaa::GG2312222 *dp, &lv = *(dp=new (buf) ::aaa::GG2312222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312222E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2312222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2312222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2312222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312222E);
    dp->::aaa::GG2312222::~GG2312222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312222E(Test__ZN3aaa9GG2312222E, "_ZN3aaa9GG2312222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312222C1Ev();
extern void _ZN3aaa9GG2312222D1Ev();
Name_Map name_map__ZN3aaa9GG2312222E[] = {
  NSPAIR(_ZN3aaa9GG2312222C1Ev),
  NSPAIR(_ZN3aaa9GG2312222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2312222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312222E[];
extern void _ZN3aaa9GG23122223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23122223barEv,_ZThn8_N3aaa9GG23122223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23122223barEv,_ZThn20_N3aaa9GG23122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23122223barEv,_ZThn28_N3aaa9GG23122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23122223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122223barEv,_ZThn8_N3aaa9GG23122223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122223barEv,_ZThn20_N3aaa9GG23122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23122223barEv,_ZThn28_N3aaa9GG23122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312222E[];
Class_Descriptor cd__ZN3aaa9GG2312222E = {  "_ZN3aaa9GG2312222E", // class name
  bases__ZN3aaa9GG2312222E, 6,
  &(vtc__ZN3aaa9GG2312222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312223  : ::aaa::EE231 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23122233fooEv
  virtual void  bar(); // _ZN3aaa9GG23122233barEv
  ~GG2312223(); // tgen
  GG2312223(); // tgen
};
//SIG(1 _ZN3aaa9GG2312223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23122233fooEv");}
void  aaa::GG2312223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23122233barEv");}
aaa::GG2312223 ::~GG2312223(){ note_dtor("_ZN3aaa9GG2312223E", this);} // tgen
aaa::GG2312223 ::GG2312223(){ note_ctor("_ZN3aaa9GG2312223E", this);} // tgen
}
static void Test__ZN3aaa9GG2312223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312223E, buf);
    ::aaa::GG2312223 *dp, &lv = *(dp=new (buf) ::aaa::GG2312223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312223E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2312223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2312223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2312223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312223E);
    dp->::aaa::GG2312223::~GG2312223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312223E(Test__ZN3aaa9GG2312223E, "_ZN3aaa9GG2312223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312223C1Ev();
extern void _ZN3aaa9GG2312223D1Ev();
Name_Map name_map__ZN3aaa9GG2312223E[] = {
  NSPAIR(_ZN3aaa9GG2312223C1Ev),
  NSPAIR(_ZN3aaa9GG2312223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2312223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312223E[];
extern void _ZN3aaa9GG23122233barEv();
extern void _ZN3aaa9GG23122233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23122233fooEv,_ZThn8_N3aaa9GG23122233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23122233barEv,_ZThn8_N3aaa9GG23122233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23122233barEv,_ZThn20_N3aaa9GG23122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23122233barEv,_ZThn28_N3aaa9GG23122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23122233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23122233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122233fooEv,_ZThn8_N3aaa9GG23122233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122233barEv,_ZThn8_N3aaa9GG23122233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122233barEv,_ZThn20_N3aaa9GG23122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23122233barEv,_ZThn28_N3aaa9GG23122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312223E[];
Class_Descriptor cd__ZN3aaa9GG2312223E = {  "_ZN3aaa9GG2312223E", // class name
  bases__ZN3aaa9GG2312223E, 6,
  &(vtc__ZN3aaa9GG2312223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312231  : ::aaa::EE231 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23122313fooEv
  ~GG2312231(); // tgen
  GG2312231(); // tgen
};
//SIG(1 _ZN3aaa9GG2312231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23122313fooEv");}
aaa::GG2312231 ::~GG2312231(){ note_dtor("_ZN3aaa9GG2312231E", this);} // tgen
aaa::GG2312231 ::GG2312231(){ note_ctor("_ZN3aaa9GG2312231E", this);} // tgen
}
static void Test__ZN3aaa9GG2312231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312231E, buf);
    ::aaa::GG2312231 *dp, &lv = *(dp=new (buf) ::aaa::GG2312231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312231E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2312231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2312231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2312231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312231E);
    dp->::aaa::GG2312231::~GG2312231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312231E(Test__ZN3aaa9GG2312231E, "_ZN3aaa9GG2312231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312231C1Ev();
extern void _ZN3aaa9GG2312231D1Ev();
Name_Map name_map__ZN3aaa9GG2312231E[] = {
  NSPAIR(_ZN3aaa9GG2312231C1Ev),
  NSPAIR(_ZN3aaa9GG2312231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2312231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23122313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23122313fooEv,_ZThn8_N3aaa9GG23122313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23122313fooEv,_ZThn20_N3aaa9GG23122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23122313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122313fooEv,_ZThn8_N3aaa9GG23122313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122313fooEv,_ZThn20_N3aaa9GG23122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312231E[];
Class_Descriptor cd__ZN3aaa9GG2312231E = {  "_ZN3aaa9GG2312231E", // class name
  bases__ZN3aaa9GG2312231E, 6,
  &(vtc__ZN3aaa9GG2312231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312232  : ::aaa::EE231 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23122323barEv
  ~GG2312232(); // tgen
  GG2312232(); // tgen
};
//SIG(1 _ZN3aaa9GG2312232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23122323barEv");}
aaa::GG2312232 ::~GG2312232(){ note_dtor("_ZN3aaa9GG2312232E", this);} // tgen
aaa::GG2312232 ::GG2312232(){ note_ctor("_ZN3aaa9GG2312232E", this);} // tgen
}
static void Test__ZN3aaa9GG2312232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312232E, buf);
    ::aaa::GG2312232 *dp, &lv = *(dp=new (buf) ::aaa::GG2312232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312232E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2312232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2312232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2312232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312232E);
    dp->::aaa::GG2312232::~GG2312232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312232E(Test__ZN3aaa9GG2312232E, "_ZN3aaa9GG2312232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312232C1Ev();
extern void _ZN3aaa9GG2312232D1Ev();
Name_Map name_map__ZN3aaa9GG2312232E[] = {
  NSPAIR(_ZN3aaa9GG2312232C1Ev),
  NSPAIR(_ZN3aaa9GG2312232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2312232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312232E[];
extern void _ZN3aaa9GG23122323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23122323barEv,_ZThn8_N3aaa9GG23122323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23122323barEv,_ZThn20_N3aaa9GG23122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23122323barEv,_ZThn28_N3aaa9GG23122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23122323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122323barEv,_ZThn8_N3aaa9GG23122323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122323barEv,_ZThn20_N3aaa9GG23122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23122323barEv,_ZThn28_N3aaa9GG23122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312232E[];
Class_Descriptor cd__ZN3aaa9GG2312232E = {  "_ZN3aaa9GG2312232E", // class name
  bases__ZN3aaa9GG2312232E, 6,
  &(vtc__ZN3aaa9GG2312232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312233  : ::aaa::EE231 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23122333fooEv
  virtual void  bar(); // _ZN3aaa9GG23122333barEv
  ~GG2312233(); // tgen
  GG2312233(); // tgen
};
//SIG(1 _ZN3aaa9GG2312233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23122333fooEv");}
void  aaa::GG2312233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23122333barEv");}
aaa::GG2312233 ::~GG2312233(){ note_dtor("_ZN3aaa9GG2312233E", this);} // tgen
aaa::GG2312233 ::GG2312233(){ note_ctor("_ZN3aaa9GG2312233E", this);} // tgen
}
static void Test__ZN3aaa9GG2312233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312233E, buf);
    ::aaa::GG2312233 *dp, &lv = *(dp=new (buf) ::aaa::GG2312233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312233E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2312233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2312233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2312233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312233E);
    dp->::aaa::GG2312233::~GG2312233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312233E(Test__ZN3aaa9GG2312233E, "_ZN3aaa9GG2312233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312233C1Ev();
extern void _ZN3aaa9GG2312233D1Ev();
Name_Map name_map__ZN3aaa9GG2312233E[] = {
  NSPAIR(_ZN3aaa9GG2312233C1Ev),
  NSPAIR(_ZN3aaa9GG2312233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2312233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312233E[];
extern void _ZN3aaa9GG23122333barEv();
extern void _ZN3aaa9GG23122333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23122333fooEv,_ZThn8_N3aaa9GG23122333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23122333barEv,_ZThn8_N3aaa9GG23122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23122333barEv,_ZThn20_N3aaa9GG23122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23122333fooEv,_ZThn20_N3aaa9GG23122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23122333barEv,_ZThn28_N3aaa9GG23122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23122333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23122333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122333fooEv,_ZThn8_N3aaa9GG23122333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23122333barEv,_ZThn8_N3aaa9GG23122333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122333barEv,_ZThn20_N3aaa9GG23122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23122333fooEv,_ZThn20_N3aaa9GG23122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23122333barEv,_ZThn28_N3aaa9GG23122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312233E[];
Class_Descriptor cd__ZN3aaa9GG2312233E = {  "_ZN3aaa9GG2312233E", // class name
  bases__ZN3aaa9GG2312233E, 6,
  &(vtc__ZN3aaa9GG2312233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312311  : ::aaa::EE231 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23123113fooEv
  ~GG2312311(); // tgen
  GG2312311(); // tgen
};
//SIG(1 _ZN3aaa9GG2312311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23123113fooEv");}
aaa::GG2312311 ::~GG2312311(){ note_dtor("_ZN3aaa9GG2312311E", this);} // tgen
aaa::GG2312311 ::GG2312311(){ note_ctor("_ZN3aaa9GG2312311E", this);} // tgen
}
static void Test__ZN3aaa9GG2312311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312311E, buf);
    ::aaa::GG2312311 *dp, &lv = *(dp=new (buf) ::aaa::GG2312311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312311E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2312311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2312311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2312311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312311E);
    dp->::aaa::GG2312311::~GG2312311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312311E(Test__ZN3aaa9GG2312311E, "_ZN3aaa9GG2312311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312311C1Ev();
extern void _ZN3aaa9GG2312311D1Ev();
Name_Map name_map__ZN3aaa9GG2312311E[] = {
  NSPAIR(_ZN3aaa9GG2312311C1Ev),
  NSPAIR(_ZN3aaa9GG2312311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2312311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23123113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23123113fooEv,_ZThn8_N3aaa9GG23123113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23123113fooEv,_ZThn20_N3aaa9GG23123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123113fooEv,_ZThn28_N3aaa9GG23123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23123113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123113fooEv,_ZThn8_N3aaa9GG23123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123113fooEv,_ZThn20_N3aaa9GG23123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123113fooEv,_ZThn28_N3aaa9GG23123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312311E[];
Class_Descriptor cd__ZN3aaa9GG2312311E = {  "_ZN3aaa9GG2312311E", // class name
  bases__ZN3aaa9GG2312311E, 6,
  &(vtc__ZN3aaa9GG2312311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312312  : ::aaa::EE231 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23123123barEv
  ~GG2312312(); // tgen
  GG2312312(); // tgen
};
//SIG(1 _ZN3aaa9GG2312312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23123123barEv");}
aaa::GG2312312 ::~GG2312312(){ note_dtor("_ZN3aaa9GG2312312E", this);} // tgen
aaa::GG2312312 ::GG2312312(){ note_ctor("_ZN3aaa9GG2312312E", this);} // tgen
}
static void Test__ZN3aaa9GG2312312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312312E, buf);
    ::aaa::GG2312312 *dp, &lv = *(dp=new (buf) ::aaa::GG2312312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312312E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2312312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2312312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2312312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312312E);
    dp->::aaa::GG2312312::~GG2312312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312312E(Test__ZN3aaa9GG2312312E, "_ZN3aaa9GG2312312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312312C1Ev();
extern void _ZN3aaa9GG2312312D1Ev();
Name_Map name_map__ZN3aaa9GG2312312E[] = {
  NSPAIR(_ZN3aaa9GG2312312C1Ev),
  NSPAIR(_ZN3aaa9GG2312312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2312312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312312E[];
extern void _ZN3aaa9GG23123123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23123123barEv,_ZThn8_N3aaa9GG23123123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23123123barEv,_ZThn20_N3aaa9GG23123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123123barEv,_ZThn28_N3aaa9GG23123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23123123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123123barEv,_ZThn8_N3aaa9GG23123123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123123barEv,_ZThn20_N3aaa9GG23123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123123barEv,_ZThn28_N3aaa9GG23123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312312E[];
Class_Descriptor cd__ZN3aaa9GG2312312E = {  "_ZN3aaa9GG2312312E", // class name
  bases__ZN3aaa9GG2312312E, 6,
  &(vtc__ZN3aaa9GG2312312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312313  : ::aaa::EE231 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23123133fooEv
  virtual void  bar(); // _ZN3aaa9GG23123133barEv
  ~GG2312313(); // tgen
  GG2312313(); // tgen
};
//SIG(1 _ZN3aaa9GG2312313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23123133fooEv");}
void  aaa::GG2312313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23123133barEv");}
aaa::GG2312313 ::~GG2312313(){ note_dtor("_ZN3aaa9GG2312313E", this);} // tgen
aaa::GG2312313 ::GG2312313(){ note_ctor("_ZN3aaa9GG2312313E", this);} // tgen
}
static void Test__ZN3aaa9GG2312313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312313E, buf);
    ::aaa::GG2312313 *dp, &lv = *(dp=new (buf) ::aaa::GG2312313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312313E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2312313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2312313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2312313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312313E);
    dp->::aaa::GG2312313::~GG2312313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312313E(Test__ZN3aaa9GG2312313E, "_ZN3aaa9GG2312313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312313C1Ev();
extern void _ZN3aaa9GG2312313D1Ev();
Name_Map name_map__ZN3aaa9GG2312313E[] = {
  NSPAIR(_ZN3aaa9GG2312313C1Ev),
  NSPAIR(_ZN3aaa9GG2312313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2312313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312313E[];
extern void _ZN3aaa9GG23123133barEv();
extern void _ZN3aaa9GG23123133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23123133fooEv,_ZThn8_N3aaa9GG23123133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23123133barEv,_ZThn8_N3aaa9GG23123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23123133barEv,_ZThn20_N3aaa9GG23123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23123133fooEv,_ZThn20_N3aaa9GG23123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123133fooEv,_ZThn28_N3aaa9GG23123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123133barEv,_ZThn28_N3aaa9GG23123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23123133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23123133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123133fooEv,_ZThn8_N3aaa9GG23123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123133barEv,_ZThn8_N3aaa9GG23123133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123133barEv,_ZThn20_N3aaa9GG23123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123133fooEv,_ZThn20_N3aaa9GG23123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123133fooEv,_ZThn28_N3aaa9GG23123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123133barEv,_ZThn28_N3aaa9GG23123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312313E[];
Class_Descriptor cd__ZN3aaa9GG2312313E = {  "_ZN3aaa9GG2312313E", // class name
  bases__ZN3aaa9GG2312313E, 6,
  &(vtc__ZN3aaa9GG2312313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312321  : ::aaa::EE231 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23123213fooEv
  ~GG2312321(); // tgen
  GG2312321(); // tgen
};
//SIG(1 _ZN3aaa9GG2312321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23123213fooEv");}
aaa::GG2312321 ::~GG2312321(){ note_dtor("_ZN3aaa9GG2312321E", this);} // tgen
aaa::GG2312321 ::GG2312321(){ note_ctor("_ZN3aaa9GG2312321E", this);} // tgen
}
static void Test__ZN3aaa9GG2312321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312321E, buf);
    ::aaa::GG2312321 *dp, &lv = *(dp=new (buf) ::aaa::GG2312321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312321E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2312321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2312321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2312321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312321E);
    dp->::aaa::GG2312321::~GG2312321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312321E(Test__ZN3aaa9GG2312321E, "_ZN3aaa9GG2312321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312321C1Ev();
extern void _ZN3aaa9GG2312321D1Ev();
Name_Map name_map__ZN3aaa9GG2312321E[] = {
  NSPAIR(_ZN3aaa9GG2312321C1Ev),
  NSPAIR(_ZN3aaa9GG2312321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2312321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23123213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23123213fooEv,_ZThn8_N3aaa9GG23123213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23123213fooEv,_ZThn28_N3aaa9GG23123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23123213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123213fooEv,_ZThn8_N3aaa9GG23123213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123213fooEv,_ZThn28_N3aaa9GG23123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312321E[];
Class_Descriptor cd__ZN3aaa9GG2312321E = {  "_ZN3aaa9GG2312321E", // class name
  bases__ZN3aaa9GG2312321E, 6,
  &(vtc__ZN3aaa9GG2312321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312322  : ::aaa::EE231 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23123223barEv
  ~GG2312322(); // tgen
  GG2312322(); // tgen
};
//SIG(1 _ZN3aaa9GG2312322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23123223barEv");}
aaa::GG2312322 ::~GG2312322(){ note_dtor("_ZN3aaa9GG2312322E", this);} // tgen
aaa::GG2312322 ::GG2312322(){ note_ctor("_ZN3aaa9GG2312322E", this);} // tgen
}
static void Test__ZN3aaa9GG2312322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312322E, buf);
    ::aaa::GG2312322 *dp, &lv = *(dp=new (buf) ::aaa::GG2312322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312322E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2312322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2312322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2312322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312322E);
    dp->::aaa::GG2312322::~GG2312322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312322E(Test__ZN3aaa9GG2312322E, "_ZN3aaa9GG2312322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312322C1Ev();
extern void _ZN3aaa9GG2312322D1Ev();
Name_Map name_map__ZN3aaa9GG2312322E[] = {
  NSPAIR(_ZN3aaa9GG2312322C1Ev),
  NSPAIR(_ZN3aaa9GG2312322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2312322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312322E[];
extern void _ZN3aaa9GG23123223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23123223barEv,_ZThn8_N3aaa9GG23123223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23123223barEv,_ZThn20_N3aaa9GG23123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23123223barEv,_ZThn28_N3aaa9GG23123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23123223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123223barEv,_ZThn8_N3aaa9GG23123223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123223barEv,_ZThn20_N3aaa9GG23123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123223barEv,_ZThn28_N3aaa9GG23123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312322E[];
Class_Descriptor cd__ZN3aaa9GG2312322E = {  "_ZN3aaa9GG2312322E", // class name
  bases__ZN3aaa9GG2312322E, 6,
  &(vtc__ZN3aaa9GG2312322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312323  : ::aaa::EE231 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23123233fooEv
  virtual void  bar(); // _ZN3aaa9GG23123233barEv
  ~GG2312323(); // tgen
  GG2312323(); // tgen
};
//SIG(1 _ZN3aaa9GG2312323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23123233fooEv");}
void  aaa::GG2312323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23123233barEv");}
aaa::GG2312323 ::~GG2312323(){ note_dtor("_ZN3aaa9GG2312323E", this);} // tgen
aaa::GG2312323 ::GG2312323(){ note_ctor("_ZN3aaa9GG2312323E", this);} // tgen
}
static void Test__ZN3aaa9GG2312323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312323E, buf);
    ::aaa::GG2312323 *dp, &lv = *(dp=new (buf) ::aaa::GG2312323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312323E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2312323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2312323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2312323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312323E);
    dp->::aaa::GG2312323::~GG2312323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312323E(Test__ZN3aaa9GG2312323E, "_ZN3aaa9GG2312323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312323C1Ev();
extern void _ZN3aaa9GG2312323D1Ev();
Name_Map name_map__ZN3aaa9GG2312323E[] = {
  NSPAIR(_ZN3aaa9GG2312323C1Ev),
  NSPAIR(_ZN3aaa9GG2312323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2312323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312323E[];
extern void _ZN3aaa9GG23123233barEv();
extern void _ZN3aaa9GG23123233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23123233fooEv,_ZThn8_N3aaa9GG23123233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23123233barEv,_ZThn8_N3aaa9GG23123233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23123233barEv,_ZThn20_N3aaa9GG23123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123233fooEv,_ZThn28_N3aaa9GG23123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123233barEv,_ZThn28_N3aaa9GG23123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23123233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23123233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123233fooEv,_ZThn8_N3aaa9GG23123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123233barEv,_ZThn8_N3aaa9GG23123233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123233barEv,_ZThn20_N3aaa9GG23123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123233fooEv,_ZThn28_N3aaa9GG23123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123233barEv,_ZThn28_N3aaa9GG23123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312323E[];
Class_Descriptor cd__ZN3aaa9GG2312323E = {  "_ZN3aaa9GG2312323E", // class name
  bases__ZN3aaa9GG2312323E, 6,
  &(vtc__ZN3aaa9GG2312323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312331  : ::aaa::EE231 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23123313fooEv
  ~GG2312331(); // tgen
  GG2312331(); // tgen
};
//SIG(1 _ZN3aaa9GG2312331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23123313fooEv");}
aaa::GG2312331 ::~GG2312331(){ note_dtor("_ZN3aaa9GG2312331E", this);} // tgen
aaa::GG2312331 ::GG2312331(){ note_ctor("_ZN3aaa9GG2312331E", this);} // tgen
}
static void Test__ZN3aaa9GG2312331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312331E, buf);
    ::aaa::GG2312331 *dp, &lv = *(dp=new (buf) ::aaa::GG2312331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312331E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2312331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2312331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2312331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312331E);
    dp->::aaa::GG2312331::~GG2312331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312331E(Test__ZN3aaa9GG2312331E, "_ZN3aaa9GG2312331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312331C1Ev();
extern void _ZN3aaa9GG2312331D1Ev();
Name_Map name_map__ZN3aaa9GG2312331E[] = {
  NSPAIR(_ZN3aaa9GG2312331C1Ev),
  NSPAIR(_ZN3aaa9GG2312331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2312331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23123313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23123313fooEv,_ZThn8_N3aaa9GG23123313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23123313fooEv,_ZThn20_N3aaa9GG23123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123313fooEv,_ZThn28_N3aaa9GG23123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23123313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123313fooEv,_ZThn8_N3aaa9GG23123313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123313fooEv,_ZThn20_N3aaa9GG23123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123313fooEv,_ZThn28_N3aaa9GG23123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312331E[];
Class_Descriptor cd__ZN3aaa9GG2312331E = {  "_ZN3aaa9GG2312331E", // class name
  bases__ZN3aaa9GG2312331E, 6,
  &(vtc__ZN3aaa9GG2312331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312332  : ::aaa::EE231 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23123323barEv
  ~GG2312332(); // tgen
  GG2312332(); // tgen
};
//SIG(1 _ZN3aaa9GG2312332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2312332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23123323barEv");}
aaa::GG2312332 ::~GG2312332(){ note_dtor("_ZN3aaa9GG2312332E", this);} // tgen
aaa::GG2312332 ::GG2312332(){ note_ctor("_ZN3aaa9GG2312332E", this);} // tgen
}
static void Test__ZN3aaa9GG2312332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312332E, buf);
    ::aaa::GG2312332 *dp, &lv = *(dp=new (buf) ::aaa::GG2312332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312332E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2312332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2312332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2312332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312332E);
    dp->::aaa::GG2312332::~GG2312332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312332E(Test__ZN3aaa9GG2312332E, "_ZN3aaa9GG2312332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312332C1Ev();
extern void _ZN3aaa9GG2312332D1Ev();
Name_Map name_map__ZN3aaa9GG2312332E[] = {
  NSPAIR(_ZN3aaa9GG2312332C1Ev),
  NSPAIR(_ZN3aaa9GG2312332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2312332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312332E[];
extern void _ZN3aaa9GG23123323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23123323barEv,_ZThn8_N3aaa9GG23123323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23123323barEv,_ZThn20_N3aaa9GG23123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123323barEv,_ZThn28_N3aaa9GG23123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23123323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123323barEv,_ZThn8_N3aaa9GG23123323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123323barEv,_ZThn20_N3aaa9GG23123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123323barEv,_ZThn28_N3aaa9GG23123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312332E[];
Class_Descriptor cd__ZN3aaa9GG2312332E = {  "_ZN3aaa9GG2312332E", // class name
  bases__ZN3aaa9GG2312332E, 6,
  &(vtc__ZN3aaa9GG2312332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2312333  : ::aaa::EE231 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23123333fooEv
  virtual void  bar(); // _ZN3aaa9GG23123333barEv
  ~GG2312333(); // tgen
  GG2312333(); // tgen
};
//SIG(1 _ZN3aaa9GG2312333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2312333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23123333fooEv");}
void  aaa::GG2312333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23123333barEv");}
aaa::GG2312333 ::~GG2312333(){ note_dtor("_ZN3aaa9GG2312333E", this);} // tgen
aaa::GG2312333 ::GG2312333(){ note_ctor("_ZN3aaa9GG2312333E", this);} // tgen
}
static void Test__ZN3aaa9GG2312333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2312333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2312333E, buf);
    ::aaa::GG2312333 *dp, &lv = *(dp=new (buf) ::aaa::GG2312333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2312333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2312333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2312333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2312333E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2312333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2312333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2312333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2312333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2312333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2312333E);
    dp->::aaa::GG2312333::~GG2312333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2312333E(Test__ZN3aaa9GG2312333E, "_ZN3aaa9GG2312333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2312333C1Ev();
extern void _ZN3aaa9GG2312333D1Ev();
Name_Map name_map__ZN3aaa9GG2312333E[] = {
  NSPAIR(_ZN3aaa9GG2312333C1Ev),
  NSPAIR(_ZN3aaa9GG2312333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2312333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2312333E[];
extern void _ZN3aaa9GG23123333barEv();
extern void _ZN3aaa9GG23123333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23123333fooEv,_ZThn8_N3aaa9GG23123333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23123333barEv,_ZThn8_N3aaa9GG23123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23123333barEv,_ZThn20_N3aaa9GG23123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23123333fooEv,_ZThn20_N3aaa9GG23123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123333fooEv,_ZThn28_N3aaa9GG23123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23123333barEv,_ZThn28_N3aaa9GG23123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2312333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23123333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23123333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123333fooEv,_ZThn8_N3aaa9GG23123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23123333barEv,_ZThn8_N3aaa9GG23123333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123333barEv,_ZThn20_N3aaa9GG23123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23123333fooEv,_ZThn20_N3aaa9GG23123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123333fooEv,_ZThn28_N3aaa9GG23123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23123333barEv,_ZThn28_N3aaa9GG23123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2312333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2312333E[];
Class_Descriptor cd__ZN3aaa9GG2312333E = {  "_ZN3aaa9GG2312333E", // class name
  bases__ZN3aaa9GG2312333E, 6,
  &(vtc__ZN3aaa9GG2312333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2312333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2312333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313111  : ::aaa::EE231 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23131113fooEv
  ~GG2313111(); // tgen
  GG2313111(); // tgen
};
//SIG(1 _ZN3aaa9GG2313111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23131113fooEv");}
aaa::GG2313111 ::~GG2313111(){ note_dtor("_ZN3aaa9GG2313111E", this);} // tgen
aaa::GG2313111 ::GG2313111(){ note_ctor("_ZN3aaa9GG2313111E", this);} // tgen
}
static void Test__ZN3aaa9GG2313111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313111E, buf);
    ::aaa::GG2313111 *dp, &lv = *(dp=new (buf) ::aaa::GG2313111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313111E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2313111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2313111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2313111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313111E);
    dp->::aaa::GG2313111::~GG2313111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313111E(Test__ZN3aaa9GG2313111E, "_ZN3aaa9GG2313111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313111C1Ev();
extern void _ZN3aaa9GG2313111D1Ev();
Name_Map name_map__ZN3aaa9GG2313111E[] = {
  NSPAIR(_ZN3aaa9GG2313111C1Ev),
  NSPAIR(_ZN3aaa9GG2313111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2313111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313111E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23131113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23131113fooEv,_ZThn8_N3aaa9GG23131113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23131113fooEv,_ZThn20_N3aaa9GG23131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23131113fooEv,_ZThn28_N3aaa9GG23131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23131113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131113fooEv,_ZThn8_N3aaa9GG23131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131113fooEv,_ZThn20_N3aaa9GG23131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23131113fooEv,_ZThn28_N3aaa9GG23131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313111E[];
Class_Descriptor cd__ZN3aaa9GG2313111E = {  "_ZN3aaa9GG2313111E", // class name
  bases__ZN3aaa9GG2313111E, 6,
  &(vtc__ZN3aaa9GG2313111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313112  : ::aaa::EE231 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23131123barEv
  ~GG2313112(); // tgen
  GG2313112(); // tgen
};
//SIG(1 _ZN3aaa9GG2313112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23131123barEv");}
aaa::GG2313112 ::~GG2313112(){ note_dtor("_ZN3aaa9GG2313112E", this);} // tgen
aaa::GG2313112 ::GG2313112(){ note_ctor("_ZN3aaa9GG2313112E", this);} // tgen
}
static void Test__ZN3aaa9GG2313112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313112E, buf);
    ::aaa::GG2313112 *dp, &lv = *(dp=new (buf) ::aaa::GG2313112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313112E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2313112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2313112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2313112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313112E);
    dp->::aaa::GG2313112::~GG2313112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313112E(Test__ZN3aaa9GG2313112E, "_ZN3aaa9GG2313112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313112C1Ev();
extern void _ZN3aaa9GG2313112D1Ev();
Name_Map name_map__ZN3aaa9GG2313112E[] = {
  NSPAIR(_ZN3aaa9GG2313112C1Ev),
  NSPAIR(_ZN3aaa9GG2313112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2313112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313112E[];
extern void _ZN3aaa9GG23131123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23131123barEv,_ZThn8_N3aaa9GG23131123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23131123barEv,_ZThn20_N3aaa9GG23131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23131123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131123barEv,_ZThn8_N3aaa9GG23131123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131123barEv,_ZThn20_N3aaa9GG23131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313112E[];
Class_Descriptor cd__ZN3aaa9GG2313112E = {  "_ZN3aaa9GG2313112E", // class name
  bases__ZN3aaa9GG2313112E, 6,
  &(vtc__ZN3aaa9GG2313112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313113  : ::aaa::EE231 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23131133fooEv
  virtual void  bar(); // _ZN3aaa9GG23131133barEv
  ~GG2313113(); // tgen
  GG2313113(); // tgen
};
//SIG(1 _ZN3aaa9GG2313113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23131133fooEv");}
void  aaa::GG2313113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23131133barEv");}
aaa::GG2313113 ::~GG2313113(){ note_dtor("_ZN3aaa9GG2313113E", this);} // tgen
aaa::GG2313113 ::GG2313113(){ note_ctor("_ZN3aaa9GG2313113E", this);} // tgen
}
static void Test__ZN3aaa9GG2313113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313113E, buf);
    ::aaa::GG2313113 *dp, &lv = *(dp=new (buf) ::aaa::GG2313113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313113E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2313113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2313113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2313113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313113E);
    dp->::aaa::GG2313113::~GG2313113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313113E(Test__ZN3aaa9GG2313113E, "_ZN3aaa9GG2313113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313113C1Ev();
extern void _ZN3aaa9GG2313113D1Ev();
Name_Map name_map__ZN3aaa9GG2313113E[] = {
  NSPAIR(_ZN3aaa9GG2313113C1Ev),
  NSPAIR(_ZN3aaa9GG2313113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2313113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313113E[];
extern void _ZN3aaa9GG23131133barEv();
extern void _ZN3aaa9GG23131133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23131133fooEv,_ZThn8_N3aaa9GG23131133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23131133barEv,_ZThn8_N3aaa9GG23131133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23131133fooEv,_ZThn20_N3aaa9GG23131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23131133barEv,_ZThn20_N3aaa9GG23131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23131133fooEv,_ZThn28_N3aaa9GG23131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23131133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23131133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131133fooEv,_ZThn8_N3aaa9GG23131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131133barEv,_ZThn8_N3aaa9GG23131133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131133fooEv,_ZThn20_N3aaa9GG23131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131133barEv,_ZThn20_N3aaa9GG23131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23131133fooEv,_ZThn28_N3aaa9GG23131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313113E[];
Class_Descriptor cd__ZN3aaa9GG2313113E = {  "_ZN3aaa9GG2313113E", // class name
  bases__ZN3aaa9GG2313113E, 6,
  &(vtc__ZN3aaa9GG2313113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313121  : ::aaa::EE231 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23131213fooEv
  ~GG2313121(); // tgen
  GG2313121(); // tgen
};
//SIG(1 _ZN3aaa9GG2313121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23131213fooEv");}
aaa::GG2313121 ::~GG2313121(){ note_dtor("_ZN3aaa9GG2313121E", this);} // tgen
aaa::GG2313121 ::GG2313121(){ note_ctor("_ZN3aaa9GG2313121E", this);} // tgen
}
static void Test__ZN3aaa9GG2313121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313121E, buf);
    ::aaa::GG2313121 *dp, &lv = *(dp=new (buf) ::aaa::GG2313121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313121E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2313121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2313121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2313121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313121E);
    dp->::aaa::GG2313121::~GG2313121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313121E(Test__ZN3aaa9GG2313121E, "_ZN3aaa9GG2313121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313121C1Ev();
extern void _ZN3aaa9GG2313121D1Ev();
Name_Map name_map__ZN3aaa9GG2313121E[] = {
  NSPAIR(_ZN3aaa9GG2313121C1Ev),
  NSPAIR(_ZN3aaa9GG2313121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2313121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313121E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23131213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23131213fooEv,_ZThn8_N3aaa9GG23131213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23131213fooEv,_ZThn20_N3aaa9GG23131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23131213fooEv,_ZThn28_N3aaa9GG23131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23131213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131213fooEv,_ZThn8_N3aaa9GG23131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131213fooEv,_ZThn20_N3aaa9GG23131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23131213fooEv,_ZThn28_N3aaa9GG23131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313121E[];
Class_Descriptor cd__ZN3aaa9GG2313121E = {  "_ZN3aaa9GG2313121E", // class name
  bases__ZN3aaa9GG2313121E, 6,
  &(vtc__ZN3aaa9GG2313121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313122  : ::aaa::EE231 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23131223barEv
  ~GG2313122(); // tgen
  GG2313122(); // tgen
};
//SIG(1 _ZN3aaa9GG2313122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23131223barEv");}
aaa::GG2313122 ::~GG2313122(){ note_dtor("_ZN3aaa9GG2313122E", this);} // tgen
aaa::GG2313122 ::GG2313122(){ note_ctor("_ZN3aaa9GG2313122E", this);} // tgen
}
static void Test__ZN3aaa9GG2313122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313122E, buf);
    ::aaa::GG2313122 *dp, &lv = *(dp=new (buf) ::aaa::GG2313122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313122E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2313122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2313122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2313122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313122E);
    dp->::aaa::GG2313122::~GG2313122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313122E(Test__ZN3aaa9GG2313122E, "_ZN3aaa9GG2313122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313122C1Ev();
extern void _ZN3aaa9GG2313122D1Ev();
Name_Map name_map__ZN3aaa9GG2313122E[] = {
  NSPAIR(_ZN3aaa9GG2313122C1Ev),
  NSPAIR(_ZN3aaa9GG2313122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2313122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313122E[];
extern void _ZN3aaa9GG23131223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23131223barEv,_ZThn8_N3aaa9GG23131223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23131223barEv,_ZThn20_N3aaa9GG23131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23131223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131223barEv,_ZThn8_N3aaa9GG23131223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131223barEv,_ZThn20_N3aaa9GG23131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313122E[];
Class_Descriptor cd__ZN3aaa9GG2313122E = {  "_ZN3aaa9GG2313122E", // class name
  bases__ZN3aaa9GG2313122E, 6,
  &(vtc__ZN3aaa9GG2313122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313123  : ::aaa::EE231 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23131233fooEv
  virtual void  bar(); // _ZN3aaa9GG23131233barEv
  ~GG2313123(); // tgen
  GG2313123(); // tgen
};
//SIG(1 _ZN3aaa9GG2313123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23131233fooEv");}
void  aaa::GG2313123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23131233barEv");}
aaa::GG2313123 ::~GG2313123(){ note_dtor("_ZN3aaa9GG2313123E", this);} // tgen
aaa::GG2313123 ::GG2313123(){ note_ctor("_ZN3aaa9GG2313123E", this);} // tgen
}
static void Test__ZN3aaa9GG2313123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313123E, buf);
    ::aaa::GG2313123 *dp, &lv = *(dp=new (buf) ::aaa::GG2313123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313123E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2313123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2313123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2313123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313123E);
    dp->::aaa::GG2313123::~GG2313123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313123E(Test__ZN3aaa9GG2313123E, "_ZN3aaa9GG2313123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313123C1Ev();
extern void _ZN3aaa9GG2313123D1Ev();
Name_Map name_map__ZN3aaa9GG2313123E[] = {
  NSPAIR(_ZN3aaa9GG2313123C1Ev),
  NSPAIR(_ZN3aaa9GG2313123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2313123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313123E[];
extern void _ZN3aaa9GG23131233barEv();
extern void _ZN3aaa9GG23131233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23131233fooEv,_ZThn8_N3aaa9GG23131233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23131233barEv,_ZThn8_N3aaa9GG23131233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23131233fooEv,_ZThn20_N3aaa9GG23131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23131233barEv,_ZThn20_N3aaa9GG23131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23131233fooEv,_ZThn28_N3aaa9GG23131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23131233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23131233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131233fooEv,_ZThn8_N3aaa9GG23131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131233barEv,_ZThn8_N3aaa9GG23131233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131233fooEv,_ZThn20_N3aaa9GG23131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131233barEv,_ZThn20_N3aaa9GG23131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23131233fooEv,_ZThn28_N3aaa9GG23131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313123E[];
Class_Descriptor cd__ZN3aaa9GG2313123E = {  "_ZN3aaa9GG2313123E", // class name
  bases__ZN3aaa9GG2313123E, 6,
  &(vtc__ZN3aaa9GG2313123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313131  : ::aaa::EE231 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23131313fooEv
  ~GG2313131(); // tgen
  GG2313131(); // tgen
};
//SIG(1 _ZN3aaa9GG2313131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23131313fooEv");}
aaa::GG2313131 ::~GG2313131(){ note_dtor("_ZN3aaa9GG2313131E", this);} // tgen
aaa::GG2313131 ::GG2313131(){ note_ctor("_ZN3aaa9GG2313131E", this);} // tgen
}
static void Test__ZN3aaa9GG2313131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313131E, buf);
    ::aaa::GG2313131 *dp, &lv = *(dp=new (buf) ::aaa::GG2313131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313131E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2313131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2313131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2313131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313131E);
    dp->::aaa::GG2313131::~GG2313131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313131E(Test__ZN3aaa9GG2313131E, "_ZN3aaa9GG2313131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313131C1Ev();
extern void _ZN3aaa9GG2313131D1Ev();
Name_Map name_map__ZN3aaa9GG2313131E[] = {
  NSPAIR(_ZN3aaa9GG2313131C1Ev),
  NSPAIR(_ZN3aaa9GG2313131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2313131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313131E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23131313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23131313fooEv,_ZThn8_N3aaa9GG23131313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23131313fooEv,_ZThn20_N3aaa9GG23131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23131313fooEv,_ZThn28_N3aaa9GG23131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23131313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131313fooEv,_ZThn8_N3aaa9GG23131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131313fooEv,_ZThn20_N3aaa9GG23131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23131313fooEv,_ZThn28_N3aaa9GG23131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313131E[];
Class_Descriptor cd__ZN3aaa9GG2313131E = {  "_ZN3aaa9GG2313131E", // class name
  bases__ZN3aaa9GG2313131E, 6,
  &(vtc__ZN3aaa9GG2313131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313132  : ::aaa::EE231 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23131323barEv
  ~GG2313132(); // tgen
  GG2313132(); // tgen
};
//SIG(1 _ZN3aaa9GG2313132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23131323barEv");}
aaa::GG2313132 ::~GG2313132(){ note_dtor("_ZN3aaa9GG2313132E", this);} // tgen
aaa::GG2313132 ::GG2313132(){ note_ctor("_ZN3aaa9GG2313132E", this);} // tgen
}
static void Test__ZN3aaa9GG2313132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313132E, buf);
    ::aaa::GG2313132 *dp, &lv = *(dp=new (buf) ::aaa::GG2313132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313132E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2313132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2313132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2313132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313132E);
    dp->::aaa::GG2313132::~GG2313132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313132E(Test__ZN3aaa9GG2313132E, "_ZN3aaa9GG2313132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313132C1Ev();
extern void _ZN3aaa9GG2313132D1Ev();
Name_Map name_map__ZN3aaa9GG2313132E[] = {
  NSPAIR(_ZN3aaa9GG2313132C1Ev),
  NSPAIR(_ZN3aaa9GG2313132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2313132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313132E[];
extern void _ZN3aaa9GG23131323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23131323barEv,_ZThn8_N3aaa9GG23131323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23131323barEv,_ZThn20_N3aaa9GG23131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23131323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131323barEv,_ZThn8_N3aaa9GG23131323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131323barEv,_ZThn20_N3aaa9GG23131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313132E[];
Class_Descriptor cd__ZN3aaa9GG2313132E = {  "_ZN3aaa9GG2313132E", // class name
  bases__ZN3aaa9GG2313132E, 6,
  &(vtc__ZN3aaa9GG2313132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313133  : ::aaa::EE231 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23131333fooEv
  virtual void  bar(); // _ZN3aaa9GG23131333barEv
  ~GG2313133(); // tgen
  GG2313133(); // tgen
};
//SIG(1 _ZN3aaa9GG2313133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23131333fooEv");}
void  aaa::GG2313133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23131333barEv");}
aaa::GG2313133 ::~GG2313133(){ note_dtor("_ZN3aaa9GG2313133E", this);} // tgen
aaa::GG2313133 ::GG2313133(){ note_ctor("_ZN3aaa9GG2313133E", this);} // tgen
}
static void Test__ZN3aaa9GG2313133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313133E, buf);
    ::aaa::GG2313133 *dp, &lv = *(dp=new (buf) ::aaa::GG2313133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313133E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2313133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2313133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2313133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313133E);
    dp->::aaa::GG2313133::~GG2313133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313133E(Test__ZN3aaa9GG2313133E, "_ZN3aaa9GG2313133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313133C1Ev();
extern void _ZN3aaa9GG2313133D1Ev();
Name_Map name_map__ZN3aaa9GG2313133E[] = {
  NSPAIR(_ZN3aaa9GG2313133C1Ev),
  NSPAIR(_ZN3aaa9GG2313133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2313133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313133E[];
extern void _ZN3aaa9GG23131333barEv();
extern void _ZN3aaa9GG23131333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23131333fooEv,_ZThn8_N3aaa9GG23131333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23131333barEv,_ZThn8_N3aaa9GG23131333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23131333fooEv,_ZThn20_N3aaa9GG23131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23131333barEv,_ZThn20_N3aaa9GG23131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23131333fooEv,_ZThn28_N3aaa9GG23131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23131333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23131333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131333fooEv,_ZThn8_N3aaa9GG23131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23131333barEv,_ZThn8_N3aaa9GG23131333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131333fooEv,_ZThn20_N3aaa9GG23131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23131333barEv,_ZThn20_N3aaa9GG23131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23131333fooEv,_ZThn28_N3aaa9GG23131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313133E[];
Class_Descriptor cd__ZN3aaa9GG2313133E = {  "_ZN3aaa9GG2313133E", // class name
  bases__ZN3aaa9GG2313133E, 6,
  &(vtc__ZN3aaa9GG2313133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313211  : ::aaa::EE231 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23132113fooEv
  ~GG2313211(); // tgen
  GG2313211(); // tgen
};
//SIG(1 _ZN3aaa9GG2313211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v5 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23132113fooEv");}
aaa::GG2313211 ::~GG2313211(){ note_dtor("_ZN3aaa9GG2313211E", this);} // tgen
aaa::GG2313211 ::GG2313211(){ note_ctor("_ZN3aaa9GG2313211E", this);} // tgen
}
static void Test__ZN3aaa9GG2313211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313211E, buf);
    ::aaa::GG2313211 *dp, &lv = *(dp=new (buf) ::aaa::GG2313211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313211E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2313211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2313211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2313211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313211E);
    dp->::aaa::GG2313211::~GG2313211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313211E(Test__ZN3aaa9GG2313211E, "_ZN3aaa9GG2313211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313211C1Ev();
extern void _ZN3aaa9GG2313211D1Ev();
Name_Map name_map__ZN3aaa9GG2313211E[] = {
  NSPAIR(_ZN3aaa9GG2313211C1Ev),
  NSPAIR(_ZN3aaa9GG2313211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2313211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313211E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23132113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23132113fooEv,_ZThn8_N3aaa9GG23132113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23132113fooEv,_ZThn20_N3aaa9GG23132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23132113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132113fooEv,_ZThn8_N3aaa9GG23132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132113fooEv,_ZThn20_N3aaa9GG23132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313211E[];
Class_Descriptor cd__ZN3aaa9GG2313211E = {  "_ZN3aaa9GG2313211E", // class name
  bases__ZN3aaa9GG2313211E, 6,
  &(vtc__ZN3aaa9GG2313211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313212  : ::aaa::EE231 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23132123barEv
  ~GG2313212(); // tgen
  GG2313212(); // tgen
};
//SIG(1 _ZN3aaa9GG2313212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23132123barEv");}
aaa::GG2313212 ::~GG2313212(){ note_dtor("_ZN3aaa9GG2313212E", this);} // tgen
aaa::GG2313212 ::GG2313212(){ note_ctor("_ZN3aaa9GG2313212E", this);} // tgen
}
static void Test__ZN3aaa9GG2313212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313212E, buf);
    ::aaa::GG2313212 *dp, &lv = *(dp=new (buf) ::aaa::GG2313212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313212E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2313212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2313212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2313212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313212E);
    dp->::aaa::GG2313212::~GG2313212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313212E(Test__ZN3aaa9GG2313212E, "_ZN3aaa9GG2313212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313212C1Ev();
extern void _ZN3aaa9GG2313212D1Ev();
Name_Map name_map__ZN3aaa9GG2313212E[] = {
  NSPAIR(_ZN3aaa9GG2313212C1Ev),
  NSPAIR(_ZN3aaa9GG2313212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2313212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313212E[];
extern void _ZN3aaa9GG23132123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23132123barEv,_ZThn8_N3aaa9GG23132123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23132123barEv,_ZThn20_N3aaa9GG23132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23132123barEv,_ZThn28_N3aaa9GG23132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23132123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132123barEv,_ZThn8_N3aaa9GG23132123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132123barEv,_ZThn20_N3aaa9GG23132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23132123barEv,_ZThn28_N3aaa9GG23132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313212E[];
Class_Descriptor cd__ZN3aaa9GG2313212E = {  "_ZN3aaa9GG2313212E", // class name
  bases__ZN3aaa9GG2313212E, 6,
  &(vtc__ZN3aaa9GG2313212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313213  : ::aaa::EE231 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23132133fooEv
  virtual void  bar(); // _ZN3aaa9GG23132133barEv
  ~GG2313213(); // tgen
  GG2313213(); // tgen
};
//SIG(1 _ZN3aaa9GG2313213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23132133fooEv");}
void  aaa::GG2313213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23132133barEv");}
aaa::GG2313213 ::~GG2313213(){ note_dtor("_ZN3aaa9GG2313213E", this);} // tgen
aaa::GG2313213 ::GG2313213(){ note_ctor("_ZN3aaa9GG2313213E", this);} // tgen
}
static void Test__ZN3aaa9GG2313213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313213E, buf);
    ::aaa::GG2313213 *dp, &lv = *(dp=new (buf) ::aaa::GG2313213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313213E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2313213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2313213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2313213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313213E);
    dp->::aaa::GG2313213::~GG2313213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313213E(Test__ZN3aaa9GG2313213E, "_ZN3aaa9GG2313213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313213C1Ev();
extern void _ZN3aaa9GG2313213D1Ev();
Name_Map name_map__ZN3aaa9GG2313213E[] = {
  NSPAIR(_ZN3aaa9GG2313213C1Ev),
  NSPAIR(_ZN3aaa9GG2313213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2313213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313213E[];
extern void _ZN3aaa9GG23132133barEv();
extern void _ZN3aaa9GG23132133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23132133fooEv,_ZThn8_N3aaa9GG23132133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23132133barEv,_ZThn8_N3aaa9GG23132133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23132133fooEv,_ZThn20_N3aaa9GG23132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23132133barEv,_ZThn20_N3aaa9GG23132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23132133barEv,_ZThn28_N3aaa9GG23132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23132133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23132133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132133fooEv,_ZThn8_N3aaa9GG23132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132133barEv,_ZThn8_N3aaa9GG23132133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132133fooEv,_ZThn20_N3aaa9GG23132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132133barEv,_ZThn20_N3aaa9GG23132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23132133barEv,_ZThn28_N3aaa9GG23132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313213E[];
Class_Descriptor cd__ZN3aaa9GG2313213E = {  "_ZN3aaa9GG2313213E", // class name
  bases__ZN3aaa9GG2313213E, 6,
  &(vtc__ZN3aaa9GG2313213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313221  : ::aaa::EE231 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23132213fooEv
  ~GG2313221(); // tgen
  GG2313221(); // tgen
};
//SIG(1 _ZN3aaa9GG2313221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23132213fooEv");}
aaa::GG2313221 ::~GG2313221(){ note_dtor("_ZN3aaa9GG2313221E", this);} // tgen
aaa::GG2313221 ::GG2313221(){ note_ctor("_ZN3aaa9GG2313221E", this);} // tgen
}
static void Test__ZN3aaa9GG2313221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313221E, buf);
    ::aaa::GG2313221 *dp, &lv = *(dp=new (buf) ::aaa::GG2313221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313221E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2313221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2313221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2313221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313221E);
    dp->::aaa::GG2313221::~GG2313221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313221E(Test__ZN3aaa9GG2313221E, "_ZN3aaa9GG2313221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313221C1Ev();
extern void _ZN3aaa9GG2313221D1Ev();
Name_Map name_map__ZN3aaa9GG2313221E[] = {
  NSPAIR(_ZN3aaa9GG2313221C1Ev),
  NSPAIR(_ZN3aaa9GG2313221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2313221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313221E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23132213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23132213fooEv,_ZThn8_N3aaa9GG23132213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23132213fooEv,_ZThn20_N3aaa9GG23132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23132213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132213fooEv,_ZThn8_N3aaa9GG23132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132213fooEv,_ZThn20_N3aaa9GG23132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313221E[];
Class_Descriptor cd__ZN3aaa9GG2313221E = {  "_ZN3aaa9GG2313221E", // class name
  bases__ZN3aaa9GG2313221E, 6,
  &(vtc__ZN3aaa9GG2313221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313222  : ::aaa::EE231 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23132223barEv
  ~GG2313222(); // tgen
  GG2313222(); // tgen
};
//SIG(1 _ZN3aaa9GG2313222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23132223barEv");}
aaa::GG2313222 ::~GG2313222(){ note_dtor("_ZN3aaa9GG2313222E", this);} // tgen
aaa::GG2313222 ::GG2313222(){ note_ctor("_ZN3aaa9GG2313222E", this);} // tgen
}
static void Test__ZN3aaa9GG2313222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313222E, buf);
    ::aaa::GG2313222 *dp, &lv = *(dp=new (buf) ::aaa::GG2313222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313222E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2313222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2313222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2313222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313222E);
    dp->::aaa::GG2313222::~GG2313222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313222E(Test__ZN3aaa9GG2313222E, "_ZN3aaa9GG2313222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313222C1Ev();
extern void _ZN3aaa9GG2313222D1Ev();
Name_Map name_map__ZN3aaa9GG2313222E[] = {
  NSPAIR(_ZN3aaa9GG2313222C1Ev),
  NSPAIR(_ZN3aaa9GG2313222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2313222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313222E[];
extern void _ZN3aaa9GG23132223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23132223barEv,_ZThn8_N3aaa9GG23132223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23132223barEv,_ZThn20_N3aaa9GG23132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23132223barEv,_ZThn28_N3aaa9GG23132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23132223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132223barEv,_ZThn8_N3aaa9GG23132223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132223barEv,_ZThn20_N3aaa9GG23132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23132223barEv,_ZThn28_N3aaa9GG23132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313222E[];
Class_Descriptor cd__ZN3aaa9GG2313222E = {  "_ZN3aaa9GG2313222E", // class name
  bases__ZN3aaa9GG2313222E, 6,
  &(vtc__ZN3aaa9GG2313222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313223  : ::aaa::EE231 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23132233fooEv
  virtual void  bar(); // _ZN3aaa9GG23132233barEv
  ~GG2313223(); // tgen
  GG2313223(); // tgen
};
//SIG(1 _ZN3aaa9GG2313223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23132233fooEv");}
void  aaa::GG2313223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23132233barEv");}
aaa::GG2313223 ::~GG2313223(){ note_dtor("_ZN3aaa9GG2313223E", this);} // tgen
aaa::GG2313223 ::GG2313223(){ note_ctor("_ZN3aaa9GG2313223E", this);} // tgen
}
static void Test__ZN3aaa9GG2313223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313223E, buf);
    ::aaa::GG2313223 *dp, &lv = *(dp=new (buf) ::aaa::GG2313223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313223E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2313223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2313223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2313223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313223E);
    dp->::aaa::GG2313223::~GG2313223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313223E(Test__ZN3aaa9GG2313223E, "_ZN3aaa9GG2313223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313223C1Ev();
extern void _ZN3aaa9GG2313223D1Ev();
Name_Map name_map__ZN3aaa9GG2313223E[] = {
  NSPAIR(_ZN3aaa9GG2313223C1Ev),
  NSPAIR(_ZN3aaa9GG2313223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2313223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313223E[];
extern void _ZN3aaa9GG23132233barEv();
extern void _ZN3aaa9GG23132233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23132233fooEv,_ZThn8_N3aaa9GG23132233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23132233barEv,_ZThn8_N3aaa9GG23132233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23132233fooEv,_ZThn20_N3aaa9GG23132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23132233barEv,_ZThn20_N3aaa9GG23132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23132233barEv,_ZThn28_N3aaa9GG23132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23132233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23132233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132233fooEv,_ZThn8_N3aaa9GG23132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132233barEv,_ZThn8_N3aaa9GG23132233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132233fooEv,_ZThn20_N3aaa9GG23132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132233barEv,_ZThn20_N3aaa9GG23132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23132233barEv,_ZThn28_N3aaa9GG23132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313223E[];
Class_Descriptor cd__ZN3aaa9GG2313223E = {  "_ZN3aaa9GG2313223E", // class name
  bases__ZN3aaa9GG2313223E, 6,
  &(vtc__ZN3aaa9GG2313223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313231  : ::aaa::EE231 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23132313fooEv
  ~GG2313231(); // tgen
  GG2313231(); // tgen
};
//SIG(1 _ZN3aaa9GG2313231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC7{ v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23132313fooEv");}
aaa::GG2313231 ::~GG2313231(){ note_dtor("_ZN3aaa9GG2313231E", this);} // tgen
aaa::GG2313231 ::GG2313231(){ note_ctor("_ZN3aaa9GG2313231E", this);} // tgen
}
static void Test__ZN3aaa9GG2313231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313231E, buf);
    ::aaa::GG2313231 *dp, &lv = *(dp=new (buf) ::aaa::GG2313231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313231E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2313231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2313231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2313231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313231E);
    dp->::aaa::GG2313231::~GG2313231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313231E(Test__ZN3aaa9GG2313231E, "_ZN3aaa9GG2313231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313231C1Ev();
extern void _ZN3aaa9GG2313231D1Ev();
Name_Map name_map__ZN3aaa9GG2313231E[] = {
  NSPAIR(_ZN3aaa9GG2313231C1Ev),
  NSPAIR(_ZN3aaa9GG2313231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2313231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313231E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23132313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23132313fooEv,_ZThn8_N3aaa9GG23132313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23132313fooEv,_ZThn20_N3aaa9GG23132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23132313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132313fooEv,_ZThn8_N3aaa9GG23132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132313fooEv,_ZThn20_N3aaa9GG23132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313231E[];
Class_Descriptor cd__ZN3aaa9GG2313231E = {  "_ZN3aaa9GG2313231E", // class name
  bases__ZN3aaa9GG2313231E, 6,
  &(vtc__ZN3aaa9GG2313231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313232  : ::aaa::EE231 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23132323barEv
  ~GG2313232(); // tgen
  GG2313232(); // tgen
};
//SIG(1 _ZN3aaa9GG2313232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23132323barEv");}
aaa::GG2313232 ::~GG2313232(){ note_dtor("_ZN3aaa9GG2313232E", this);} // tgen
aaa::GG2313232 ::GG2313232(){ note_ctor("_ZN3aaa9GG2313232E", this);} // tgen
}
static void Test__ZN3aaa9GG2313232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313232E, buf);
    ::aaa::GG2313232 *dp, &lv = *(dp=new (buf) ::aaa::GG2313232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313232E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2313232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2313232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2313232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313232E);
    dp->::aaa::GG2313232::~GG2313232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313232E(Test__ZN3aaa9GG2313232E, "_ZN3aaa9GG2313232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313232C1Ev();
extern void _ZN3aaa9GG2313232D1Ev();
Name_Map name_map__ZN3aaa9GG2313232E[] = {
  NSPAIR(_ZN3aaa9GG2313232C1Ev),
  NSPAIR(_ZN3aaa9GG2313232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2313232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313232E[];
extern void _ZN3aaa9GG23132323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23132323barEv,_ZThn8_N3aaa9GG23132323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23132323barEv,_ZThn20_N3aaa9GG23132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23132323barEv,_ZThn28_N3aaa9GG23132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23132323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132323barEv,_ZThn8_N3aaa9GG23132323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132323barEv,_ZThn20_N3aaa9GG23132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23132323barEv,_ZThn28_N3aaa9GG23132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313232E[];
Class_Descriptor cd__ZN3aaa9GG2313232E = {  "_ZN3aaa9GG2313232E", // class name
  bases__ZN3aaa9GG2313232E, 6,
  &(vtc__ZN3aaa9GG2313232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313233  : ::aaa::EE231 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23132333fooEv
  virtual void  bar(); // _ZN3aaa9GG23132333barEv
  ~GG2313233(); // tgen
  GG2313233(); // tgen
};
//SIG(1 _ZN3aaa9GG2313233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23132333fooEv");}
void  aaa::GG2313233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23132333barEv");}
aaa::GG2313233 ::~GG2313233(){ note_dtor("_ZN3aaa9GG2313233E", this);} // tgen
aaa::GG2313233 ::GG2313233(){ note_ctor("_ZN3aaa9GG2313233E", this);} // tgen
}
static void Test__ZN3aaa9GG2313233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313233E, buf);
    ::aaa::GG2313233 *dp, &lv = *(dp=new (buf) ::aaa::GG2313233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313233E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2313233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2313233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2313233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313233E);
    dp->::aaa::GG2313233::~GG2313233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313233E(Test__ZN3aaa9GG2313233E, "_ZN3aaa9GG2313233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313233C1Ev();
extern void _ZN3aaa9GG2313233D1Ev();
Name_Map name_map__ZN3aaa9GG2313233E[] = {
  NSPAIR(_ZN3aaa9GG2313233C1Ev),
  NSPAIR(_ZN3aaa9GG2313233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2313233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313233E[];
extern void _ZN3aaa9GG23132333barEv();
extern void _ZN3aaa9GG23132333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23132333fooEv,_ZThn8_N3aaa9GG23132333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23132333barEv,_ZThn8_N3aaa9GG23132333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23132333fooEv,_ZThn20_N3aaa9GG23132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23132333barEv,_ZThn20_N3aaa9GG23132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23132333barEv,_ZThn28_N3aaa9GG23132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23132333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23132333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132333fooEv,_ZThn8_N3aaa9GG23132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23132333barEv,_ZThn8_N3aaa9GG23132333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132333fooEv,_ZThn20_N3aaa9GG23132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23132333barEv,_ZThn20_N3aaa9GG23132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23132333barEv,_ZThn28_N3aaa9GG23132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313233E[];
Class_Descriptor cd__ZN3aaa9GG2313233E = {  "_ZN3aaa9GG2313233E", // class name
  bases__ZN3aaa9GG2313233E, 6,
  &(vtc__ZN3aaa9GG2313233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313311  : ::aaa::EE231 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23133113fooEv
  ~GG2313311(); // tgen
  GG2313311(); // tgen
};
//SIG(1 _ZN3aaa9GG2313311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23133113fooEv");}
aaa::GG2313311 ::~GG2313311(){ note_dtor("_ZN3aaa9GG2313311E", this);} // tgen
aaa::GG2313311 ::GG2313311(){ note_ctor("_ZN3aaa9GG2313311E", this);} // tgen
}
static void Test__ZN3aaa9GG2313311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313311E, buf);
    ::aaa::GG2313311 *dp, &lv = *(dp=new (buf) ::aaa::GG2313311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313311E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2313311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2313311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2313311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313311E);
    dp->::aaa::GG2313311::~GG2313311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313311E(Test__ZN3aaa9GG2313311E, "_ZN3aaa9GG2313311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313311C1Ev();
extern void _ZN3aaa9GG2313311D1Ev();
Name_Map name_map__ZN3aaa9GG2313311E[] = {
  NSPAIR(_ZN3aaa9GG2313311C1Ev),
  NSPAIR(_ZN3aaa9GG2313311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2313311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313311E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23133113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23133113fooEv,_ZThn8_N3aaa9GG23133113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23133113fooEv,_ZThn20_N3aaa9GG23133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23133113fooEv,_ZThn28_N3aaa9GG23133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23133113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133113fooEv,_ZThn8_N3aaa9GG23133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133113fooEv,_ZThn20_N3aaa9GG23133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133113fooEv,_ZThn28_N3aaa9GG23133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313311E[];
Class_Descriptor cd__ZN3aaa9GG2313311E = {  "_ZN3aaa9GG2313311E", // class name
  bases__ZN3aaa9GG2313311E, 6,
  &(vtc__ZN3aaa9GG2313311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313312  : ::aaa::EE231 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23133123barEv
  ~GG2313312(); // tgen
  GG2313312(); // tgen
};
//SIG(1 _ZN3aaa9GG2313312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23133123barEv");}
aaa::GG2313312 ::~GG2313312(){ note_dtor("_ZN3aaa9GG2313312E", this);} // tgen
aaa::GG2313312 ::GG2313312(){ note_ctor("_ZN3aaa9GG2313312E", this);} // tgen
}
static void Test__ZN3aaa9GG2313312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313312E, buf);
    ::aaa::GG2313312 *dp, &lv = *(dp=new (buf) ::aaa::GG2313312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313312E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2313312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2313312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2313312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313312E);
    dp->::aaa::GG2313312::~GG2313312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313312E(Test__ZN3aaa9GG2313312E, "_ZN3aaa9GG2313312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313312C1Ev();
extern void _ZN3aaa9GG2313312D1Ev();
Name_Map name_map__ZN3aaa9GG2313312E[] = {
  NSPAIR(_ZN3aaa9GG2313312C1Ev),
  NSPAIR(_ZN3aaa9GG2313312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2313312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313312E[];
extern void _ZN3aaa9GG23133123barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23133123barEv,_ZThn8_N3aaa9GG23133123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23133123barEv,_ZThn20_N3aaa9GG23133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23133123barEv,_ZThn28_N3aaa9GG23133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23133123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133123barEv,_ZThn8_N3aaa9GG23133123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133123barEv,_ZThn20_N3aaa9GG23133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133123barEv,_ZThn28_N3aaa9GG23133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313312E[];
Class_Descriptor cd__ZN3aaa9GG2313312E = {  "_ZN3aaa9GG2313312E", // class name
  bases__ZN3aaa9GG2313312E, 6,
  &(vtc__ZN3aaa9GG2313312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313313  : ::aaa::EE231 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23133133fooEv
  virtual void  bar(); // _ZN3aaa9GG23133133barEv
  ~GG2313313(); // tgen
  GG2313313(); // tgen
};
//SIG(1 _ZN3aaa9GG2313313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23133133fooEv");}
void  aaa::GG2313313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23133133barEv");}
aaa::GG2313313 ::~GG2313313(){ note_dtor("_ZN3aaa9GG2313313E", this);} // tgen
aaa::GG2313313 ::GG2313313(){ note_ctor("_ZN3aaa9GG2313313E", this);} // tgen
}
static void Test__ZN3aaa9GG2313313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313313E, buf);
    ::aaa::GG2313313 *dp, &lv = *(dp=new (buf) ::aaa::GG2313313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313313E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2313313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2313313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2313313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313313E);
    dp->::aaa::GG2313313::~GG2313313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313313E(Test__ZN3aaa9GG2313313E, "_ZN3aaa9GG2313313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313313C1Ev();
extern void _ZN3aaa9GG2313313D1Ev();
Name_Map name_map__ZN3aaa9GG2313313E[] = {
  NSPAIR(_ZN3aaa9GG2313313C1Ev),
  NSPAIR(_ZN3aaa9GG2313313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2313313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313313E[];
extern void _ZN3aaa9GG23133133barEv();
extern void _ZN3aaa9GG23133133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23133133fooEv,_ZThn8_N3aaa9GG23133133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23133133barEv,_ZThn8_N3aaa9GG23133133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23133133fooEv,_ZThn20_N3aaa9GG23133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23133133barEv,_ZThn20_N3aaa9GG23133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23133133fooEv,_ZThn28_N3aaa9GG23133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23133133barEv,_ZThn28_N3aaa9GG23133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23133133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23133133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133133fooEv,_ZThn8_N3aaa9GG23133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133133barEv,_ZThn8_N3aaa9GG23133133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133133fooEv,_ZThn20_N3aaa9GG23133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133133barEv,_ZThn20_N3aaa9GG23133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133133fooEv,_ZThn28_N3aaa9GG23133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133133barEv,_ZThn28_N3aaa9GG23133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313313E[];
Class_Descriptor cd__ZN3aaa9GG2313313E = {  "_ZN3aaa9GG2313313E", // class name
  bases__ZN3aaa9GG2313313E, 6,
  &(vtc__ZN3aaa9GG2313313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313321  : ::aaa::EE231 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23133213fooEv
  ~GG2313321(); // tgen
  GG2313321(); // tgen
};
//SIG(1 _ZN3aaa9GG2313321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23133213fooEv");}
aaa::GG2313321 ::~GG2313321(){ note_dtor("_ZN3aaa9GG2313321E", this);} // tgen
aaa::GG2313321 ::GG2313321(){ note_ctor("_ZN3aaa9GG2313321E", this);} // tgen
}
static void Test__ZN3aaa9GG2313321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313321E, buf);
    ::aaa::GG2313321 *dp, &lv = *(dp=new (buf) ::aaa::GG2313321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313321E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2313321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2313321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2313321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313321E);
    dp->::aaa::GG2313321::~GG2313321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313321E(Test__ZN3aaa9GG2313321E, "_ZN3aaa9GG2313321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313321C1Ev();
extern void _ZN3aaa9GG2313321D1Ev();
Name_Map name_map__ZN3aaa9GG2313321E[] = {
  NSPAIR(_ZN3aaa9GG2313321C1Ev),
  NSPAIR(_ZN3aaa9GG2313321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2313321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313321E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23133213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23133213fooEv,_ZThn8_N3aaa9GG23133213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23133213fooEv,_ZThn20_N3aaa9GG23133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23133213fooEv,_ZThn28_N3aaa9GG23133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23133213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133213fooEv,_ZThn8_N3aaa9GG23133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133213fooEv,_ZThn20_N3aaa9GG23133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133213fooEv,_ZThn28_N3aaa9GG23133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313321E[];
Class_Descriptor cd__ZN3aaa9GG2313321E = {  "_ZN3aaa9GG2313321E", // class name
  bases__ZN3aaa9GG2313321E, 6,
  &(vtc__ZN3aaa9GG2313321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313322  : ::aaa::EE231 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23133223barEv
  ~GG2313322(); // tgen
  GG2313322(); // tgen
};
//SIG(1 _ZN3aaa9GG2313322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23133223barEv");}
aaa::GG2313322 ::~GG2313322(){ note_dtor("_ZN3aaa9GG2313322E", this);} // tgen
aaa::GG2313322 ::GG2313322(){ note_ctor("_ZN3aaa9GG2313322E", this);} // tgen
}
static void Test__ZN3aaa9GG2313322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313322E, buf);
    ::aaa::GG2313322 *dp, &lv = *(dp=new (buf) ::aaa::GG2313322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313322E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2313322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2313322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2313322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313322E);
    dp->::aaa::GG2313322::~GG2313322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313322E(Test__ZN3aaa9GG2313322E, "_ZN3aaa9GG2313322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313322C1Ev();
extern void _ZN3aaa9GG2313322D1Ev();
Name_Map name_map__ZN3aaa9GG2313322E[] = {
  NSPAIR(_ZN3aaa9GG2313322C1Ev),
  NSPAIR(_ZN3aaa9GG2313322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2313322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313322E[];
extern void _ZN3aaa9GG23133223barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23133223barEv,_ZThn8_N3aaa9GG23133223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23133223barEv,_ZThn20_N3aaa9GG23133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23133223barEv,_ZThn28_N3aaa9GG23133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23133223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133223barEv,_ZThn8_N3aaa9GG23133223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133223barEv,_ZThn20_N3aaa9GG23133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133223barEv,_ZThn28_N3aaa9GG23133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313322E[];
Class_Descriptor cd__ZN3aaa9GG2313322E = {  "_ZN3aaa9GG2313322E", // class name
  bases__ZN3aaa9GG2313322E, 6,
  &(vtc__ZN3aaa9GG2313322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313323  : ::aaa::EE231 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23133233fooEv
  virtual void  bar(); // _ZN3aaa9GG23133233barEv
  ~GG2313323(); // tgen
  GG2313323(); // tgen
};
//SIG(1 _ZN3aaa9GG2313323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23133233fooEv");}
void  aaa::GG2313323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23133233barEv");}
aaa::GG2313323 ::~GG2313323(){ note_dtor("_ZN3aaa9GG2313323E", this);} // tgen
aaa::GG2313323 ::GG2313323(){ note_ctor("_ZN3aaa9GG2313323E", this);} // tgen
}
static void Test__ZN3aaa9GG2313323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313323E, buf);
    ::aaa::GG2313323 *dp, &lv = *(dp=new (buf) ::aaa::GG2313323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313323E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2313323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2313323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2313323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313323E);
    dp->::aaa::GG2313323::~GG2313323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313323E(Test__ZN3aaa9GG2313323E, "_ZN3aaa9GG2313323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313323C1Ev();
extern void _ZN3aaa9GG2313323D1Ev();
Name_Map name_map__ZN3aaa9GG2313323E[] = {
  NSPAIR(_ZN3aaa9GG2313323C1Ev),
  NSPAIR(_ZN3aaa9GG2313323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2313323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313323E[];
extern void _ZN3aaa9GG23133233barEv();
extern void _ZN3aaa9GG23133233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23133233fooEv,_ZThn8_N3aaa9GG23133233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23133233barEv,_ZThn8_N3aaa9GG23133233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23133233fooEv,_ZThn20_N3aaa9GG23133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23133233barEv,_ZThn20_N3aaa9GG23133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23133233fooEv,_ZThn28_N3aaa9GG23133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23133233barEv,_ZThn28_N3aaa9GG23133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23133233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23133233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133233fooEv,_ZThn8_N3aaa9GG23133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133233barEv,_ZThn8_N3aaa9GG23133233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133233fooEv,_ZThn20_N3aaa9GG23133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133233barEv,_ZThn20_N3aaa9GG23133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133233fooEv,_ZThn28_N3aaa9GG23133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133233barEv,_ZThn28_N3aaa9GG23133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313323E[];
Class_Descriptor cd__ZN3aaa9GG2313323E = {  "_ZN3aaa9GG2313323E", // class name
  bases__ZN3aaa9GG2313323E, 6,
  &(vtc__ZN3aaa9GG2313323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313331  : ::aaa::EE231 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23133313fooEv
  ~GG2313331(); // tgen
  GG2313331(); // tgen
};
//SIG(1 _ZN3aaa9GG2313331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 v4 Fi} BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23133313fooEv");}
aaa::GG2313331 ::~GG2313331(){ note_dtor("_ZN3aaa9GG2313331E", this);} // tgen
aaa::GG2313331 ::GG2313331(){ note_ctor("_ZN3aaa9GG2313331E", this);} // tgen
}
static void Test__ZN3aaa9GG2313331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313331E, buf);
    ::aaa::GG2313331 *dp, &lv = *(dp=new (buf) ::aaa::GG2313331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313331E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2313331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2313331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2313331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313331E);
    dp->::aaa::GG2313331::~GG2313331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313331E(Test__ZN3aaa9GG2313331E, "_ZN3aaa9GG2313331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313331C1Ev();
extern void _ZN3aaa9GG2313331D1Ev();
Name_Map name_map__ZN3aaa9GG2313331E[] = {
  NSPAIR(_ZN3aaa9GG2313331C1Ev),
  NSPAIR(_ZN3aaa9GG2313331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2313331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313331E[];
extern void _ZN3aaa3AA23barEv();
extern void _ZN3aaa9GG23133313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23133313fooEv,_ZThn8_N3aaa9GG23133313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23133313fooEv,_ZThn20_N3aaa9GG23133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23133313fooEv,_ZThn28_N3aaa9GG23133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23133313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133313fooEv,_ZThn8_N3aaa9GG23133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133313fooEv,_ZThn20_N3aaa9GG23133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133313fooEv,_ZThn28_N3aaa9GG23133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313331E[];
Class_Descriptor cd__ZN3aaa9GG2313331E = {  "_ZN3aaa9GG2313331E", // class name
  bases__ZN3aaa9GG2313331E, 6,
  &(vtc__ZN3aaa9GG2313331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313332  : ::aaa::EE231 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23133323barEv
  ~GG2313332(); // tgen
  GG2313332(); // tgen
};
//SIG(1 _ZN3aaa9GG2313332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2313332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23133323barEv");}
aaa::GG2313332 ::~GG2313332(){ note_dtor("_ZN3aaa9GG2313332E", this);} // tgen
aaa::GG2313332 ::GG2313332(){ note_ctor("_ZN3aaa9GG2313332E", this);} // tgen
}
static void Test__ZN3aaa9GG2313332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313332E, buf);
    ::aaa::GG2313332 *dp, &lv = *(dp=new (buf) ::aaa::GG2313332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313332E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2313332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2313332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2313332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313332E);
    dp->::aaa::GG2313332::~GG2313332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313332E(Test__ZN3aaa9GG2313332E, "_ZN3aaa9GG2313332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313332C1Ev();
extern void _ZN3aaa9GG2313332D1Ev();
Name_Map name_map__ZN3aaa9GG2313332E[] = {
  NSPAIR(_ZN3aaa9GG2313332C1Ev),
  NSPAIR(_ZN3aaa9GG2313332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2313332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313332E[];
extern void _ZN3aaa9GG23133323barEv();
extern void _ZN3aaa5EE2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23133323barEv,_ZThn8_N3aaa9GG23133323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23133323barEv,_ZThn20_N3aaa9GG23133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23133323barEv,_ZThn28_N3aaa9GG23133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23133323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2313fooEv,_ZThn8_N3aaa5EE2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133323barEv,_ZThn8_N3aaa9GG23133323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133323barEv,_ZThn20_N3aaa9GG23133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133323barEv,_ZThn28_N3aaa9GG23133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313332E[];
Class_Descriptor cd__ZN3aaa9GG2313332E = {  "_ZN3aaa9GG2313332E", // class name
  bases__ZN3aaa9GG2313332E, 6,
  &(vtc__ZN3aaa9GG2313332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2313333  : ::aaa::EE231 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23133333fooEv
  virtual void  bar(); // _ZN3aaa9GG23133333barEv
  ~GG2313333(); // tgen
  GG2313333(); // tgen
};
//SIG(1 _ZN3aaa9GG2313333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2313333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23133333fooEv");}
void  aaa::GG2313333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23133333barEv");}
aaa::GG2313333 ::~GG2313333(){ note_dtor("_ZN3aaa9GG2313333E", this);} // tgen
aaa::GG2313333 ::GG2313333(){ note_ctor("_ZN3aaa9GG2313333E", this);} // tgen
}
static void Test__ZN3aaa9GG2313333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2313333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2313333E, buf);
    ::aaa::GG2313333 *dp, &lv = *(dp=new (buf) ::aaa::GG2313333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2313333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2313333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE231*), 0, "_ZN3aaa9GG2313333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE231*), ABISELECT(16,8), "_ZN3aaa9GG2313333E");
    check_base_class_offset(lv, (::aaa::EE231*), 0, "_ZN3aaa9GG2313333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2313333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2313333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2313333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2313333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2313333E);
    dp->::aaa::GG2313333::~GG2313333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2313333E(Test__ZN3aaa9GG2313333E, "_ZN3aaa9GG2313333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2313333C1Ev();
extern void _ZN3aaa9GG2313333D1Ev();
Name_Map name_map__ZN3aaa9GG2313333E[] = {
  NSPAIR(_ZN3aaa9GG2313333C1Ev),
  NSPAIR(_ZN3aaa9GG2313333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE231E;
extern VTBL_ENTRY _ZTIN3aaa5EE231E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE231E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2313333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE231E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2313333E[];
extern void _ZN3aaa9GG23133333barEv();
extern void _ZN3aaa9GG23133333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23133333fooEv,_ZThn8_N3aaa9GG23133333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23133333barEv,_ZThn8_N3aaa9GG23133333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23133333fooEv,_ZThn20_N3aaa9GG23133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23133333barEv,_ZThn20_N3aaa9GG23133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23133333fooEv,_ZThn28_N3aaa9GG23133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23133333barEv,_ZThn28_N3aaa9GG23133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2313333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23133333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23133333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133333fooEv,_ZThn8_N3aaa9GG23133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23133333barEv,_ZThn8_N3aaa9GG23133333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133333fooEv,_ZThn20_N3aaa9GG23133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23133333barEv,_ZThn20_N3aaa9GG23133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133333fooEv,_ZThn28_N3aaa9GG23133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23133333barEv,_ZThn28_N3aaa9GG23133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2313333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2313333E[];
Class_Descriptor cd__ZN3aaa9GG2313333E = {  "_ZN3aaa9GG2313333E", // class name
  bases__ZN3aaa9GG2313333E, 6,
  &(vtc__ZN3aaa9GG2313333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2313333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2313333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321111  : ::aaa::EE232 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23211113fooEv
  ~GG2321111(); // tgen
  GG2321111(); // tgen
};
//SIG(1 _ZN3aaa9GG2321111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23211113fooEv");}
aaa::GG2321111 ::~GG2321111(){ note_dtor("_ZN3aaa9GG2321111E", this);} // tgen
aaa::GG2321111 ::GG2321111(){ note_ctor("_ZN3aaa9GG2321111E", this);} // tgen
}
static void Test__ZN3aaa9GG2321111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321111E, buf);
    ::aaa::GG2321111 *dp, &lv = *(dp=new (buf) ::aaa::GG2321111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321111E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2321111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2321111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2321111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321111E);
    dp->::aaa::GG2321111::~GG2321111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321111E(Test__ZN3aaa9GG2321111E, "_ZN3aaa9GG2321111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321111C1Ev();
extern void _ZN3aaa9GG2321111D1Ev();
Name_Map name_map__ZN3aaa9GG2321111E[] = {
  NSPAIR(_ZN3aaa9GG2321111C1Ev),
  NSPAIR(_ZN3aaa9GG2321111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2321111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321111E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23211113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211113fooEv,_ZThn8_N3aaa9GG23211113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23211113fooEv,_ZThn20_N3aaa9GG23211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23211113fooEv,_ZThn28_N3aaa9GG23211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23211113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211113fooEv,_ZThn8_N3aaa9GG23211113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211113fooEv,_ZThn20_N3aaa9GG23211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23211113fooEv,_ZThn28_N3aaa9GG23211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321111E[];
Class_Descriptor cd__ZN3aaa9GG2321111E = {  "_ZN3aaa9GG2321111E", // class name
  bases__ZN3aaa9GG2321111E, 6,
  &(vtc__ZN3aaa9GG2321111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321112  : ::aaa::EE232 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23211123barEv
  ~GG2321112(); // tgen
  GG2321112(); // tgen
};
//SIG(1 _ZN3aaa9GG2321112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23211123barEv");}
aaa::GG2321112 ::~GG2321112(){ note_dtor("_ZN3aaa9GG2321112E", this);} // tgen
aaa::GG2321112 ::GG2321112(){ note_ctor("_ZN3aaa9GG2321112E", this);} // tgen
}
static void Test__ZN3aaa9GG2321112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321112E, buf);
    ::aaa::GG2321112 *dp, &lv = *(dp=new (buf) ::aaa::GG2321112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321112E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2321112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2321112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2321112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321112E);
    dp->::aaa::GG2321112::~GG2321112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321112E(Test__ZN3aaa9GG2321112E, "_ZN3aaa9GG2321112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321112C1Ev();
extern void _ZN3aaa9GG2321112D1Ev();
Name_Map name_map__ZN3aaa9GG2321112E[] = {
  NSPAIR(_ZN3aaa9GG2321112C1Ev),
  NSPAIR(_ZN3aaa9GG2321112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2321112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321112E[];
extern void _ZN3aaa9GG23211123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211123barEv,_ZThn8_N3aaa9GG23211123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211123barEv,_ZThn8_N3aaa9GG23211123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321112E[];
Class_Descriptor cd__ZN3aaa9GG2321112E = {  "_ZN3aaa9GG2321112E", // class name
  bases__ZN3aaa9GG2321112E, 6,
  &(vtc__ZN3aaa9GG2321112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321113  : ::aaa::EE232 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23211133fooEv
  virtual void  bar(); // _ZN3aaa9GG23211133barEv
  ~GG2321113(); // tgen
  GG2321113(); // tgen
};
//SIG(1 _ZN3aaa9GG2321113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23211133fooEv");}
void  aaa::GG2321113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23211133barEv");}
aaa::GG2321113 ::~GG2321113(){ note_dtor("_ZN3aaa9GG2321113E", this);} // tgen
aaa::GG2321113 ::GG2321113(){ note_ctor("_ZN3aaa9GG2321113E", this);} // tgen
}
static void Test__ZN3aaa9GG2321113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321113E, buf);
    ::aaa::GG2321113 *dp, &lv = *(dp=new (buf) ::aaa::GG2321113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321113E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2321113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2321113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2321113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321113E);
    dp->::aaa::GG2321113::~GG2321113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321113E(Test__ZN3aaa9GG2321113E, "_ZN3aaa9GG2321113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321113C1Ev();
extern void _ZN3aaa9GG2321113D1Ev();
Name_Map name_map__ZN3aaa9GG2321113E[] = {
  NSPAIR(_ZN3aaa9GG2321113C1Ev),
  NSPAIR(_ZN3aaa9GG2321113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2321113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321113E[];
extern void _ZN3aaa9GG23211133barEv();
extern void _ZN3aaa9GG23211133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211133fooEv,_ZThn8_N3aaa9GG23211133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23211133barEv,_ZThn8_N3aaa9GG23211133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23211133fooEv,_ZThn20_N3aaa9GG23211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23211133fooEv,_ZThn28_N3aaa9GG23211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23211133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23211133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211133fooEv,_ZThn8_N3aaa9GG23211133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211133barEv,_ZThn8_N3aaa9GG23211133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211133fooEv,_ZThn20_N3aaa9GG23211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23211133fooEv,_ZThn28_N3aaa9GG23211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321113E[];
Class_Descriptor cd__ZN3aaa9GG2321113E = {  "_ZN3aaa9GG2321113E", // class name
  bases__ZN3aaa9GG2321113E, 6,
  &(vtc__ZN3aaa9GG2321113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321121  : ::aaa::EE232 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23211213fooEv
  ~GG2321121(); // tgen
  GG2321121(); // tgen
};
//SIG(1 _ZN3aaa9GG2321121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23211213fooEv");}
aaa::GG2321121 ::~GG2321121(){ note_dtor("_ZN3aaa9GG2321121E", this);} // tgen
aaa::GG2321121 ::GG2321121(){ note_ctor("_ZN3aaa9GG2321121E", this);} // tgen
}
static void Test__ZN3aaa9GG2321121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321121E, buf);
    ::aaa::GG2321121 *dp, &lv = *(dp=new (buf) ::aaa::GG2321121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321121E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2321121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2321121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2321121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321121E);
    dp->::aaa::GG2321121::~GG2321121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321121E(Test__ZN3aaa9GG2321121E, "_ZN3aaa9GG2321121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321121C1Ev();
extern void _ZN3aaa9GG2321121D1Ev();
Name_Map name_map__ZN3aaa9GG2321121E[] = {
  NSPAIR(_ZN3aaa9GG2321121C1Ev),
  NSPAIR(_ZN3aaa9GG2321121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2321121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321121E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23211213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211213fooEv,_ZThn8_N3aaa9GG23211213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23211213fooEv,_ZThn20_N3aaa9GG23211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23211213fooEv,_ZThn28_N3aaa9GG23211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23211213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211213fooEv,_ZThn8_N3aaa9GG23211213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211213fooEv,_ZThn20_N3aaa9GG23211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23211213fooEv,_ZThn28_N3aaa9GG23211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321121E[];
Class_Descriptor cd__ZN3aaa9GG2321121E = {  "_ZN3aaa9GG2321121E", // class name
  bases__ZN3aaa9GG2321121E, 6,
  &(vtc__ZN3aaa9GG2321121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321122  : ::aaa::EE232 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23211223barEv
  ~GG2321122(); // tgen
  GG2321122(); // tgen
};
//SIG(1 _ZN3aaa9GG2321122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23211223barEv");}
aaa::GG2321122 ::~GG2321122(){ note_dtor("_ZN3aaa9GG2321122E", this);} // tgen
aaa::GG2321122 ::GG2321122(){ note_ctor("_ZN3aaa9GG2321122E", this);} // tgen
}
static void Test__ZN3aaa9GG2321122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321122E, buf);
    ::aaa::GG2321122 *dp, &lv = *(dp=new (buf) ::aaa::GG2321122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321122E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2321122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2321122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2321122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321122E);
    dp->::aaa::GG2321122::~GG2321122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321122E(Test__ZN3aaa9GG2321122E, "_ZN3aaa9GG2321122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321122C1Ev();
extern void _ZN3aaa9GG2321122D1Ev();
Name_Map name_map__ZN3aaa9GG2321122E[] = {
  NSPAIR(_ZN3aaa9GG2321122C1Ev),
  NSPAIR(_ZN3aaa9GG2321122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2321122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321122E[];
extern void _ZN3aaa9GG23211223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211223barEv,_ZThn8_N3aaa9GG23211223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23211223barEv,_ZThn20_N3aaa9GG23211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211223barEv,_ZThn8_N3aaa9GG23211223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211223barEv,_ZThn20_N3aaa9GG23211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321122E[];
Class_Descriptor cd__ZN3aaa9GG2321122E = {  "_ZN3aaa9GG2321122E", // class name
  bases__ZN3aaa9GG2321122E, 6,
  &(vtc__ZN3aaa9GG2321122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321123  : ::aaa::EE232 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23211233fooEv
  virtual void  bar(); // _ZN3aaa9GG23211233barEv
  ~GG2321123(); // tgen
  GG2321123(); // tgen
};
//SIG(1 _ZN3aaa9GG2321123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23211233fooEv");}
void  aaa::GG2321123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23211233barEv");}
aaa::GG2321123 ::~GG2321123(){ note_dtor("_ZN3aaa9GG2321123E", this);} // tgen
aaa::GG2321123 ::GG2321123(){ note_ctor("_ZN3aaa9GG2321123E", this);} // tgen
}
static void Test__ZN3aaa9GG2321123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321123E, buf);
    ::aaa::GG2321123 *dp, &lv = *(dp=new (buf) ::aaa::GG2321123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321123E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2321123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2321123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2321123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321123E);
    dp->::aaa::GG2321123::~GG2321123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321123E(Test__ZN3aaa9GG2321123E, "_ZN3aaa9GG2321123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321123C1Ev();
extern void _ZN3aaa9GG2321123D1Ev();
Name_Map name_map__ZN3aaa9GG2321123E[] = {
  NSPAIR(_ZN3aaa9GG2321123C1Ev),
  NSPAIR(_ZN3aaa9GG2321123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2321123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321123E[];
extern void _ZN3aaa9GG23211233barEv();
extern void _ZN3aaa9GG23211233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211233fooEv,_ZThn8_N3aaa9GG23211233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23211233barEv,_ZThn8_N3aaa9GG23211233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23211233fooEv,_ZThn20_N3aaa9GG23211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23211233barEv,_ZThn20_N3aaa9GG23211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23211233fooEv,_ZThn28_N3aaa9GG23211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23211233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23211233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211233fooEv,_ZThn8_N3aaa9GG23211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211233barEv,_ZThn8_N3aaa9GG23211233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211233fooEv,_ZThn20_N3aaa9GG23211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211233barEv,_ZThn20_N3aaa9GG23211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23211233fooEv,_ZThn28_N3aaa9GG23211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321123E[];
Class_Descriptor cd__ZN3aaa9GG2321123E = {  "_ZN3aaa9GG2321123E", // class name
  bases__ZN3aaa9GG2321123E, 6,
  &(vtc__ZN3aaa9GG2321123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321131  : ::aaa::EE232 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23211313fooEv
  ~GG2321131(); // tgen
  GG2321131(); // tgen
};
//SIG(1 _ZN3aaa9GG2321131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23211313fooEv");}
aaa::GG2321131 ::~GG2321131(){ note_dtor("_ZN3aaa9GG2321131E", this);} // tgen
aaa::GG2321131 ::GG2321131(){ note_ctor("_ZN3aaa9GG2321131E", this);} // tgen
}
static void Test__ZN3aaa9GG2321131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321131E, buf);
    ::aaa::GG2321131 *dp, &lv = *(dp=new (buf) ::aaa::GG2321131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321131E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2321131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2321131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2321131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321131E);
    dp->::aaa::GG2321131::~GG2321131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321131E(Test__ZN3aaa9GG2321131E, "_ZN3aaa9GG2321131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321131C1Ev();
extern void _ZN3aaa9GG2321131D1Ev();
Name_Map name_map__ZN3aaa9GG2321131E[] = {
  NSPAIR(_ZN3aaa9GG2321131C1Ev),
  NSPAIR(_ZN3aaa9GG2321131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2321131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321131E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23211313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211313fooEv,_ZThn8_N3aaa9GG23211313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23211313fooEv,_ZThn20_N3aaa9GG23211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23211313fooEv,_ZThn28_N3aaa9GG23211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23211313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211313fooEv,_ZThn8_N3aaa9GG23211313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211313fooEv,_ZThn20_N3aaa9GG23211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23211313fooEv,_ZThn28_N3aaa9GG23211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321131E[];
Class_Descriptor cd__ZN3aaa9GG2321131E = {  "_ZN3aaa9GG2321131E", // class name
  bases__ZN3aaa9GG2321131E, 6,
  &(vtc__ZN3aaa9GG2321131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321132  : ::aaa::EE232 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23211323barEv
  ~GG2321132(); // tgen
  GG2321132(); // tgen
};
//SIG(1 _ZN3aaa9GG2321132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23211323barEv");}
aaa::GG2321132 ::~GG2321132(){ note_dtor("_ZN3aaa9GG2321132E", this);} // tgen
aaa::GG2321132 ::GG2321132(){ note_ctor("_ZN3aaa9GG2321132E", this);} // tgen
}
static void Test__ZN3aaa9GG2321132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321132E, buf);
    ::aaa::GG2321132 *dp, &lv = *(dp=new (buf) ::aaa::GG2321132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321132E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2321132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2321132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2321132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321132E);
    dp->::aaa::GG2321132::~GG2321132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321132E(Test__ZN3aaa9GG2321132E, "_ZN3aaa9GG2321132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321132C1Ev();
extern void _ZN3aaa9GG2321132D1Ev();
Name_Map name_map__ZN3aaa9GG2321132E[] = {
  NSPAIR(_ZN3aaa9GG2321132C1Ev),
  NSPAIR(_ZN3aaa9GG2321132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2321132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321132E[];
extern void _ZN3aaa9GG23211323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211323barEv,_ZThn8_N3aaa9GG23211323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23211323barEv,_ZThn20_N3aaa9GG23211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211323barEv,_ZThn8_N3aaa9GG23211323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211323barEv,_ZThn20_N3aaa9GG23211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321132E[];
Class_Descriptor cd__ZN3aaa9GG2321132E = {  "_ZN3aaa9GG2321132E", // class name
  bases__ZN3aaa9GG2321132E, 6,
  &(vtc__ZN3aaa9GG2321132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321133  : ::aaa::EE232 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23211333fooEv
  virtual void  bar(); // _ZN3aaa9GG23211333barEv
  ~GG2321133(); // tgen
  GG2321133(); // tgen
};
//SIG(1 _ZN3aaa9GG2321133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23211333fooEv");}
void  aaa::GG2321133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23211333barEv");}
aaa::GG2321133 ::~GG2321133(){ note_dtor("_ZN3aaa9GG2321133E", this);} // tgen
aaa::GG2321133 ::GG2321133(){ note_ctor("_ZN3aaa9GG2321133E", this);} // tgen
}
static void Test__ZN3aaa9GG2321133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321133E, buf);
    ::aaa::GG2321133 *dp, &lv = *(dp=new (buf) ::aaa::GG2321133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321133E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2321133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2321133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2321133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321133E);
    dp->::aaa::GG2321133::~GG2321133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321133E(Test__ZN3aaa9GG2321133E, "_ZN3aaa9GG2321133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321133C1Ev();
extern void _ZN3aaa9GG2321133D1Ev();
Name_Map name_map__ZN3aaa9GG2321133E[] = {
  NSPAIR(_ZN3aaa9GG2321133C1Ev),
  NSPAIR(_ZN3aaa9GG2321133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2321133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321133E[];
extern void _ZN3aaa9GG23211333barEv();
extern void _ZN3aaa9GG23211333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23211333fooEv,_ZThn8_N3aaa9GG23211333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23211333barEv,_ZThn8_N3aaa9GG23211333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23211333fooEv,_ZThn20_N3aaa9GG23211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23211333barEv,_ZThn20_N3aaa9GG23211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23211333fooEv,_ZThn28_N3aaa9GG23211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23211333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23211333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211333fooEv,_ZThn8_N3aaa9GG23211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23211333barEv,_ZThn8_N3aaa9GG23211333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211333fooEv,_ZThn20_N3aaa9GG23211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23211333barEv,_ZThn20_N3aaa9GG23211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23211333fooEv,_ZThn28_N3aaa9GG23211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321133E[];
Class_Descriptor cd__ZN3aaa9GG2321133E = {  "_ZN3aaa9GG2321133E", // class name
  bases__ZN3aaa9GG2321133E, 6,
  &(vtc__ZN3aaa9GG2321133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321211  : ::aaa::EE232 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23212113fooEv
  ~GG2321211(); // tgen
  GG2321211(); // tgen
};
//SIG(1 _ZN3aaa9GG2321211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23212113fooEv");}
aaa::GG2321211 ::~GG2321211(){ note_dtor("_ZN3aaa9GG2321211E", this);} // tgen
aaa::GG2321211 ::GG2321211(){ note_ctor("_ZN3aaa9GG2321211E", this);} // tgen
}
static void Test__ZN3aaa9GG2321211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321211E, buf);
    ::aaa::GG2321211 *dp, &lv = *(dp=new (buf) ::aaa::GG2321211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321211E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2321211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2321211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2321211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321211E);
    dp->::aaa::GG2321211::~GG2321211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321211E(Test__ZN3aaa9GG2321211E, "_ZN3aaa9GG2321211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321211C1Ev();
extern void _ZN3aaa9GG2321211D1Ev();
Name_Map name_map__ZN3aaa9GG2321211E[] = {
  NSPAIR(_ZN3aaa9GG2321211C1Ev),
  NSPAIR(_ZN3aaa9GG2321211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2321211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321211E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23212113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212113fooEv,_ZThn8_N3aaa9GG23212113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23212113fooEv,_ZThn20_N3aaa9GG23212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23212113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212113fooEv,_ZThn8_N3aaa9GG23212113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212113fooEv,_ZThn20_N3aaa9GG23212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321211E[];
Class_Descriptor cd__ZN3aaa9GG2321211E = {  "_ZN3aaa9GG2321211E", // class name
  bases__ZN3aaa9GG2321211E, 6,
  &(vtc__ZN3aaa9GG2321211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321212  : ::aaa::EE232 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23212123barEv
  ~GG2321212(); // tgen
  GG2321212(); // tgen
};
//SIG(1 _ZN3aaa9GG2321212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23212123barEv");}
aaa::GG2321212 ::~GG2321212(){ note_dtor("_ZN3aaa9GG2321212E", this);} // tgen
aaa::GG2321212 ::GG2321212(){ note_ctor("_ZN3aaa9GG2321212E", this);} // tgen
}
static void Test__ZN3aaa9GG2321212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321212E, buf);
    ::aaa::GG2321212 *dp, &lv = *(dp=new (buf) ::aaa::GG2321212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321212E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2321212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2321212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2321212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321212E);
    dp->::aaa::GG2321212::~GG2321212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321212E(Test__ZN3aaa9GG2321212E, "_ZN3aaa9GG2321212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321212C1Ev();
extern void _ZN3aaa9GG2321212D1Ev();
Name_Map name_map__ZN3aaa9GG2321212E[] = {
  NSPAIR(_ZN3aaa9GG2321212C1Ev),
  NSPAIR(_ZN3aaa9GG2321212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2321212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321212E[];
extern void _ZN3aaa9GG23212123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212123barEv,_ZThn8_N3aaa9GG23212123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23212123barEv,_ZThn28_N3aaa9GG23212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212123barEv,_ZThn8_N3aaa9GG23212123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23212123barEv,_ZThn28_N3aaa9GG23212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321212E[];
Class_Descriptor cd__ZN3aaa9GG2321212E = {  "_ZN3aaa9GG2321212E", // class name
  bases__ZN3aaa9GG2321212E, 6,
  &(vtc__ZN3aaa9GG2321212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321213  : ::aaa::EE232 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23212133fooEv
  virtual void  bar(); // _ZN3aaa9GG23212133barEv
  ~GG2321213(); // tgen
  GG2321213(); // tgen
};
//SIG(1 _ZN3aaa9GG2321213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23212133fooEv");}
void  aaa::GG2321213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23212133barEv");}
aaa::GG2321213 ::~GG2321213(){ note_dtor("_ZN3aaa9GG2321213E", this);} // tgen
aaa::GG2321213 ::GG2321213(){ note_ctor("_ZN3aaa9GG2321213E", this);} // tgen
}
static void Test__ZN3aaa9GG2321213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321213E, buf);
    ::aaa::GG2321213 *dp, &lv = *(dp=new (buf) ::aaa::GG2321213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321213E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2321213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2321213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2321213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321213E);
    dp->::aaa::GG2321213::~GG2321213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321213E(Test__ZN3aaa9GG2321213E, "_ZN3aaa9GG2321213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321213C1Ev();
extern void _ZN3aaa9GG2321213D1Ev();
Name_Map name_map__ZN3aaa9GG2321213E[] = {
  NSPAIR(_ZN3aaa9GG2321213C1Ev),
  NSPAIR(_ZN3aaa9GG2321213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2321213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321213E[];
extern void _ZN3aaa9GG23212133barEv();
extern void _ZN3aaa9GG23212133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212133fooEv,_ZThn8_N3aaa9GG23212133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23212133barEv,_ZThn8_N3aaa9GG23212133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23212133fooEv,_ZThn20_N3aaa9GG23212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23212133barEv,_ZThn28_N3aaa9GG23212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23212133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23212133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212133fooEv,_ZThn8_N3aaa9GG23212133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212133barEv,_ZThn8_N3aaa9GG23212133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212133fooEv,_ZThn20_N3aaa9GG23212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23212133barEv,_ZThn28_N3aaa9GG23212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321213E[];
Class_Descriptor cd__ZN3aaa9GG2321213E = {  "_ZN3aaa9GG2321213E", // class name
  bases__ZN3aaa9GG2321213E, 6,
  &(vtc__ZN3aaa9GG2321213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321221  : ::aaa::EE232 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23212213fooEv
  ~GG2321221(); // tgen
  GG2321221(); // tgen
};
//SIG(1 _ZN3aaa9GG2321221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23212213fooEv");}
aaa::GG2321221 ::~GG2321221(){ note_dtor("_ZN3aaa9GG2321221E", this);} // tgen
aaa::GG2321221 ::GG2321221(){ note_ctor("_ZN3aaa9GG2321221E", this);} // tgen
}
static void Test__ZN3aaa9GG2321221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321221E, buf);
    ::aaa::GG2321221 *dp, &lv = *(dp=new (buf) ::aaa::GG2321221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321221E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2321221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2321221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2321221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321221E);
    dp->::aaa::GG2321221::~GG2321221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321221E(Test__ZN3aaa9GG2321221E, "_ZN3aaa9GG2321221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321221C1Ev();
extern void _ZN3aaa9GG2321221D1Ev();
Name_Map name_map__ZN3aaa9GG2321221E[] = {
  NSPAIR(_ZN3aaa9GG2321221C1Ev),
  NSPAIR(_ZN3aaa9GG2321221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2321221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321221E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23212213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212213fooEv,_ZThn8_N3aaa9GG23212213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23212213fooEv,_ZThn20_N3aaa9GG23212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23212213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212213fooEv,_ZThn8_N3aaa9GG23212213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212213fooEv,_ZThn20_N3aaa9GG23212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321221E[];
Class_Descriptor cd__ZN3aaa9GG2321221E = {  "_ZN3aaa9GG2321221E", // class name
  bases__ZN3aaa9GG2321221E, 6,
  &(vtc__ZN3aaa9GG2321221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321222  : ::aaa::EE232 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23212223barEv
  ~GG2321222(); // tgen
  GG2321222(); // tgen
};
//SIG(1 _ZN3aaa9GG2321222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23212223barEv");}
aaa::GG2321222 ::~GG2321222(){ note_dtor("_ZN3aaa9GG2321222E", this);} // tgen
aaa::GG2321222 ::GG2321222(){ note_ctor("_ZN3aaa9GG2321222E", this);} // tgen
}
static void Test__ZN3aaa9GG2321222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321222E, buf);
    ::aaa::GG2321222 *dp, &lv = *(dp=new (buf) ::aaa::GG2321222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321222E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2321222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2321222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2321222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321222E);
    dp->::aaa::GG2321222::~GG2321222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321222E(Test__ZN3aaa9GG2321222E, "_ZN3aaa9GG2321222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321222C1Ev();
extern void _ZN3aaa9GG2321222D1Ev();
Name_Map name_map__ZN3aaa9GG2321222E[] = {
  NSPAIR(_ZN3aaa9GG2321222C1Ev),
  NSPAIR(_ZN3aaa9GG2321222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2321222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321222E[];
extern void _ZN3aaa9GG23212223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212223barEv,_ZThn8_N3aaa9GG23212223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23212223barEv,_ZThn20_N3aaa9GG23212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23212223barEv,_ZThn28_N3aaa9GG23212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212223barEv,_ZThn8_N3aaa9GG23212223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212223barEv,_ZThn20_N3aaa9GG23212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23212223barEv,_ZThn28_N3aaa9GG23212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321222E[];
Class_Descriptor cd__ZN3aaa9GG2321222E = {  "_ZN3aaa9GG2321222E", // class name
  bases__ZN3aaa9GG2321222E, 6,
  &(vtc__ZN3aaa9GG2321222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321223  : ::aaa::EE232 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23212233fooEv
  virtual void  bar(); // _ZN3aaa9GG23212233barEv
  ~GG2321223(); // tgen
  GG2321223(); // tgen
};
//SIG(1 _ZN3aaa9GG2321223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23212233fooEv");}
void  aaa::GG2321223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23212233barEv");}
aaa::GG2321223 ::~GG2321223(){ note_dtor("_ZN3aaa9GG2321223E", this);} // tgen
aaa::GG2321223 ::GG2321223(){ note_ctor("_ZN3aaa9GG2321223E", this);} // tgen
}
static void Test__ZN3aaa9GG2321223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321223E, buf);
    ::aaa::GG2321223 *dp, &lv = *(dp=new (buf) ::aaa::GG2321223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321223E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2321223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2321223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2321223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321223E);
    dp->::aaa::GG2321223::~GG2321223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321223E(Test__ZN3aaa9GG2321223E, "_ZN3aaa9GG2321223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321223C1Ev();
extern void _ZN3aaa9GG2321223D1Ev();
Name_Map name_map__ZN3aaa9GG2321223E[] = {
  NSPAIR(_ZN3aaa9GG2321223C1Ev),
  NSPAIR(_ZN3aaa9GG2321223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2321223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321223E[];
extern void _ZN3aaa9GG23212233barEv();
extern void _ZN3aaa9GG23212233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212233fooEv,_ZThn8_N3aaa9GG23212233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23212233barEv,_ZThn8_N3aaa9GG23212233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23212233fooEv,_ZThn20_N3aaa9GG23212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23212233barEv,_ZThn20_N3aaa9GG23212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23212233barEv,_ZThn28_N3aaa9GG23212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23212233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23212233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212233fooEv,_ZThn8_N3aaa9GG23212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212233barEv,_ZThn8_N3aaa9GG23212233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212233fooEv,_ZThn20_N3aaa9GG23212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212233barEv,_ZThn20_N3aaa9GG23212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23212233barEv,_ZThn28_N3aaa9GG23212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321223E[];
Class_Descriptor cd__ZN3aaa9GG2321223E = {  "_ZN3aaa9GG2321223E", // class name
  bases__ZN3aaa9GG2321223E, 6,
  &(vtc__ZN3aaa9GG2321223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321231  : ::aaa::EE232 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23212313fooEv
  ~GG2321231(); // tgen
  GG2321231(); // tgen
};
//SIG(1 _ZN3aaa9GG2321231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23212313fooEv");}
aaa::GG2321231 ::~GG2321231(){ note_dtor("_ZN3aaa9GG2321231E", this);} // tgen
aaa::GG2321231 ::GG2321231(){ note_ctor("_ZN3aaa9GG2321231E", this);} // tgen
}
static void Test__ZN3aaa9GG2321231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321231E, buf);
    ::aaa::GG2321231 *dp, &lv = *(dp=new (buf) ::aaa::GG2321231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321231E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2321231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2321231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2321231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321231E);
    dp->::aaa::GG2321231::~GG2321231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321231E(Test__ZN3aaa9GG2321231E, "_ZN3aaa9GG2321231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321231C1Ev();
extern void _ZN3aaa9GG2321231D1Ev();
Name_Map name_map__ZN3aaa9GG2321231E[] = {
  NSPAIR(_ZN3aaa9GG2321231C1Ev),
  NSPAIR(_ZN3aaa9GG2321231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2321231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321231E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23212313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212313fooEv,_ZThn8_N3aaa9GG23212313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23212313fooEv,_ZThn20_N3aaa9GG23212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23212313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212313fooEv,_ZThn8_N3aaa9GG23212313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212313fooEv,_ZThn20_N3aaa9GG23212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321231E[];
Class_Descriptor cd__ZN3aaa9GG2321231E = {  "_ZN3aaa9GG2321231E", // class name
  bases__ZN3aaa9GG2321231E, 6,
  &(vtc__ZN3aaa9GG2321231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321232  : ::aaa::EE232 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23212323barEv
  ~GG2321232(); // tgen
  GG2321232(); // tgen
};
//SIG(1 _ZN3aaa9GG2321232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23212323barEv");}
aaa::GG2321232 ::~GG2321232(){ note_dtor("_ZN3aaa9GG2321232E", this);} // tgen
aaa::GG2321232 ::GG2321232(){ note_ctor("_ZN3aaa9GG2321232E", this);} // tgen
}
static void Test__ZN3aaa9GG2321232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321232E, buf);
    ::aaa::GG2321232 *dp, &lv = *(dp=new (buf) ::aaa::GG2321232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321232E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2321232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2321232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2321232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321232E);
    dp->::aaa::GG2321232::~GG2321232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321232E(Test__ZN3aaa9GG2321232E, "_ZN3aaa9GG2321232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321232C1Ev();
extern void _ZN3aaa9GG2321232D1Ev();
Name_Map name_map__ZN3aaa9GG2321232E[] = {
  NSPAIR(_ZN3aaa9GG2321232C1Ev),
  NSPAIR(_ZN3aaa9GG2321232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2321232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321232E[];
extern void _ZN3aaa9GG23212323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212323barEv,_ZThn8_N3aaa9GG23212323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23212323barEv,_ZThn20_N3aaa9GG23212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23212323barEv,_ZThn28_N3aaa9GG23212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212323barEv,_ZThn8_N3aaa9GG23212323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212323barEv,_ZThn20_N3aaa9GG23212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23212323barEv,_ZThn28_N3aaa9GG23212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321232E[];
Class_Descriptor cd__ZN3aaa9GG2321232E = {  "_ZN3aaa9GG2321232E", // class name
  bases__ZN3aaa9GG2321232E, 6,
  &(vtc__ZN3aaa9GG2321232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321233  : ::aaa::EE232 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23212333fooEv
  virtual void  bar(); // _ZN3aaa9GG23212333barEv
  ~GG2321233(); // tgen
  GG2321233(); // tgen
};
//SIG(1 _ZN3aaa9GG2321233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23212333fooEv");}
void  aaa::GG2321233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23212333barEv");}
aaa::GG2321233 ::~GG2321233(){ note_dtor("_ZN3aaa9GG2321233E", this);} // tgen
aaa::GG2321233 ::GG2321233(){ note_ctor("_ZN3aaa9GG2321233E", this);} // tgen
}
static void Test__ZN3aaa9GG2321233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321233E, buf);
    ::aaa::GG2321233 *dp, &lv = *(dp=new (buf) ::aaa::GG2321233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321233E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2321233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2321233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2321233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321233E);
    dp->::aaa::GG2321233::~GG2321233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321233E(Test__ZN3aaa9GG2321233E, "_ZN3aaa9GG2321233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321233C1Ev();
extern void _ZN3aaa9GG2321233D1Ev();
Name_Map name_map__ZN3aaa9GG2321233E[] = {
  NSPAIR(_ZN3aaa9GG2321233C1Ev),
  NSPAIR(_ZN3aaa9GG2321233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2321233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321233E[];
extern void _ZN3aaa9GG23212333barEv();
extern void _ZN3aaa9GG23212333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23212333fooEv,_ZThn8_N3aaa9GG23212333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23212333barEv,_ZThn8_N3aaa9GG23212333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23212333fooEv,_ZThn20_N3aaa9GG23212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23212333barEv,_ZThn20_N3aaa9GG23212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23212333barEv,_ZThn28_N3aaa9GG23212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23212333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23212333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212333fooEv,_ZThn8_N3aaa9GG23212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23212333barEv,_ZThn8_N3aaa9GG23212333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212333fooEv,_ZThn20_N3aaa9GG23212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23212333barEv,_ZThn20_N3aaa9GG23212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23212333barEv,_ZThn28_N3aaa9GG23212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321233E[];
Class_Descriptor cd__ZN3aaa9GG2321233E = {  "_ZN3aaa9GG2321233E", // class name
  bases__ZN3aaa9GG2321233E, 6,
  &(vtc__ZN3aaa9GG2321233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321311  : ::aaa::EE232 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23213113fooEv
  ~GG2321311(); // tgen
  GG2321311(); // tgen
};
//SIG(1 _ZN3aaa9GG2321311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23213113fooEv");}
aaa::GG2321311 ::~GG2321311(){ note_dtor("_ZN3aaa9GG2321311E", this);} // tgen
aaa::GG2321311 ::GG2321311(){ note_ctor("_ZN3aaa9GG2321311E", this);} // tgen
}
static void Test__ZN3aaa9GG2321311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321311E, buf);
    ::aaa::GG2321311 *dp, &lv = *(dp=new (buf) ::aaa::GG2321311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321311E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2321311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2321311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2321311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321311E);
    dp->::aaa::GG2321311::~GG2321311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321311E(Test__ZN3aaa9GG2321311E, "_ZN3aaa9GG2321311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321311C1Ev();
extern void _ZN3aaa9GG2321311D1Ev();
Name_Map name_map__ZN3aaa9GG2321311E[] = {
  NSPAIR(_ZN3aaa9GG2321311C1Ev),
  NSPAIR(_ZN3aaa9GG2321311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2321311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321311E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23213113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213113fooEv,_ZThn8_N3aaa9GG23213113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23213113fooEv,_ZThn20_N3aaa9GG23213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213113fooEv,_ZThn28_N3aaa9GG23213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23213113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213113fooEv,_ZThn8_N3aaa9GG23213113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213113fooEv,_ZThn20_N3aaa9GG23213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213113fooEv,_ZThn28_N3aaa9GG23213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321311E[];
Class_Descriptor cd__ZN3aaa9GG2321311E = {  "_ZN3aaa9GG2321311E", // class name
  bases__ZN3aaa9GG2321311E, 6,
  &(vtc__ZN3aaa9GG2321311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321312  : ::aaa::EE232 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23213123barEv
  ~GG2321312(); // tgen
  GG2321312(); // tgen
};
//SIG(1 _ZN3aaa9GG2321312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23213123barEv");}
aaa::GG2321312 ::~GG2321312(){ note_dtor("_ZN3aaa9GG2321312E", this);} // tgen
aaa::GG2321312 ::GG2321312(){ note_ctor("_ZN3aaa9GG2321312E", this);} // tgen
}
static void Test__ZN3aaa9GG2321312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321312E, buf);
    ::aaa::GG2321312 *dp, &lv = *(dp=new (buf) ::aaa::GG2321312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321312E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2321312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2321312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2321312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321312E);
    dp->::aaa::GG2321312::~GG2321312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321312E(Test__ZN3aaa9GG2321312E, "_ZN3aaa9GG2321312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321312C1Ev();
extern void _ZN3aaa9GG2321312D1Ev();
Name_Map name_map__ZN3aaa9GG2321312E[] = {
  NSPAIR(_ZN3aaa9GG2321312C1Ev),
  NSPAIR(_ZN3aaa9GG2321312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2321312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321312E[];
extern void _ZN3aaa9GG23213123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213123barEv,_ZThn8_N3aaa9GG23213123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213123barEv,_ZThn28_N3aaa9GG23213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213123barEv,_ZThn8_N3aaa9GG23213123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213123barEv,_ZThn28_N3aaa9GG23213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321312E[];
Class_Descriptor cd__ZN3aaa9GG2321312E = {  "_ZN3aaa9GG2321312E", // class name
  bases__ZN3aaa9GG2321312E, 6,
  &(vtc__ZN3aaa9GG2321312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321313  : ::aaa::EE232 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23213133fooEv
  virtual void  bar(); // _ZN3aaa9GG23213133barEv
  ~GG2321313(); // tgen
  GG2321313(); // tgen
};
//SIG(1 _ZN3aaa9GG2321313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23213133fooEv");}
void  aaa::GG2321313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23213133barEv");}
aaa::GG2321313 ::~GG2321313(){ note_dtor("_ZN3aaa9GG2321313E", this);} // tgen
aaa::GG2321313 ::GG2321313(){ note_ctor("_ZN3aaa9GG2321313E", this);} // tgen
}
static void Test__ZN3aaa9GG2321313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321313E, buf);
    ::aaa::GG2321313 *dp, &lv = *(dp=new (buf) ::aaa::GG2321313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321313E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2321313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2321313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2321313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321313E);
    dp->::aaa::GG2321313::~GG2321313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321313E(Test__ZN3aaa9GG2321313E, "_ZN3aaa9GG2321313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321313C1Ev();
extern void _ZN3aaa9GG2321313D1Ev();
Name_Map name_map__ZN3aaa9GG2321313E[] = {
  NSPAIR(_ZN3aaa9GG2321313C1Ev),
  NSPAIR(_ZN3aaa9GG2321313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2321313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321313E[];
extern void _ZN3aaa9GG23213133barEv();
extern void _ZN3aaa9GG23213133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213133fooEv,_ZThn8_N3aaa9GG23213133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23213133barEv,_ZThn8_N3aaa9GG23213133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23213133fooEv,_ZThn20_N3aaa9GG23213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213133fooEv,_ZThn28_N3aaa9GG23213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213133barEv,_ZThn28_N3aaa9GG23213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23213133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23213133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213133fooEv,_ZThn8_N3aaa9GG23213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213133barEv,_ZThn8_N3aaa9GG23213133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213133fooEv,_ZThn20_N3aaa9GG23213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213133fooEv,_ZThn28_N3aaa9GG23213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213133barEv,_ZThn28_N3aaa9GG23213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321313E[];
Class_Descriptor cd__ZN3aaa9GG2321313E = {  "_ZN3aaa9GG2321313E", // class name
  bases__ZN3aaa9GG2321313E, 6,
  &(vtc__ZN3aaa9GG2321313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321321  : ::aaa::EE232 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23213213fooEv
  ~GG2321321(); // tgen
  GG2321321(); // tgen
};
//SIG(1 _ZN3aaa9GG2321321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23213213fooEv");}
aaa::GG2321321 ::~GG2321321(){ note_dtor("_ZN3aaa9GG2321321E", this);} // tgen
aaa::GG2321321 ::GG2321321(){ note_ctor("_ZN3aaa9GG2321321E", this);} // tgen
}
static void Test__ZN3aaa9GG2321321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321321E, buf);
    ::aaa::GG2321321 *dp, &lv = *(dp=new (buf) ::aaa::GG2321321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321321E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2321321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2321321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2321321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321321E);
    dp->::aaa::GG2321321::~GG2321321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321321E(Test__ZN3aaa9GG2321321E, "_ZN3aaa9GG2321321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321321C1Ev();
extern void _ZN3aaa9GG2321321D1Ev();
Name_Map name_map__ZN3aaa9GG2321321E[] = {
  NSPAIR(_ZN3aaa9GG2321321C1Ev),
  NSPAIR(_ZN3aaa9GG2321321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2321321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321321E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23213213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213213fooEv,_ZThn8_N3aaa9GG23213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23213213fooEv,_ZThn20_N3aaa9GG23213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23213213fooEv,_ZThn28_N3aaa9GG23213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23213213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213213fooEv,_ZThn8_N3aaa9GG23213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213213fooEv,_ZThn20_N3aaa9GG23213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213213fooEv,_ZThn28_N3aaa9GG23213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321321E[];
Class_Descriptor cd__ZN3aaa9GG2321321E = {  "_ZN3aaa9GG2321321E", // class name
  bases__ZN3aaa9GG2321321E, 6,
  &(vtc__ZN3aaa9GG2321321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321322  : ::aaa::EE232 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23213223barEv
  ~GG2321322(); // tgen
  GG2321322(); // tgen
};
//SIG(1 _ZN3aaa9GG2321322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23213223barEv");}
aaa::GG2321322 ::~GG2321322(){ note_dtor("_ZN3aaa9GG2321322E", this);} // tgen
aaa::GG2321322 ::GG2321322(){ note_ctor("_ZN3aaa9GG2321322E", this);} // tgen
}
static void Test__ZN3aaa9GG2321322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321322E, buf);
    ::aaa::GG2321322 *dp, &lv = *(dp=new (buf) ::aaa::GG2321322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321322E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2321322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2321322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2321322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321322E);
    dp->::aaa::GG2321322::~GG2321322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321322E(Test__ZN3aaa9GG2321322E, "_ZN3aaa9GG2321322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321322C1Ev();
extern void _ZN3aaa9GG2321322D1Ev();
Name_Map name_map__ZN3aaa9GG2321322E[] = {
  NSPAIR(_ZN3aaa9GG2321322C1Ev),
  NSPAIR(_ZN3aaa9GG2321322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2321322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321322E[];
extern void _ZN3aaa9GG23213223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213223barEv,_ZThn8_N3aaa9GG23213223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23213223barEv,_ZThn20_N3aaa9GG23213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23213223barEv,_ZThn28_N3aaa9GG23213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213223barEv,_ZThn8_N3aaa9GG23213223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213223barEv,_ZThn20_N3aaa9GG23213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213223barEv,_ZThn28_N3aaa9GG23213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321322E[];
Class_Descriptor cd__ZN3aaa9GG2321322E = {  "_ZN3aaa9GG2321322E", // class name
  bases__ZN3aaa9GG2321322E, 6,
  &(vtc__ZN3aaa9GG2321322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321323  : ::aaa::EE232 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23213233fooEv
  virtual void  bar(); // _ZN3aaa9GG23213233barEv
  ~GG2321323(); // tgen
  GG2321323(); // tgen
};
//SIG(1 _ZN3aaa9GG2321323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23213233fooEv");}
void  aaa::GG2321323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23213233barEv");}
aaa::GG2321323 ::~GG2321323(){ note_dtor("_ZN3aaa9GG2321323E", this);} // tgen
aaa::GG2321323 ::GG2321323(){ note_ctor("_ZN3aaa9GG2321323E", this);} // tgen
}
static void Test__ZN3aaa9GG2321323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321323E, buf);
    ::aaa::GG2321323 *dp, &lv = *(dp=new (buf) ::aaa::GG2321323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321323E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2321323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2321323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2321323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321323E);
    dp->::aaa::GG2321323::~GG2321323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321323E(Test__ZN3aaa9GG2321323E, "_ZN3aaa9GG2321323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321323C1Ev();
extern void _ZN3aaa9GG2321323D1Ev();
Name_Map name_map__ZN3aaa9GG2321323E[] = {
  NSPAIR(_ZN3aaa9GG2321323C1Ev),
  NSPAIR(_ZN3aaa9GG2321323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2321323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321323E[];
extern void _ZN3aaa9GG23213233barEv();
extern void _ZN3aaa9GG23213233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213233fooEv,_ZThn8_N3aaa9GG23213233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23213233barEv,_ZThn8_N3aaa9GG23213233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23213233fooEv,_ZThn20_N3aaa9GG23213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23213233barEv,_ZThn20_N3aaa9GG23213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213233fooEv,_ZThn28_N3aaa9GG23213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213233barEv,_ZThn28_N3aaa9GG23213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23213233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23213233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213233fooEv,_ZThn8_N3aaa9GG23213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213233barEv,_ZThn8_N3aaa9GG23213233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213233fooEv,_ZThn20_N3aaa9GG23213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213233barEv,_ZThn20_N3aaa9GG23213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213233fooEv,_ZThn28_N3aaa9GG23213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213233barEv,_ZThn28_N3aaa9GG23213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321323E[];
Class_Descriptor cd__ZN3aaa9GG2321323E = {  "_ZN3aaa9GG2321323E", // class name
  bases__ZN3aaa9GG2321323E, 6,
  &(vtc__ZN3aaa9GG2321323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321331  : ::aaa::EE232 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23213313fooEv
  ~GG2321331(); // tgen
  GG2321331(); // tgen
};
//SIG(1 _ZN3aaa9GG2321331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23213313fooEv");}
aaa::GG2321331 ::~GG2321331(){ note_dtor("_ZN3aaa9GG2321331E", this);} // tgen
aaa::GG2321331 ::GG2321331(){ note_ctor("_ZN3aaa9GG2321331E", this);} // tgen
}
static void Test__ZN3aaa9GG2321331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321331E, buf);
    ::aaa::GG2321331 *dp, &lv = *(dp=new (buf) ::aaa::GG2321331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321331E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2321331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2321331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2321331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321331E);
    dp->::aaa::GG2321331::~GG2321331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321331E(Test__ZN3aaa9GG2321331E, "_ZN3aaa9GG2321331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321331C1Ev();
extern void _ZN3aaa9GG2321331D1Ev();
Name_Map name_map__ZN3aaa9GG2321331E[] = {
  NSPAIR(_ZN3aaa9GG2321331C1Ev),
  NSPAIR(_ZN3aaa9GG2321331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2321331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321331E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23213313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213313fooEv,_ZThn8_N3aaa9GG23213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23213313fooEv,_ZThn20_N3aaa9GG23213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23213313fooEv,_ZThn28_N3aaa9GG23213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23213313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213313fooEv,_ZThn8_N3aaa9GG23213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213313fooEv,_ZThn20_N3aaa9GG23213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213313fooEv,_ZThn28_N3aaa9GG23213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321331E[];
Class_Descriptor cd__ZN3aaa9GG2321331E = {  "_ZN3aaa9GG2321331E", // class name
  bases__ZN3aaa9GG2321331E, 6,
  &(vtc__ZN3aaa9GG2321331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321332  : ::aaa::EE232 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23213323barEv
  ~GG2321332(); // tgen
  GG2321332(); // tgen
};
//SIG(1 _ZN3aaa9GG2321332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2321332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23213323barEv");}
aaa::GG2321332 ::~GG2321332(){ note_dtor("_ZN3aaa9GG2321332E", this);} // tgen
aaa::GG2321332 ::GG2321332(){ note_ctor("_ZN3aaa9GG2321332E", this);} // tgen
}
static void Test__ZN3aaa9GG2321332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321332E, buf);
    ::aaa::GG2321332 *dp, &lv = *(dp=new (buf) ::aaa::GG2321332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321332E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2321332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2321332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2321332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321332E);
    dp->::aaa::GG2321332::~GG2321332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321332E(Test__ZN3aaa9GG2321332E, "_ZN3aaa9GG2321332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321332C1Ev();
extern void _ZN3aaa9GG2321332D1Ev();
Name_Map name_map__ZN3aaa9GG2321332E[] = {
  NSPAIR(_ZN3aaa9GG2321332C1Ev),
  NSPAIR(_ZN3aaa9GG2321332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2321332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321332E[];
extern void _ZN3aaa9GG23213323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213323barEv,_ZThn8_N3aaa9GG23213323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23213323barEv,_ZThn20_N3aaa9GG23213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213323barEv,_ZThn28_N3aaa9GG23213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213323barEv,_ZThn8_N3aaa9GG23213323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213323barEv,_ZThn20_N3aaa9GG23213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213323barEv,_ZThn28_N3aaa9GG23213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321332E[];
Class_Descriptor cd__ZN3aaa9GG2321332E = {  "_ZN3aaa9GG2321332E", // class name
  bases__ZN3aaa9GG2321332E, 6,
  &(vtc__ZN3aaa9GG2321332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2321333  : ::aaa::EE232 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23213333fooEv
  virtual void  bar(); // _ZN3aaa9GG23213333barEv
  ~GG2321333(); // tgen
  GG2321333(); // tgen
};
//SIG(1 _ZN3aaa9GG2321333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2321333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23213333fooEv");}
void  aaa::GG2321333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23213333barEv");}
aaa::GG2321333 ::~GG2321333(){ note_dtor("_ZN3aaa9GG2321333E", this);} // tgen
aaa::GG2321333 ::GG2321333(){ note_ctor("_ZN3aaa9GG2321333E", this);} // tgen
}
static void Test__ZN3aaa9GG2321333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2321333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2321333E, buf);
    ::aaa::GG2321333 *dp, &lv = *(dp=new (buf) ::aaa::GG2321333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2321333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2321333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2321333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2321333E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2321333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2321333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2321333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2321333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2321333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2321333E);
    dp->::aaa::GG2321333::~GG2321333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2321333E(Test__ZN3aaa9GG2321333E, "_ZN3aaa9GG2321333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2321333C1Ev();
extern void _ZN3aaa9GG2321333D1Ev();
Name_Map name_map__ZN3aaa9GG2321333E[] = {
  NSPAIR(_ZN3aaa9GG2321333C1Ev),
  NSPAIR(_ZN3aaa9GG2321333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2321333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2321333E[];
extern void _ZN3aaa9GG23213333barEv();
extern void _ZN3aaa9GG23213333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23213333fooEv,_ZThn8_N3aaa9GG23213333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23213333barEv,_ZThn8_N3aaa9GG23213333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23213333fooEv,_ZThn20_N3aaa9GG23213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23213333barEv,_ZThn20_N3aaa9GG23213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213333fooEv,_ZThn28_N3aaa9GG23213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23213333barEv,_ZThn28_N3aaa9GG23213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2321333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23213333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23213333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213333fooEv,_ZThn8_N3aaa9GG23213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23213333barEv,_ZThn8_N3aaa9GG23213333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213333fooEv,_ZThn20_N3aaa9GG23213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23213333barEv,_ZThn20_N3aaa9GG23213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213333fooEv,_ZThn28_N3aaa9GG23213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23213333barEv,_ZThn28_N3aaa9GG23213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2321333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2321333E[];
Class_Descriptor cd__ZN3aaa9GG2321333E = {  "_ZN3aaa9GG2321333E", // class name
  bases__ZN3aaa9GG2321333E, 6,
  &(vtc__ZN3aaa9GG2321333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2321333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2321333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322111  : ::aaa::EE232 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23221113fooEv
  ~GG2322111(); // tgen
  GG2322111(); // tgen
};
//SIG(1 _ZN3aaa9GG2322111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23221113fooEv");}
aaa::GG2322111 ::~GG2322111(){ note_dtor("_ZN3aaa9GG2322111E", this);} // tgen
aaa::GG2322111 ::GG2322111(){ note_ctor("_ZN3aaa9GG2322111E", this);} // tgen
}
static void Test__ZN3aaa9GG2322111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322111E, buf);
    ::aaa::GG2322111 *dp, &lv = *(dp=new (buf) ::aaa::GG2322111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322111E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2322111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2322111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2322111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322111E);
    dp->::aaa::GG2322111::~GG2322111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322111E(Test__ZN3aaa9GG2322111E, "_ZN3aaa9GG2322111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322111C1Ev();
extern void _ZN3aaa9GG2322111D1Ev();
Name_Map name_map__ZN3aaa9GG2322111E[] = {
  NSPAIR(_ZN3aaa9GG2322111C1Ev),
  NSPAIR(_ZN3aaa9GG2322111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2322111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322111E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23221113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221113fooEv,_ZThn8_N3aaa9GG23221113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23221113fooEv,_ZThn20_N3aaa9GG23221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23221113fooEv,_ZThn28_N3aaa9GG23221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23221113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221113fooEv,_ZThn8_N3aaa9GG23221113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221113fooEv,_ZThn20_N3aaa9GG23221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23221113fooEv,_ZThn28_N3aaa9GG23221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322111E[];
Class_Descriptor cd__ZN3aaa9GG2322111E = {  "_ZN3aaa9GG2322111E", // class name
  bases__ZN3aaa9GG2322111E, 6,
  &(vtc__ZN3aaa9GG2322111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322112  : ::aaa::EE232 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23221123barEv
  ~GG2322112(); // tgen
  GG2322112(); // tgen
};
//SIG(1 _ZN3aaa9GG2322112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23221123barEv");}
aaa::GG2322112 ::~GG2322112(){ note_dtor("_ZN3aaa9GG2322112E", this);} // tgen
aaa::GG2322112 ::GG2322112(){ note_ctor("_ZN3aaa9GG2322112E", this);} // tgen
}
static void Test__ZN3aaa9GG2322112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322112E, buf);
    ::aaa::GG2322112 *dp, &lv = *(dp=new (buf) ::aaa::GG2322112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322112E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2322112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2322112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2322112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322112E);
    dp->::aaa::GG2322112::~GG2322112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322112E(Test__ZN3aaa9GG2322112E, "_ZN3aaa9GG2322112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322112C1Ev();
extern void _ZN3aaa9GG2322112D1Ev();
Name_Map name_map__ZN3aaa9GG2322112E[] = {
  NSPAIR(_ZN3aaa9GG2322112C1Ev),
  NSPAIR(_ZN3aaa9GG2322112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2322112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322112E[];
extern void _ZN3aaa9GG23221123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221123barEv,_ZThn8_N3aaa9GG23221123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23221123barEv,_ZThn20_N3aaa9GG23221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221123barEv,_ZThn8_N3aaa9GG23221123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221123barEv,_ZThn20_N3aaa9GG23221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322112E[];
Class_Descriptor cd__ZN3aaa9GG2322112E = {  "_ZN3aaa9GG2322112E", // class name
  bases__ZN3aaa9GG2322112E, 6,
  &(vtc__ZN3aaa9GG2322112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322113  : ::aaa::EE232 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23221133fooEv
  virtual void  bar(); // _ZN3aaa9GG23221133barEv
  ~GG2322113(); // tgen
  GG2322113(); // tgen
};
//SIG(1 _ZN3aaa9GG2322113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23221133fooEv");}
void  aaa::GG2322113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23221133barEv");}
aaa::GG2322113 ::~GG2322113(){ note_dtor("_ZN3aaa9GG2322113E", this);} // tgen
aaa::GG2322113 ::GG2322113(){ note_ctor("_ZN3aaa9GG2322113E", this);} // tgen
}
static void Test__ZN3aaa9GG2322113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322113E, buf);
    ::aaa::GG2322113 *dp, &lv = *(dp=new (buf) ::aaa::GG2322113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322113E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2322113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2322113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2322113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322113E);
    dp->::aaa::GG2322113::~GG2322113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322113E(Test__ZN3aaa9GG2322113E, "_ZN3aaa9GG2322113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322113C1Ev();
extern void _ZN3aaa9GG2322113D1Ev();
Name_Map name_map__ZN3aaa9GG2322113E[] = {
  NSPAIR(_ZN3aaa9GG2322113C1Ev),
  NSPAIR(_ZN3aaa9GG2322113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2322113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322113E[];
extern void _ZN3aaa9GG23221133barEv();
extern void _ZN3aaa9GG23221133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221133fooEv,_ZThn8_N3aaa9GG23221133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23221133barEv,_ZThn8_N3aaa9GG23221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23221133barEv,_ZThn20_N3aaa9GG23221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23221133fooEv,_ZThn20_N3aaa9GG23221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23221133fooEv,_ZThn28_N3aaa9GG23221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23221133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23221133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221133fooEv,_ZThn8_N3aaa9GG23221133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221133barEv,_ZThn8_N3aaa9GG23221133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221133barEv,_ZThn20_N3aaa9GG23221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221133fooEv,_ZThn20_N3aaa9GG23221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23221133fooEv,_ZThn28_N3aaa9GG23221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322113E[];
Class_Descriptor cd__ZN3aaa9GG2322113E = {  "_ZN3aaa9GG2322113E", // class name
  bases__ZN3aaa9GG2322113E, 6,
  &(vtc__ZN3aaa9GG2322113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322121  : ::aaa::EE232 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23221213fooEv
  ~GG2322121(); // tgen
  GG2322121(); // tgen
};
//SIG(1 _ZN3aaa9GG2322121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23221213fooEv");}
aaa::GG2322121 ::~GG2322121(){ note_dtor("_ZN3aaa9GG2322121E", this);} // tgen
aaa::GG2322121 ::GG2322121(){ note_ctor("_ZN3aaa9GG2322121E", this);} // tgen
}
static void Test__ZN3aaa9GG2322121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322121E, buf);
    ::aaa::GG2322121 *dp, &lv = *(dp=new (buf) ::aaa::GG2322121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322121E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2322121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2322121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2322121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322121E);
    dp->::aaa::GG2322121::~GG2322121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322121E(Test__ZN3aaa9GG2322121E, "_ZN3aaa9GG2322121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322121C1Ev();
extern void _ZN3aaa9GG2322121D1Ev();
Name_Map name_map__ZN3aaa9GG2322121E[] = {
  NSPAIR(_ZN3aaa9GG2322121C1Ev),
  NSPAIR(_ZN3aaa9GG2322121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2322121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322121E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23221213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221213fooEv,_ZThn8_N3aaa9GG23221213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23221213fooEv,_ZThn28_N3aaa9GG23221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23221213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221213fooEv,_ZThn8_N3aaa9GG23221213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23221213fooEv,_ZThn28_N3aaa9GG23221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322121E[];
Class_Descriptor cd__ZN3aaa9GG2322121E = {  "_ZN3aaa9GG2322121E", // class name
  bases__ZN3aaa9GG2322121E, 6,
  &(vtc__ZN3aaa9GG2322121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322122  : ::aaa::EE232 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23221223barEv
  ~GG2322122(); // tgen
  GG2322122(); // tgen
};
//SIG(1 _ZN3aaa9GG2322122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23221223barEv");}
aaa::GG2322122 ::~GG2322122(){ note_dtor("_ZN3aaa9GG2322122E", this);} // tgen
aaa::GG2322122 ::GG2322122(){ note_ctor("_ZN3aaa9GG2322122E", this);} // tgen
}
static void Test__ZN3aaa9GG2322122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322122E, buf);
    ::aaa::GG2322122 *dp, &lv = *(dp=new (buf) ::aaa::GG2322122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322122E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2322122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2322122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2322122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322122E);
    dp->::aaa::GG2322122::~GG2322122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322122E(Test__ZN3aaa9GG2322122E, "_ZN3aaa9GG2322122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322122C1Ev();
extern void _ZN3aaa9GG2322122D1Ev();
Name_Map name_map__ZN3aaa9GG2322122E[] = {
  NSPAIR(_ZN3aaa9GG2322122C1Ev),
  NSPAIR(_ZN3aaa9GG2322122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2322122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322122E[];
extern void _ZN3aaa9GG23221223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221223barEv,_ZThn8_N3aaa9GG23221223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23221223barEv,_ZThn20_N3aaa9GG23221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221223barEv,_ZThn8_N3aaa9GG23221223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221223barEv,_ZThn20_N3aaa9GG23221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322122E[];
Class_Descriptor cd__ZN3aaa9GG2322122E = {  "_ZN3aaa9GG2322122E", // class name
  bases__ZN3aaa9GG2322122E, 6,
  &(vtc__ZN3aaa9GG2322122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322123  : ::aaa::EE232 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23221233fooEv
  virtual void  bar(); // _ZN3aaa9GG23221233barEv
  ~GG2322123(); // tgen
  GG2322123(); // tgen
};
//SIG(1 _ZN3aaa9GG2322123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23221233fooEv");}
void  aaa::GG2322123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23221233barEv");}
aaa::GG2322123 ::~GG2322123(){ note_dtor("_ZN3aaa9GG2322123E", this);} // tgen
aaa::GG2322123 ::GG2322123(){ note_ctor("_ZN3aaa9GG2322123E", this);} // tgen
}
static void Test__ZN3aaa9GG2322123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322123E, buf);
    ::aaa::GG2322123 *dp, &lv = *(dp=new (buf) ::aaa::GG2322123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322123E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2322123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2322123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2322123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322123E);
    dp->::aaa::GG2322123::~GG2322123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322123E(Test__ZN3aaa9GG2322123E, "_ZN3aaa9GG2322123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322123C1Ev();
extern void _ZN3aaa9GG2322123D1Ev();
Name_Map name_map__ZN3aaa9GG2322123E[] = {
  NSPAIR(_ZN3aaa9GG2322123C1Ev),
  NSPAIR(_ZN3aaa9GG2322123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2322123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322123E[];
extern void _ZN3aaa9GG23221233barEv();
extern void _ZN3aaa9GG23221233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221233fooEv,_ZThn8_N3aaa9GG23221233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23221233barEv,_ZThn8_N3aaa9GG23221233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23221233barEv,_ZThn20_N3aaa9GG23221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23221233fooEv,_ZThn28_N3aaa9GG23221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23221233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23221233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221233fooEv,_ZThn8_N3aaa9GG23221233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221233barEv,_ZThn8_N3aaa9GG23221233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221233barEv,_ZThn20_N3aaa9GG23221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23221233fooEv,_ZThn28_N3aaa9GG23221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322123E[];
Class_Descriptor cd__ZN3aaa9GG2322123E = {  "_ZN3aaa9GG2322123E", // class name
  bases__ZN3aaa9GG2322123E, 6,
  &(vtc__ZN3aaa9GG2322123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322131  : ::aaa::EE232 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23221313fooEv
  ~GG2322131(); // tgen
  GG2322131(); // tgen
};
//SIG(1 _ZN3aaa9GG2322131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23221313fooEv");}
aaa::GG2322131 ::~GG2322131(){ note_dtor("_ZN3aaa9GG2322131E", this);} // tgen
aaa::GG2322131 ::GG2322131(){ note_ctor("_ZN3aaa9GG2322131E", this);} // tgen
}
static void Test__ZN3aaa9GG2322131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322131E, buf);
    ::aaa::GG2322131 *dp, &lv = *(dp=new (buf) ::aaa::GG2322131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322131E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2322131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2322131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2322131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322131E);
    dp->::aaa::GG2322131::~GG2322131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322131E(Test__ZN3aaa9GG2322131E, "_ZN3aaa9GG2322131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322131C1Ev();
extern void _ZN3aaa9GG2322131D1Ev();
Name_Map name_map__ZN3aaa9GG2322131E[] = {
  NSPAIR(_ZN3aaa9GG2322131C1Ev),
  NSPAIR(_ZN3aaa9GG2322131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2322131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322131E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23221313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221313fooEv,_ZThn8_N3aaa9GG23221313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23221313fooEv,_ZThn20_N3aaa9GG23221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23221313fooEv,_ZThn28_N3aaa9GG23221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23221313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221313fooEv,_ZThn8_N3aaa9GG23221313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221313fooEv,_ZThn20_N3aaa9GG23221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23221313fooEv,_ZThn28_N3aaa9GG23221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322131E[];
Class_Descriptor cd__ZN3aaa9GG2322131E = {  "_ZN3aaa9GG2322131E", // class name
  bases__ZN3aaa9GG2322131E, 6,
  &(vtc__ZN3aaa9GG2322131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322132  : ::aaa::EE232 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23221323barEv
  ~GG2322132(); // tgen
  GG2322132(); // tgen
};
//SIG(1 _ZN3aaa9GG2322132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23221323barEv");}
aaa::GG2322132 ::~GG2322132(){ note_dtor("_ZN3aaa9GG2322132E", this);} // tgen
aaa::GG2322132 ::GG2322132(){ note_ctor("_ZN3aaa9GG2322132E", this);} // tgen
}
static void Test__ZN3aaa9GG2322132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322132E, buf);
    ::aaa::GG2322132 *dp, &lv = *(dp=new (buf) ::aaa::GG2322132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322132E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2322132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2322132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2322132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322132E);
    dp->::aaa::GG2322132::~GG2322132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322132E(Test__ZN3aaa9GG2322132E, "_ZN3aaa9GG2322132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322132C1Ev();
extern void _ZN3aaa9GG2322132D1Ev();
Name_Map name_map__ZN3aaa9GG2322132E[] = {
  NSPAIR(_ZN3aaa9GG2322132C1Ev),
  NSPAIR(_ZN3aaa9GG2322132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2322132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322132E[];
extern void _ZN3aaa9GG23221323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221323barEv,_ZThn8_N3aaa9GG23221323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23221323barEv,_ZThn20_N3aaa9GG23221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221323barEv,_ZThn8_N3aaa9GG23221323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221323barEv,_ZThn20_N3aaa9GG23221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322132E[];
Class_Descriptor cd__ZN3aaa9GG2322132E = {  "_ZN3aaa9GG2322132E", // class name
  bases__ZN3aaa9GG2322132E, 6,
  &(vtc__ZN3aaa9GG2322132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322133  : ::aaa::EE232 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23221333fooEv
  virtual void  bar(); // _ZN3aaa9GG23221333barEv
  ~GG2322133(); // tgen
  GG2322133(); // tgen
};
//SIG(1 _ZN3aaa9GG2322133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23221333fooEv");}
void  aaa::GG2322133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23221333barEv");}
aaa::GG2322133 ::~GG2322133(){ note_dtor("_ZN3aaa9GG2322133E", this);} // tgen
aaa::GG2322133 ::GG2322133(){ note_ctor("_ZN3aaa9GG2322133E", this);} // tgen
}
static void Test__ZN3aaa9GG2322133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322133E, buf);
    ::aaa::GG2322133 *dp, &lv = *(dp=new (buf) ::aaa::GG2322133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322133E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2322133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2322133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2322133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322133E);
    dp->::aaa::GG2322133::~GG2322133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322133E(Test__ZN3aaa9GG2322133E, "_ZN3aaa9GG2322133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322133C1Ev();
extern void _ZN3aaa9GG2322133D1Ev();
Name_Map name_map__ZN3aaa9GG2322133E[] = {
  NSPAIR(_ZN3aaa9GG2322133C1Ev),
  NSPAIR(_ZN3aaa9GG2322133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2322133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322133E[];
extern void _ZN3aaa9GG23221333barEv();
extern void _ZN3aaa9GG23221333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23221333fooEv,_ZThn8_N3aaa9GG23221333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23221333barEv,_ZThn8_N3aaa9GG23221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23221333barEv,_ZThn20_N3aaa9GG23221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23221333fooEv,_ZThn20_N3aaa9GG23221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23221333fooEv,_ZThn28_N3aaa9GG23221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23221333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23221333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221333fooEv,_ZThn8_N3aaa9GG23221333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23221333barEv,_ZThn8_N3aaa9GG23221333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221333barEv,_ZThn20_N3aaa9GG23221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23221333fooEv,_ZThn20_N3aaa9GG23221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23221333fooEv,_ZThn28_N3aaa9GG23221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322133E[];
Class_Descriptor cd__ZN3aaa9GG2322133E = {  "_ZN3aaa9GG2322133E", // class name
  bases__ZN3aaa9GG2322133E, 6,
  &(vtc__ZN3aaa9GG2322133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322211  : ::aaa::EE232 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23222113fooEv
  ~GG2322211(); // tgen
  GG2322211(); // tgen
};
//SIG(1 _ZN3aaa9GG2322211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23222113fooEv");}
aaa::GG2322211 ::~GG2322211(){ note_dtor("_ZN3aaa9GG2322211E", this);} // tgen
aaa::GG2322211 ::GG2322211(){ note_ctor("_ZN3aaa9GG2322211E", this);} // tgen
}
static void Test__ZN3aaa9GG2322211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322211E, buf);
    ::aaa::GG2322211 *dp, &lv = *(dp=new (buf) ::aaa::GG2322211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322211E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2322211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2322211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2322211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322211E);
    dp->::aaa::GG2322211::~GG2322211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322211E(Test__ZN3aaa9GG2322211E, "_ZN3aaa9GG2322211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322211C1Ev();
extern void _ZN3aaa9GG2322211D1Ev();
Name_Map name_map__ZN3aaa9GG2322211E[] = {
  NSPAIR(_ZN3aaa9GG2322211C1Ev),
  NSPAIR(_ZN3aaa9GG2322211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2322211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322211E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23222113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222113fooEv,_ZThn8_N3aaa9GG23222113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23222113fooEv,_ZThn20_N3aaa9GG23222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23222113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222113fooEv,_ZThn8_N3aaa9GG23222113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222113fooEv,_ZThn20_N3aaa9GG23222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322211E[];
Class_Descriptor cd__ZN3aaa9GG2322211E = {  "_ZN3aaa9GG2322211E", // class name
  bases__ZN3aaa9GG2322211E, 6,
  &(vtc__ZN3aaa9GG2322211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322212  : ::aaa::EE232 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23222123barEv
  ~GG2322212(); // tgen
  GG2322212(); // tgen
};
//SIG(1 _ZN3aaa9GG2322212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23222123barEv");}
aaa::GG2322212 ::~GG2322212(){ note_dtor("_ZN3aaa9GG2322212E", this);} // tgen
aaa::GG2322212 ::GG2322212(){ note_ctor("_ZN3aaa9GG2322212E", this);} // tgen
}
static void Test__ZN3aaa9GG2322212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322212E, buf);
    ::aaa::GG2322212 *dp, &lv = *(dp=new (buf) ::aaa::GG2322212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322212E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2322212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2322212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2322212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322212E);
    dp->::aaa::GG2322212::~GG2322212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322212E(Test__ZN3aaa9GG2322212E, "_ZN3aaa9GG2322212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322212C1Ev();
extern void _ZN3aaa9GG2322212D1Ev();
Name_Map name_map__ZN3aaa9GG2322212E[] = {
  NSPAIR(_ZN3aaa9GG2322212C1Ev),
  NSPAIR(_ZN3aaa9GG2322212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2322212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322212E[];
extern void _ZN3aaa9GG23222123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222123barEv,_ZThn8_N3aaa9GG23222123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23222123barEv,_ZThn20_N3aaa9GG23222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23222123barEv,_ZThn28_N3aaa9GG23222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222123barEv,_ZThn8_N3aaa9GG23222123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222123barEv,_ZThn20_N3aaa9GG23222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23222123barEv,_ZThn28_N3aaa9GG23222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322212E[];
Class_Descriptor cd__ZN3aaa9GG2322212E = {  "_ZN3aaa9GG2322212E", // class name
  bases__ZN3aaa9GG2322212E, 6,
  &(vtc__ZN3aaa9GG2322212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322213  : ::aaa::EE232 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23222133fooEv
  virtual void  bar(); // _ZN3aaa9GG23222133barEv
  ~GG2322213(); // tgen
  GG2322213(); // tgen
};
//SIG(1 _ZN3aaa9GG2322213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23222133fooEv");}
void  aaa::GG2322213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23222133barEv");}
aaa::GG2322213 ::~GG2322213(){ note_dtor("_ZN3aaa9GG2322213E", this);} // tgen
aaa::GG2322213 ::GG2322213(){ note_ctor("_ZN3aaa9GG2322213E", this);} // tgen
}
static void Test__ZN3aaa9GG2322213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322213E, buf);
    ::aaa::GG2322213 *dp, &lv = *(dp=new (buf) ::aaa::GG2322213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322213E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2322213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2322213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2322213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322213E);
    dp->::aaa::GG2322213::~GG2322213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322213E(Test__ZN3aaa9GG2322213E, "_ZN3aaa9GG2322213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322213C1Ev();
extern void _ZN3aaa9GG2322213D1Ev();
Name_Map name_map__ZN3aaa9GG2322213E[] = {
  NSPAIR(_ZN3aaa9GG2322213C1Ev),
  NSPAIR(_ZN3aaa9GG2322213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2322213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322213E[];
extern void _ZN3aaa9GG23222133barEv();
extern void _ZN3aaa9GG23222133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222133fooEv,_ZThn8_N3aaa9GG23222133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23222133barEv,_ZThn8_N3aaa9GG23222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23222133barEv,_ZThn20_N3aaa9GG23222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23222133fooEv,_ZThn20_N3aaa9GG23222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23222133barEv,_ZThn28_N3aaa9GG23222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23222133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23222133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222133fooEv,_ZThn8_N3aaa9GG23222133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222133barEv,_ZThn8_N3aaa9GG23222133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222133barEv,_ZThn20_N3aaa9GG23222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222133fooEv,_ZThn20_N3aaa9GG23222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23222133barEv,_ZThn28_N3aaa9GG23222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322213E[];
Class_Descriptor cd__ZN3aaa9GG2322213E = {  "_ZN3aaa9GG2322213E", // class name
  bases__ZN3aaa9GG2322213E, 6,
  &(vtc__ZN3aaa9GG2322213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322221  : ::aaa::EE232 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23222213fooEv
  ~GG2322221(); // tgen
  GG2322221(); // tgen
};
//SIG(1 _ZN3aaa9GG2322221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23222213fooEv");}
aaa::GG2322221 ::~GG2322221(){ note_dtor("_ZN3aaa9GG2322221E", this);} // tgen
aaa::GG2322221 ::GG2322221(){ note_ctor("_ZN3aaa9GG2322221E", this);} // tgen
}
static void Test__ZN3aaa9GG2322221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322221E, buf);
    ::aaa::GG2322221 *dp, &lv = *(dp=new (buf) ::aaa::GG2322221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322221E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2322221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2322221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2322221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322221E);
    dp->::aaa::GG2322221::~GG2322221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322221E(Test__ZN3aaa9GG2322221E, "_ZN3aaa9GG2322221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322221C1Ev();
extern void _ZN3aaa9GG2322221D1Ev();
Name_Map name_map__ZN3aaa9GG2322221E[] = {
  NSPAIR(_ZN3aaa9GG2322221C1Ev),
  NSPAIR(_ZN3aaa9GG2322221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2322221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322221E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23222213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222213fooEv,_ZThn8_N3aaa9GG23222213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23222213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222213fooEv,_ZThn8_N3aaa9GG23222213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322221E[];
Class_Descriptor cd__ZN3aaa9GG2322221E = {  "_ZN3aaa9GG2322221E", // class name
  bases__ZN3aaa9GG2322221E, 6,
  &(vtc__ZN3aaa9GG2322221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322222  : ::aaa::EE232 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23222223barEv
  ~GG2322222(); // tgen
  GG2322222(); // tgen
};
//SIG(1 _ZN3aaa9GG2322222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23222223barEv");}
aaa::GG2322222 ::~GG2322222(){ note_dtor("_ZN3aaa9GG2322222E", this);} // tgen
aaa::GG2322222 ::GG2322222(){ note_ctor("_ZN3aaa9GG2322222E", this);} // tgen
}
static void Test__ZN3aaa9GG2322222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322222E, buf);
    ::aaa::GG2322222 *dp, &lv = *(dp=new (buf) ::aaa::GG2322222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322222E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2322222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2322222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2322222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322222E);
    dp->::aaa::GG2322222::~GG2322222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322222E(Test__ZN3aaa9GG2322222E, "_ZN3aaa9GG2322222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322222C1Ev();
extern void _ZN3aaa9GG2322222D1Ev();
Name_Map name_map__ZN3aaa9GG2322222E[] = {
  NSPAIR(_ZN3aaa9GG2322222C1Ev),
  NSPAIR(_ZN3aaa9GG2322222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2322222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322222E[];
extern void _ZN3aaa9GG23222223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222223barEv,_ZThn8_N3aaa9GG23222223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23222223barEv,_ZThn20_N3aaa9GG23222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23222223barEv,_ZThn28_N3aaa9GG23222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222223barEv,_ZThn8_N3aaa9GG23222223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222223barEv,_ZThn20_N3aaa9GG23222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23222223barEv,_ZThn28_N3aaa9GG23222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322222E[];
Class_Descriptor cd__ZN3aaa9GG2322222E = {  "_ZN3aaa9GG2322222E", // class name
  bases__ZN3aaa9GG2322222E, 6,
  &(vtc__ZN3aaa9GG2322222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322223  : ::aaa::EE232 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23222233fooEv
  virtual void  bar(); // _ZN3aaa9GG23222233barEv
  ~GG2322223(); // tgen
  GG2322223(); // tgen
};
//SIG(1 _ZN3aaa9GG2322223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23222233fooEv");}
void  aaa::GG2322223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23222233barEv");}
aaa::GG2322223 ::~GG2322223(){ note_dtor("_ZN3aaa9GG2322223E", this);} // tgen
aaa::GG2322223 ::GG2322223(){ note_ctor("_ZN3aaa9GG2322223E", this);} // tgen
}
static void Test__ZN3aaa9GG2322223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322223E, buf);
    ::aaa::GG2322223 *dp, &lv = *(dp=new (buf) ::aaa::GG2322223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322223E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2322223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2322223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2322223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322223E);
    dp->::aaa::GG2322223::~GG2322223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322223E(Test__ZN3aaa9GG2322223E, "_ZN3aaa9GG2322223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322223C1Ev();
extern void _ZN3aaa9GG2322223D1Ev();
Name_Map name_map__ZN3aaa9GG2322223E[] = {
  NSPAIR(_ZN3aaa9GG2322223C1Ev),
  NSPAIR(_ZN3aaa9GG2322223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2322223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322223E[];
extern void _ZN3aaa9GG23222233barEv();
extern void _ZN3aaa9GG23222233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222233fooEv,_ZThn8_N3aaa9GG23222233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23222233barEv,_ZThn8_N3aaa9GG23222233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23222233barEv,_ZThn20_N3aaa9GG23222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23222233barEv,_ZThn28_N3aaa9GG23222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23222233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23222233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222233fooEv,_ZThn8_N3aaa9GG23222233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222233barEv,_ZThn8_N3aaa9GG23222233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222233barEv,_ZThn20_N3aaa9GG23222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23222233barEv,_ZThn28_N3aaa9GG23222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322223E[];
Class_Descriptor cd__ZN3aaa9GG2322223E = {  "_ZN3aaa9GG2322223E", // class name
  bases__ZN3aaa9GG2322223E, 6,
  &(vtc__ZN3aaa9GG2322223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322231  : ::aaa::EE232 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23222313fooEv
  ~GG2322231(); // tgen
  GG2322231(); // tgen
};
//SIG(1 _ZN3aaa9GG2322231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23222313fooEv");}
aaa::GG2322231 ::~GG2322231(){ note_dtor("_ZN3aaa9GG2322231E", this);} // tgen
aaa::GG2322231 ::GG2322231(){ note_ctor("_ZN3aaa9GG2322231E", this);} // tgen
}
static void Test__ZN3aaa9GG2322231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322231E, buf);
    ::aaa::GG2322231 *dp, &lv = *(dp=new (buf) ::aaa::GG2322231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322231E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2322231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2322231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2322231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322231E);
    dp->::aaa::GG2322231::~GG2322231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322231E(Test__ZN3aaa9GG2322231E, "_ZN3aaa9GG2322231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322231C1Ev();
extern void _ZN3aaa9GG2322231D1Ev();
Name_Map name_map__ZN3aaa9GG2322231E[] = {
  NSPAIR(_ZN3aaa9GG2322231C1Ev),
  NSPAIR(_ZN3aaa9GG2322231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2322231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322231E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23222313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222313fooEv,_ZThn8_N3aaa9GG23222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23222313fooEv,_ZThn20_N3aaa9GG23222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23222313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222313fooEv,_ZThn8_N3aaa9GG23222313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222313fooEv,_ZThn20_N3aaa9GG23222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322231E[];
Class_Descriptor cd__ZN3aaa9GG2322231E = {  "_ZN3aaa9GG2322231E", // class name
  bases__ZN3aaa9GG2322231E, 6,
  &(vtc__ZN3aaa9GG2322231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322232  : ::aaa::EE232 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23222323barEv
  ~GG2322232(); // tgen
  GG2322232(); // tgen
};
//SIG(1 _ZN3aaa9GG2322232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23222323barEv");}
aaa::GG2322232 ::~GG2322232(){ note_dtor("_ZN3aaa9GG2322232E", this);} // tgen
aaa::GG2322232 ::GG2322232(){ note_ctor("_ZN3aaa9GG2322232E", this);} // tgen
}
static void Test__ZN3aaa9GG2322232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322232E, buf);
    ::aaa::GG2322232 *dp, &lv = *(dp=new (buf) ::aaa::GG2322232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322232E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2322232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2322232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2322232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322232E);
    dp->::aaa::GG2322232::~GG2322232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322232E(Test__ZN3aaa9GG2322232E, "_ZN3aaa9GG2322232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322232C1Ev();
extern void _ZN3aaa9GG2322232D1Ev();
Name_Map name_map__ZN3aaa9GG2322232E[] = {
  NSPAIR(_ZN3aaa9GG2322232C1Ev),
  NSPAIR(_ZN3aaa9GG2322232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2322232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322232E[];
extern void _ZN3aaa9GG23222323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222323barEv,_ZThn8_N3aaa9GG23222323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23222323barEv,_ZThn20_N3aaa9GG23222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23222323barEv,_ZThn28_N3aaa9GG23222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222323barEv,_ZThn8_N3aaa9GG23222323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222323barEv,_ZThn20_N3aaa9GG23222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23222323barEv,_ZThn28_N3aaa9GG23222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322232E[];
Class_Descriptor cd__ZN3aaa9GG2322232E = {  "_ZN3aaa9GG2322232E", // class name
  bases__ZN3aaa9GG2322232E, 6,
  &(vtc__ZN3aaa9GG2322232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322233  : ::aaa::EE232 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23222333fooEv
  virtual void  bar(); // _ZN3aaa9GG23222333barEv
  ~GG2322233(); // tgen
  GG2322233(); // tgen
};
//SIG(1 _ZN3aaa9GG2322233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23222333fooEv");}
void  aaa::GG2322233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23222333barEv");}
aaa::GG2322233 ::~GG2322233(){ note_dtor("_ZN3aaa9GG2322233E", this);} // tgen
aaa::GG2322233 ::GG2322233(){ note_ctor("_ZN3aaa9GG2322233E", this);} // tgen
}
static void Test__ZN3aaa9GG2322233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322233E, buf);
    ::aaa::GG2322233 *dp, &lv = *(dp=new (buf) ::aaa::GG2322233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322233E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2322233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2322233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2322233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322233E);
    dp->::aaa::GG2322233::~GG2322233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322233E(Test__ZN3aaa9GG2322233E, "_ZN3aaa9GG2322233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322233C1Ev();
extern void _ZN3aaa9GG2322233D1Ev();
Name_Map name_map__ZN3aaa9GG2322233E[] = {
  NSPAIR(_ZN3aaa9GG2322233C1Ev),
  NSPAIR(_ZN3aaa9GG2322233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2322233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322233E[];
extern void _ZN3aaa9GG23222333barEv();
extern void _ZN3aaa9GG23222333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23222333fooEv,_ZThn8_N3aaa9GG23222333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23222333barEv,_ZThn8_N3aaa9GG23222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23222333barEv,_ZThn20_N3aaa9GG23222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23222333fooEv,_ZThn20_N3aaa9GG23222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23222333barEv,_ZThn28_N3aaa9GG23222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23222333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23222333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222333fooEv,_ZThn8_N3aaa9GG23222333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23222333barEv,_ZThn8_N3aaa9GG23222333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222333barEv,_ZThn20_N3aaa9GG23222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23222333fooEv,_ZThn20_N3aaa9GG23222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23222333barEv,_ZThn28_N3aaa9GG23222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322233E[];
Class_Descriptor cd__ZN3aaa9GG2322233E = {  "_ZN3aaa9GG2322233E", // class name
  bases__ZN3aaa9GG2322233E, 6,
  &(vtc__ZN3aaa9GG2322233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322311  : ::aaa::EE232 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23223113fooEv
  ~GG2322311(); // tgen
  GG2322311(); // tgen
};
//SIG(1 _ZN3aaa9GG2322311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23223113fooEv");}
aaa::GG2322311 ::~GG2322311(){ note_dtor("_ZN3aaa9GG2322311E", this);} // tgen
aaa::GG2322311 ::GG2322311(){ note_ctor("_ZN3aaa9GG2322311E", this);} // tgen
}
static void Test__ZN3aaa9GG2322311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322311E, buf);
    ::aaa::GG2322311 *dp, &lv = *(dp=new (buf) ::aaa::GG2322311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322311E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2322311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2322311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2322311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322311E);
    dp->::aaa::GG2322311::~GG2322311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322311E(Test__ZN3aaa9GG2322311E, "_ZN3aaa9GG2322311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322311C1Ev();
extern void _ZN3aaa9GG2322311D1Ev();
Name_Map name_map__ZN3aaa9GG2322311E[] = {
  NSPAIR(_ZN3aaa9GG2322311C1Ev),
  NSPAIR(_ZN3aaa9GG2322311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2322311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322311E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23223113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223113fooEv,_ZThn8_N3aaa9GG23223113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23223113fooEv,_ZThn20_N3aaa9GG23223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223113fooEv,_ZThn28_N3aaa9GG23223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23223113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223113fooEv,_ZThn8_N3aaa9GG23223113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223113fooEv,_ZThn20_N3aaa9GG23223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223113fooEv,_ZThn28_N3aaa9GG23223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322311E[];
Class_Descriptor cd__ZN3aaa9GG2322311E = {  "_ZN3aaa9GG2322311E", // class name
  bases__ZN3aaa9GG2322311E, 6,
  &(vtc__ZN3aaa9GG2322311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322312  : ::aaa::EE232 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23223123barEv
  ~GG2322312(); // tgen
  GG2322312(); // tgen
};
//SIG(1 _ZN3aaa9GG2322312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23223123barEv");}
aaa::GG2322312 ::~GG2322312(){ note_dtor("_ZN3aaa9GG2322312E", this);} // tgen
aaa::GG2322312 ::GG2322312(){ note_ctor("_ZN3aaa9GG2322312E", this);} // tgen
}
static void Test__ZN3aaa9GG2322312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322312E, buf);
    ::aaa::GG2322312 *dp, &lv = *(dp=new (buf) ::aaa::GG2322312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322312E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2322312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2322312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2322312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322312E);
    dp->::aaa::GG2322312::~GG2322312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322312E(Test__ZN3aaa9GG2322312E, "_ZN3aaa9GG2322312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322312C1Ev();
extern void _ZN3aaa9GG2322312D1Ev();
Name_Map name_map__ZN3aaa9GG2322312E[] = {
  NSPAIR(_ZN3aaa9GG2322312C1Ev),
  NSPAIR(_ZN3aaa9GG2322312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2322312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322312E[];
extern void _ZN3aaa9GG23223123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223123barEv,_ZThn8_N3aaa9GG23223123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23223123barEv,_ZThn20_N3aaa9GG23223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223123barEv,_ZThn28_N3aaa9GG23223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223123barEv,_ZThn8_N3aaa9GG23223123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223123barEv,_ZThn20_N3aaa9GG23223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223123barEv,_ZThn28_N3aaa9GG23223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322312E[];
Class_Descriptor cd__ZN3aaa9GG2322312E = {  "_ZN3aaa9GG2322312E", // class name
  bases__ZN3aaa9GG2322312E, 6,
  &(vtc__ZN3aaa9GG2322312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322313  : ::aaa::EE232 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23223133fooEv
  virtual void  bar(); // _ZN3aaa9GG23223133barEv
  ~GG2322313(); // tgen
  GG2322313(); // tgen
};
//SIG(1 _ZN3aaa9GG2322313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23223133fooEv");}
void  aaa::GG2322313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23223133barEv");}
aaa::GG2322313 ::~GG2322313(){ note_dtor("_ZN3aaa9GG2322313E", this);} // tgen
aaa::GG2322313 ::GG2322313(){ note_ctor("_ZN3aaa9GG2322313E", this);} // tgen
}
static void Test__ZN3aaa9GG2322313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322313E, buf);
    ::aaa::GG2322313 *dp, &lv = *(dp=new (buf) ::aaa::GG2322313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322313E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2322313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2322313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2322313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322313E);
    dp->::aaa::GG2322313::~GG2322313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322313E(Test__ZN3aaa9GG2322313E, "_ZN3aaa9GG2322313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322313C1Ev();
extern void _ZN3aaa9GG2322313D1Ev();
Name_Map name_map__ZN3aaa9GG2322313E[] = {
  NSPAIR(_ZN3aaa9GG2322313C1Ev),
  NSPAIR(_ZN3aaa9GG2322313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2322313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322313E[];
extern void _ZN3aaa9GG23223133barEv();
extern void _ZN3aaa9GG23223133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223133fooEv,_ZThn8_N3aaa9GG23223133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23223133barEv,_ZThn8_N3aaa9GG23223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23223133barEv,_ZThn20_N3aaa9GG23223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23223133fooEv,_ZThn20_N3aaa9GG23223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223133fooEv,_ZThn28_N3aaa9GG23223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223133barEv,_ZThn28_N3aaa9GG23223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23223133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23223133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223133fooEv,_ZThn8_N3aaa9GG23223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223133barEv,_ZThn8_N3aaa9GG23223133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223133barEv,_ZThn20_N3aaa9GG23223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223133fooEv,_ZThn20_N3aaa9GG23223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223133fooEv,_ZThn28_N3aaa9GG23223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223133barEv,_ZThn28_N3aaa9GG23223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322313E[];
Class_Descriptor cd__ZN3aaa9GG2322313E = {  "_ZN3aaa9GG2322313E", // class name
  bases__ZN3aaa9GG2322313E, 6,
  &(vtc__ZN3aaa9GG2322313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322321  : ::aaa::EE232 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23223213fooEv
  ~GG2322321(); // tgen
  GG2322321(); // tgen
};
//SIG(1 _ZN3aaa9GG2322321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23223213fooEv");}
aaa::GG2322321 ::~GG2322321(){ note_dtor("_ZN3aaa9GG2322321E", this);} // tgen
aaa::GG2322321 ::GG2322321(){ note_ctor("_ZN3aaa9GG2322321E", this);} // tgen
}
static void Test__ZN3aaa9GG2322321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322321E, buf);
    ::aaa::GG2322321 *dp, &lv = *(dp=new (buf) ::aaa::GG2322321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322321E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2322321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2322321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2322321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322321E);
    dp->::aaa::GG2322321::~GG2322321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322321E(Test__ZN3aaa9GG2322321E, "_ZN3aaa9GG2322321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322321C1Ev();
extern void _ZN3aaa9GG2322321D1Ev();
Name_Map name_map__ZN3aaa9GG2322321E[] = {
  NSPAIR(_ZN3aaa9GG2322321C1Ev),
  NSPAIR(_ZN3aaa9GG2322321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2322321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322321E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23223213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223213fooEv,_ZThn8_N3aaa9GG23223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23223213fooEv,_ZThn28_N3aaa9GG23223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23223213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223213fooEv,_ZThn8_N3aaa9GG23223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223213fooEv,_ZThn28_N3aaa9GG23223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322321E[];
Class_Descriptor cd__ZN3aaa9GG2322321E = {  "_ZN3aaa9GG2322321E", // class name
  bases__ZN3aaa9GG2322321E, 6,
  &(vtc__ZN3aaa9GG2322321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322322  : ::aaa::EE232 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23223223barEv
  ~GG2322322(); // tgen
  GG2322322(); // tgen
};
//SIG(1 _ZN3aaa9GG2322322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23223223barEv");}
aaa::GG2322322 ::~GG2322322(){ note_dtor("_ZN3aaa9GG2322322E", this);} // tgen
aaa::GG2322322 ::GG2322322(){ note_ctor("_ZN3aaa9GG2322322E", this);} // tgen
}
static void Test__ZN3aaa9GG2322322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322322E, buf);
    ::aaa::GG2322322 *dp, &lv = *(dp=new (buf) ::aaa::GG2322322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322322E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2322322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2322322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2322322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322322E);
    dp->::aaa::GG2322322::~GG2322322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322322E(Test__ZN3aaa9GG2322322E, "_ZN3aaa9GG2322322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322322C1Ev();
extern void _ZN3aaa9GG2322322D1Ev();
Name_Map name_map__ZN3aaa9GG2322322E[] = {
  NSPAIR(_ZN3aaa9GG2322322C1Ev),
  NSPAIR(_ZN3aaa9GG2322322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2322322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322322E[];
extern void _ZN3aaa9GG23223223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223223barEv,_ZThn8_N3aaa9GG23223223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23223223barEv,_ZThn20_N3aaa9GG23223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23223223barEv,_ZThn28_N3aaa9GG23223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223223barEv,_ZThn8_N3aaa9GG23223223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223223barEv,_ZThn20_N3aaa9GG23223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223223barEv,_ZThn28_N3aaa9GG23223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322322E[];
Class_Descriptor cd__ZN3aaa9GG2322322E = {  "_ZN3aaa9GG2322322E", // class name
  bases__ZN3aaa9GG2322322E, 6,
  &(vtc__ZN3aaa9GG2322322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322323  : ::aaa::EE232 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23223233fooEv
  virtual void  bar(); // _ZN3aaa9GG23223233barEv
  ~GG2322323(); // tgen
  GG2322323(); // tgen
};
//SIG(1 _ZN3aaa9GG2322323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23223233fooEv");}
void  aaa::GG2322323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23223233barEv");}
aaa::GG2322323 ::~GG2322323(){ note_dtor("_ZN3aaa9GG2322323E", this);} // tgen
aaa::GG2322323 ::GG2322323(){ note_ctor("_ZN3aaa9GG2322323E", this);} // tgen
}
static void Test__ZN3aaa9GG2322323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322323E, buf);
    ::aaa::GG2322323 *dp, &lv = *(dp=new (buf) ::aaa::GG2322323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322323E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2322323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2322323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2322323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322323E);
    dp->::aaa::GG2322323::~GG2322323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322323E(Test__ZN3aaa9GG2322323E, "_ZN3aaa9GG2322323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322323C1Ev();
extern void _ZN3aaa9GG2322323D1Ev();
Name_Map name_map__ZN3aaa9GG2322323E[] = {
  NSPAIR(_ZN3aaa9GG2322323C1Ev),
  NSPAIR(_ZN3aaa9GG2322323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2322323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322323E[];
extern void _ZN3aaa9GG23223233barEv();
extern void _ZN3aaa9GG23223233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223233fooEv,_ZThn8_N3aaa9GG23223233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23223233barEv,_ZThn8_N3aaa9GG23223233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23223233barEv,_ZThn20_N3aaa9GG23223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223233fooEv,_ZThn28_N3aaa9GG23223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223233barEv,_ZThn28_N3aaa9GG23223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23223233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23223233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223233fooEv,_ZThn8_N3aaa9GG23223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223233barEv,_ZThn8_N3aaa9GG23223233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223233barEv,_ZThn20_N3aaa9GG23223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223233fooEv,_ZThn28_N3aaa9GG23223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223233barEv,_ZThn28_N3aaa9GG23223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322323E[];
Class_Descriptor cd__ZN3aaa9GG2322323E = {  "_ZN3aaa9GG2322323E", // class name
  bases__ZN3aaa9GG2322323E, 6,
  &(vtc__ZN3aaa9GG2322323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322331  : ::aaa::EE232 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23223313fooEv
  ~GG2322331(); // tgen
  GG2322331(); // tgen
};
//SIG(1 _ZN3aaa9GG2322331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23223313fooEv");}
aaa::GG2322331 ::~GG2322331(){ note_dtor("_ZN3aaa9GG2322331E", this);} // tgen
aaa::GG2322331 ::GG2322331(){ note_ctor("_ZN3aaa9GG2322331E", this);} // tgen
}
static void Test__ZN3aaa9GG2322331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322331E, buf);
    ::aaa::GG2322331 *dp, &lv = *(dp=new (buf) ::aaa::GG2322331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322331E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2322331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2322331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2322331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322331E);
    dp->::aaa::GG2322331::~GG2322331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322331E(Test__ZN3aaa9GG2322331E, "_ZN3aaa9GG2322331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322331C1Ev();
extern void _ZN3aaa9GG2322331D1Ev();
Name_Map name_map__ZN3aaa9GG2322331E[] = {
  NSPAIR(_ZN3aaa9GG2322331C1Ev),
  NSPAIR(_ZN3aaa9GG2322331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2322331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322331E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23223313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223313fooEv,_ZThn8_N3aaa9GG23223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23223313fooEv,_ZThn20_N3aaa9GG23223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223313fooEv,_ZThn28_N3aaa9GG23223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23223313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223313fooEv,_ZThn8_N3aaa9GG23223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223313fooEv,_ZThn20_N3aaa9GG23223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223313fooEv,_ZThn28_N3aaa9GG23223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322331E[];
Class_Descriptor cd__ZN3aaa9GG2322331E = {  "_ZN3aaa9GG2322331E", // class name
  bases__ZN3aaa9GG2322331E, 6,
  &(vtc__ZN3aaa9GG2322331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322332  : ::aaa::EE232 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23223323barEv
  ~GG2322332(); // tgen
  GG2322332(); // tgen
};
//SIG(1 _ZN3aaa9GG2322332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2322332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23223323barEv");}
aaa::GG2322332 ::~GG2322332(){ note_dtor("_ZN3aaa9GG2322332E", this);} // tgen
aaa::GG2322332 ::GG2322332(){ note_ctor("_ZN3aaa9GG2322332E", this);} // tgen
}
static void Test__ZN3aaa9GG2322332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322332E, buf);
    ::aaa::GG2322332 *dp, &lv = *(dp=new (buf) ::aaa::GG2322332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322332E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2322332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2322332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2322332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322332E);
    dp->::aaa::GG2322332::~GG2322332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322332E(Test__ZN3aaa9GG2322332E, "_ZN3aaa9GG2322332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322332C1Ev();
extern void _ZN3aaa9GG2322332D1Ev();
Name_Map name_map__ZN3aaa9GG2322332E[] = {
  NSPAIR(_ZN3aaa9GG2322332C1Ev),
  NSPAIR(_ZN3aaa9GG2322332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2322332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322332E[];
extern void _ZN3aaa9GG23223323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223323barEv,_ZThn8_N3aaa9GG23223323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23223323barEv,_ZThn20_N3aaa9GG23223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223323barEv,_ZThn28_N3aaa9GG23223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223323barEv,_ZThn8_N3aaa9GG23223323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223323barEv,_ZThn20_N3aaa9GG23223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223323barEv,_ZThn28_N3aaa9GG23223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322332E[];
Class_Descriptor cd__ZN3aaa9GG2322332E = {  "_ZN3aaa9GG2322332E", // class name
  bases__ZN3aaa9GG2322332E, 6,
  &(vtc__ZN3aaa9GG2322332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2322333  : ::aaa::EE232 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23223333fooEv
  virtual void  bar(); // _ZN3aaa9GG23223333barEv
  ~GG2322333(); // tgen
  GG2322333(); // tgen
};
//SIG(1 _ZN3aaa9GG2322333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2322333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23223333fooEv");}
void  aaa::GG2322333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23223333barEv");}
aaa::GG2322333 ::~GG2322333(){ note_dtor("_ZN3aaa9GG2322333E", this);} // tgen
aaa::GG2322333 ::GG2322333(){ note_ctor("_ZN3aaa9GG2322333E", this);} // tgen
}
static void Test__ZN3aaa9GG2322333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2322333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2322333E, buf);
    ::aaa::GG2322333 *dp, &lv = *(dp=new (buf) ::aaa::GG2322333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2322333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2322333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2322333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2322333E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2322333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2322333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2322333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2322333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2322333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2322333E);
    dp->::aaa::GG2322333::~GG2322333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2322333E(Test__ZN3aaa9GG2322333E, "_ZN3aaa9GG2322333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2322333C1Ev();
extern void _ZN3aaa9GG2322333D1Ev();
Name_Map name_map__ZN3aaa9GG2322333E[] = {
  NSPAIR(_ZN3aaa9GG2322333C1Ev),
  NSPAIR(_ZN3aaa9GG2322333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2322333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2322333E[];
extern void _ZN3aaa9GG23223333barEv();
extern void _ZN3aaa9GG23223333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23223333fooEv,_ZThn8_N3aaa9GG23223333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23223333barEv,_ZThn8_N3aaa9GG23223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23223333barEv,_ZThn20_N3aaa9GG23223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23223333fooEv,_ZThn20_N3aaa9GG23223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223333fooEv,_ZThn28_N3aaa9GG23223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23223333barEv,_ZThn28_N3aaa9GG23223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2322333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23223333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23223333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223333fooEv,_ZThn8_N3aaa9GG23223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23223333barEv,_ZThn8_N3aaa9GG23223333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223333barEv,_ZThn20_N3aaa9GG23223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23223333fooEv,_ZThn20_N3aaa9GG23223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223333fooEv,_ZThn28_N3aaa9GG23223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23223333barEv,_ZThn28_N3aaa9GG23223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2322333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2322333E[];
Class_Descriptor cd__ZN3aaa9GG2322333E = {  "_ZN3aaa9GG2322333E", // class name
  bases__ZN3aaa9GG2322333E, 6,
  &(vtc__ZN3aaa9GG2322333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2322333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2322333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323111  : ::aaa::EE232 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23231113fooEv
  ~GG2323111(); // tgen
  GG2323111(); // tgen
};
//SIG(1 _ZN3aaa9GG2323111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23231113fooEv");}
aaa::GG2323111 ::~GG2323111(){ note_dtor("_ZN3aaa9GG2323111E", this);} // tgen
aaa::GG2323111 ::GG2323111(){ note_ctor("_ZN3aaa9GG2323111E", this);} // tgen
}
static void Test__ZN3aaa9GG2323111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323111E, buf);
    ::aaa::GG2323111 *dp, &lv = *(dp=new (buf) ::aaa::GG2323111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323111E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2323111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2323111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2323111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323111E);
    dp->::aaa::GG2323111::~GG2323111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323111E(Test__ZN3aaa9GG2323111E, "_ZN3aaa9GG2323111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323111C1Ev();
extern void _ZN3aaa9GG2323111D1Ev();
Name_Map name_map__ZN3aaa9GG2323111E[] = {
  NSPAIR(_ZN3aaa9GG2323111C1Ev),
  NSPAIR(_ZN3aaa9GG2323111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2323111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323111E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23231113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231113fooEv,_ZThn8_N3aaa9GG23231113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231113fooEv,_ZThn20_N3aaa9GG23231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23231113fooEv,_ZThn28_N3aaa9GG23231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23231113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231113fooEv,_ZThn8_N3aaa9GG23231113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231113fooEv,_ZThn20_N3aaa9GG23231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23231113fooEv,_ZThn28_N3aaa9GG23231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323111E[];
Class_Descriptor cd__ZN3aaa9GG2323111E = {  "_ZN3aaa9GG2323111E", // class name
  bases__ZN3aaa9GG2323111E, 6,
  &(vtc__ZN3aaa9GG2323111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323112  : ::aaa::EE232 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23231123barEv
  ~GG2323112(); // tgen
  GG2323112(); // tgen
};
//SIG(1 _ZN3aaa9GG2323112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23231123barEv");}
aaa::GG2323112 ::~GG2323112(){ note_dtor("_ZN3aaa9GG2323112E", this);} // tgen
aaa::GG2323112 ::GG2323112(){ note_ctor("_ZN3aaa9GG2323112E", this);} // tgen
}
static void Test__ZN3aaa9GG2323112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323112E, buf);
    ::aaa::GG2323112 *dp, &lv = *(dp=new (buf) ::aaa::GG2323112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323112E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2323112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2323112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2323112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323112E);
    dp->::aaa::GG2323112::~GG2323112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323112E(Test__ZN3aaa9GG2323112E, "_ZN3aaa9GG2323112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323112C1Ev();
extern void _ZN3aaa9GG2323112D1Ev();
Name_Map name_map__ZN3aaa9GG2323112E[] = {
  NSPAIR(_ZN3aaa9GG2323112C1Ev),
  NSPAIR(_ZN3aaa9GG2323112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2323112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323112E[];
extern void _ZN3aaa9GG23231123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231123barEv,_ZThn8_N3aaa9GG23231123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23231123barEv,_ZThn20_N3aaa9GG23231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231123barEv,_ZThn8_N3aaa9GG23231123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231123barEv,_ZThn20_N3aaa9GG23231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323112E[];
Class_Descriptor cd__ZN3aaa9GG2323112E = {  "_ZN3aaa9GG2323112E", // class name
  bases__ZN3aaa9GG2323112E, 6,
  &(vtc__ZN3aaa9GG2323112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323113  : ::aaa::EE232 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23231133fooEv
  virtual void  bar(); // _ZN3aaa9GG23231133barEv
  ~GG2323113(); // tgen
  GG2323113(); // tgen
};
//SIG(1 _ZN3aaa9GG2323113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23231133fooEv");}
void  aaa::GG2323113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23231133barEv");}
aaa::GG2323113 ::~GG2323113(){ note_dtor("_ZN3aaa9GG2323113E", this);} // tgen
aaa::GG2323113 ::GG2323113(){ note_ctor("_ZN3aaa9GG2323113E", this);} // tgen
}
static void Test__ZN3aaa9GG2323113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323113E, buf);
    ::aaa::GG2323113 *dp, &lv = *(dp=new (buf) ::aaa::GG2323113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323113E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2323113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2323113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2323113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323113E);
    dp->::aaa::GG2323113::~GG2323113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323113E(Test__ZN3aaa9GG2323113E, "_ZN3aaa9GG2323113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323113C1Ev();
extern void _ZN3aaa9GG2323113D1Ev();
Name_Map name_map__ZN3aaa9GG2323113E[] = {
  NSPAIR(_ZN3aaa9GG2323113C1Ev),
  NSPAIR(_ZN3aaa9GG2323113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2323113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323113E[];
extern void _ZN3aaa9GG23231133barEv();
extern void _ZN3aaa9GG23231133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231133fooEv,_ZThn8_N3aaa9GG23231133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23231133barEv,_ZThn8_N3aaa9GG23231133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231133fooEv,_ZThn20_N3aaa9GG23231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231133barEv,_ZThn20_N3aaa9GG23231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23231133fooEv,_ZThn28_N3aaa9GG23231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23231133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23231133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231133fooEv,_ZThn8_N3aaa9GG23231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231133barEv,_ZThn8_N3aaa9GG23231133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231133fooEv,_ZThn20_N3aaa9GG23231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231133barEv,_ZThn20_N3aaa9GG23231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23231133fooEv,_ZThn28_N3aaa9GG23231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323113E[];
Class_Descriptor cd__ZN3aaa9GG2323113E = {  "_ZN3aaa9GG2323113E", // class name
  bases__ZN3aaa9GG2323113E, 6,
  &(vtc__ZN3aaa9GG2323113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323121  : ::aaa::EE232 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23231213fooEv
  ~GG2323121(); // tgen
  GG2323121(); // tgen
};
//SIG(1 _ZN3aaa9GG2323121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23231213fooEv");}
aaa::GG2323121 ::~GG2323121(){ note_dtor("_ZN3aaa9GG2323121E", this);} // tgen
aaa::GG2323121 ::GG2323121(){ note_ctor("_ZN3aaa9GG2323121E", this);} // tgen
}
static void Test__ZN3aaa9GG2323121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323121E, buf);
    ::aaa::GG2323121 *dp, &lv = *(dp=new (buf) ::aaa::GG2323121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323121E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2323121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2323121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2323121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323121E);
    dp->::aaa::GG2323121::~GG2323121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323121E(Test__ZN3aaa9GG2323121E, "_ZN3aaa9GG2323121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323121C1Ev();
extern void _ZN3aaa9GG2323121D1Ev();
Name_Map name_map__ZN3aaa9GG2323121E[] = {
  NSPAIR(_ZN3aaa9GG2323121C1Ev),
  NSPAIR(_ZN3aaa9GG2323121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2323121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323121E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23231213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231213fooEv,_ZThn8_N3aaa9GG23231213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231213fooEv,_ZThn20_N3aaa9GG23231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23231213fooEv,_ZThn28_N3aaa9GG23231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23231213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231213fooEv,_ZThn8_N3aaa9GG23231213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231213fooEv,_ZThn20_N3aaa9GG23231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23231213fooEv,_ZThn28_N3aaa9GG23231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323121E[];
Class_Descriptor cd__ZN3aaa9GG2323121E = {  "_ZN3aaa9GG2323121E", // class name
  bases__ZN3aaa9GG2323121E, 6,
  &(vtc__ZN3aaa9GG2323121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323122  : ::aaa::EE232 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23231223barEv
  ~GG2323122(); // tgen
  GG2323122(); // tgen
};
//SIG(1 _ZN3aaa9GG2323122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23231223barEv");}
aaa::GG2323122 ::~GG2323122(){ note_dtor("_ZN3aaa9GG2323122E", this);} // tgen
aaa::GG2323122 ::GG2323122(){ note_ctor("_ZN3aaa9GG2323122E", this);} // tgen
}
static void Test__ZN3aaa9GG2323122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323122E, buf);
    ::aaa::GG2323122 *dp, &lv = *(dp=new (buf) ::aaa::GG2323122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323122E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2323122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2323122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2323122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323122E);
    dp->::aaa::GG2323122::~GG2323122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323122E(Test__ZN3aaa9GG2323122E, "_ZN3aaa9GG2323122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323122C1Ev();
extern void _ZN3aaa9GG2323122D1Ev();
Name_Map name_map__ZN3aaa9GG2323122E[] = {
  NSPAIR(_ZN3aaa9GG2323122C1Ev),
  NSPAIR(_ZN3aaa9GG2323122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2323122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323122E[];
extern void _ZN3aaa9GG23231223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231223barEv,_ZThn8_N3aaa9GG23231223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23231223barEv,_ZThn20_N3aaa9GG23231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231223barEv,_ZThn8_N3aaa9GG23231223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231223barEv,_ZThn20_N3aaa9GG23231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323122E[];
Class_Descriptor cd__ZN3aaa9GG2323122E = {  "_ZN3aaa9GG2323122E", // class name
  bases__ZN3aaa9GG2323122E, 6,
  &(vtc__ZN3aaa9GG2323122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323123  : ::aaa::EE232 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23231233fooEv
  virtual void  bar(); // _ZN3aaa9GG23231233barEv
  ~GG2323123(); // tgen
  GG2323123(); // tgen
};
//SIG(1 _ZN3aaa9GG2323123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23231233fooEv");}
void  aaa::GG2323123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23231233barEv");}
aaa::GG2323123 ::~GG2323123(){ note_dtor("_ZN3aaa9GG2323123E", this);} // tgen
aaa::GG2323123 ::GG2323123(){ note_ctor("_ZN3aaa9GG2323123E", this);} // tgen
}
static void Test__ZN3aaa9GG2323123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323123E, buf);
    ::aaa::GG2323123 *dp, &lv = *(dp=new (buf) ::aaa::GG2323123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323123E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2323123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2323123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2323123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323123E);
    dp->::aaa::GG2323123::~GG2323123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323123E(Test__ZN3aaa9GG2323123E, "_ZN3aaa9GG2323123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323123C1Ev();
extern void _ZN3aaa9GG2323123D1Ev();
Name_Map name_map__ZN3aaa9GG2323123E[] = {
  NSPAIR(_ZN3aaa9GG2323123C1Ev),
  NSPAIR(_ZN3aaa9GG2323123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2323123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323123E[];
extern void _ZN3aaa9GG23231233barEv();
extern void _ZN3aaa9GG23231233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231233fooEv,_ZThn8_N3aaa9GG23231233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23231233barEv,_ZThn8_N3aaa9GG23231233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231233fooEv,_ZThn20_N3aaa9GG23231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231233barEv,_ZThn20_N3aaa9GG23231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23231233fooEv,_ZThn28_N3aaa9GG23231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23231233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23231233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231233fooEv,_ZThn8_N3aaa9GG23231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231233barEv,_ZThn8_N3aaa9GG23231233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231233fooEv,_ZThn20_N3aaa9GG23231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231233barEv,_ZThn20_N3aaa9GG23231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23231233fooEv,_ZThn28_N3aaa9GG23231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323123E[];
Class_Descriptor cd__ZN3aaa9GG2323123E = {  "_ZN3aaa9GG2323123E", // class name
  bases__ZN3aaa9GG2323123E, 6,
  &(vtc__ZN3aaa9GG2323123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323131  : ::aaa::EE232 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23231313fooEv
  ~GG2323131(); // tgen
  GG2323131(); // tgen
};
//SIG(1 _ZN3aaa9GG2323131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23231313fooEv");}
aaa::GG2323131 ::~GG2323131(){ note_dtor("_ZN3aaa9GG2323131E", this);} // tgen
aaa::GG2323131 ::GG2323131(){ note_ctor("_ZN3aaa9GG2323131E", this);} // tgen
}
static void Test__ZN3aaa9GG2323131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323131E, buf);
    ::aaa::GG2323131 *dp, &lv = *(dp=new (buf) ::aaa::GG2323131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323131E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2323131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2323131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2323131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323131E);
    dp->::aaa::GG2323131::~GG2323131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323131E(Test__ZN3aaa9GG2323131E, "_ZN3aaa9GG2323131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323131C1Ev();
extern void _ZN3aaa9GG2323131D1Ev();
Name_Map name_map__ZN3aaa9GG2323131E[] = {
  NSPAIR(_ZN3aaa9GG2323131C1Ev),
  NSPAIR(_ZN3aaa9GG2323131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2323131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323131E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23231313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231313fooEv,_ZThn8_N3aaa9GG23231313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231313fooEv,_ZThn20_N3aaa9GG23231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23231313fooEv,_ZThn28_N3aaa9GG23231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23231313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231313fooEv,_ZThn8_N3aaa9GG23231313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231313fooEv,_ZThn20_N3aaa9GG23231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23231313fooEv,_ZThn28_N3aaa9GG23231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323131E[];
Class_Descriptor cd__ZN3aaa9GG2323131E = {  "_ZN3aaa9GG2323131E", // class name
  bases__ZN3aaa9GG2323131E, 6,
  &(vtc__ZN3aaa9GG2323131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323132  : ::aaa::EE232 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23231323barEv
  ~GG2323132(); // tgen
  GG2323132(); // tgen
};
//SIG(1 _ZN3aaa9GG2323132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23231323barEv");}
aaa::GG2323132 ::~GG2323132(){ note_dtor("_ZN3aaa9GG2323132E", this);} // tgen
aaa::GG2323132 ::GG2323132(){ note_ctor("_ZN3aaa9GG2323132E", this);} // tgen
}
static void Test__ZN3aaa9GG2323132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323132E, buf);
    ::aaa::GG2323132 *dp, &lv = *(dp=new (buf) ::aaa::GG2323132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323132E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2323132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2323132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2323132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323132E);
    dp->::aaa::GG2323132::~GG2323132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323132E(Test__ZN3aaa9GG2323132E, "_ZN3aaa9GG2323132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323132C1Ev();
extern void _ZN3aaa9GG2323132D1Ev();
Name_Map name_map__ZN3aaa9GG2323132E[] = {
  NSPAIR(_ZN3aaa9GG2323132C1Ev),
  NSPAIR(_ZN3aaa9GG2323132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2323132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323132E[];
extern void _ZN3aaa9GG23231323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231323barEv,_ZThn8_N3aaa9GG23231323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23231323barEv,_ZThn20_N3aaa9GG23231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231323barEv,_ZThn8_N3aaa9GG23231323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231323barEv,_ZThn20_N3aaa9GG23231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323132E[];
Class_Descriptor cd__ZN3aaa9GG2323132E = {  "_ZN3aaa9GG2323132E", // class name
  bases__ZN3aaa9GG2323132E, 6,
  &(vtc__ZN3aaa9GG2323132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323133  : ::aaa::EE232 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23231333fooEv
  virtual void  bar(); // _ZN3aaa9GG23231333barEv
  ~GG2323133(); // tgen
  GG2323133(); // tgen
};
//SIG(1 _ZN3aaa9GG2323133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23231333fooEv");}
void  aaa::GG2323133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23231333barEv");}
aaa::GG2323133 ::~GG2323133(){ note_dtor("_ZN3aaa9GG2323133E", this);} // tgen
aaa::GG2323133 ::GG2323133(){ note_ctor("_ZN3aaa9GG2323133E", this);} // tgen
}
static void Test__ZN3aaa9GG2323133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323133E, buf);
    ::aaa::GG2323133 *dp, &lv = *(dp=new (buf) ::aaa::GG2323133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323133E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2323133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2323133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2323133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323133E);
    dp->::aaa::GG2323133::~GG2323133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323133E(Test__ZN3aaa9GG2323133E, "_ZN3aaa9GG2323133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323133C1Ev();
extern void _ZN3aaa9GG2323133D1Ev();
Name_Map name_map__ZN3aaa9GG2323133E[] = {
  NSPAIR(_ZN3aaa9GG2323133C1Ev),
  NSPAIR(_ZN3aaa9GG2323133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2323133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323133E[];
extern void _ZN3aaa9GG23231333barEv();
extern void _ZN3aaa9GG23231333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23231333fooEv,_ZThn8_N3aaa9GG23231333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23231333barEv,_ZThn8_N3aaa9GG23231333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231333fooEv,_ZThn20_N3aaa9GG23231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23231333barEv,_ZThn20_N3aaa9GG23231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23231333fooEv,_ZThn28_N3aaa9GG23231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23231333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23231333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231333fooEv,_ZThn8_N3aaa9GG23231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23231333barEv,_ZThn8_N3aaa9GG23231333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231333fooEv,_ZThn20_N3aaa9GG23231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23231333barEv,_ZThn20_N3aaa9GG23231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23231333fooEv,_ZThn28_N3aaa9GG23231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323133E[];
Class_Descriptor cd__ZN3aaa9GG2323133E = {  "_ZN3aaa9GG2323133E", // class name
  bases__ZN3aaa9GG2323133E, 6,
  &(vtc__ZN3aaa9GG2323133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323211  : ::aaa::EE232 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23232113fooEv
  ~GG2323211(); // tgen
  GG2323211(); // tgen
};
//SIG(1 _ZN3aaa9GG2323211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23232113fooEv");}
aaa::GG2323211 ::~GG2323211(){ note_dtor("_ZN3aaa9GG2323211E", this);} // tgen
aaa::GG2323211 ::GG2323211(){ note_ctor("_ZN3aaa9GG2323211E", this);} // tgen
}
static void Test__ZN3aaa9GG2323211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323211E, buf);
    ::aaa::GG2323211 *dp, &lv = *(dp=new (buf) ::aaa::GG2323211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323211E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2323211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2323211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2323211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323211E);
    dp->::aaa::GG2323211::~GG2323211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323211E(Test__ZN3aaa9GG2323211E, "_ZN3aaa9GG2323211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323211C1Ev();
extern void _ZN3aaa9GG2323211D1Ev();
Name_Map name_map__ZN3aaa9GG2323211E[] = {
  NSPAIR(_ZN3aaa9GG2323211C1Ev),
  NSPAIR(_ZN3aaa9GG2323211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2323211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323211E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23232113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232113fooEv,_ZThn8_N3aaa9GG23232113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232113fooEv,_ZThn20_N3aaa9GG23232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23232113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232113fooEv,_ZThn8_N3aaa9GG23232113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232113fooEv,_ZThn20_N3aaa9GG23232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323211E[];
Class_Descriptor cd__ZN3aaa9GG2323211E = {  "_ZN3aaa9GG2323211E", // class name
  bases__ZN3aaa9GG2323211E, 6,
  &(vtc__ZN3aaa9GG2323211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323212  : ::aaa::EE232 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23232123barEv
  ~GG2323212(); // tgen
  GG2323212(); // tgen
};
//SIG(1 _ZN3aaa9GG2323212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23232123barEv");}
aaa::GG2323212 ::~GG2323212(){ note_dtor("_ZN3aaa9GG2323212E", this);} // tgen
aaa::GG2323212 ::GG2323212(){ note_ctor("_ZN3aaa9GG2323212E", this);} // tgen
}
static void Test__ZN3aaa9GG2323212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323212E, buf);
    ::aaa::GG2323212 *dp, &lv = *(dp=new (buf) ::aaa::GG2323212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323212E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2323212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2323212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2323212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323212E);
    dp->::aaa::GG2323212::~GG2323212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323212E(Test__ZN3aaa9GG2323212E, "_ZN3aaa9GG2323212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323212C1Ev();
extern void _ZN3aaa9GG2323212D1Ev();
Name_Map name_map__ZN3aaa9GG2323212E[] = {
  NSPAIR(_ZN3aaa9GG2323212C1Ev),
  NSPAIR(_ZN3aaa9GG2323212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2323212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323212E[];
extern void _ZN3aaa9GG23232123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232123barEv,_ZThn8_N3aaa9GG23232123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23232123barEv,_ZThn20_N3aaa9GG23232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23232123barEv,_ZThn28_N3aaa9GG23232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232123barEv,_ZThn8_N3aaa9GG23232123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232123barEv,_ZThn20_N3aaa9GG23232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23232123barEv,_ZThn28_N3aaa9GG23232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323212E[];
Class_Descriptor cd__ZN3aaa9GG2323212E = {  "_ZN3aaa9GG2323212E", // class name
  bases__ZN3aaa9GG2323212E, 6,
  &(vtc__ZN3aaa9GG2323212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323213  : ::aaa::EE232 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23232133fooEv
  virtual void  bar(); // _ZN3aaa9GG23232133barEv
  ~GG2323213(); // tgen
  GG2323213(); // tgen
};
//SIG(1 _ZN3aaa9GG2323213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23232133fooEv");}
void  aaa::GG2323213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23232133barEv");}
aaa::GG2323213 ::~GG2323213(){ note_dtor("_ZN3aaa9GG2323213E", this);} // tgen
aaa::GG2323213 ::GG2323213(){ note_ctor("_ZN3aaa9GG2323213E", this);} // tgen
}
static void Test__ZN3aaa9GG2323213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323213E, buf);
    ::aaa::GG2323213 *dp, &lv = *(dp=new (buf) ::aaa::GG2323213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323213E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2323213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2323213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2323213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323213E);
    dp->::aaa::GG2323213::~GG2323213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323213E(Test__ZN3aaa9GG2323213E, "_ZN3aaa9GG2323213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323213C1Ev();
extern void _ZN3aaa9GG2323213D1Ev();
Name_Map name_map__ZN3aaa9GG2323213E[] = {
  NSPAIR(_ZN3aaa9GG2323213C1Ev),
  NSPAIR(_ZN3aaa9GG2323213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2323213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323213E[];
extern void _ZN3aaa9GG23232133barEv();
extern void _ZN3aaa9GG23232133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232133fooEv,_ZThn8_N3aaa9GG23232133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23232133barEv,_ZThn8_N3aaa9GG23232133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232133fooEv,_ZThn20_N3aaa9GG23232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232133barEv,_ZThn20_N3aaa9GG23232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23232133barEv,_ZThn28_N3aaa9GG23232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23232133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23232133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232133fooEv,_ZThn8_N3aaa9GG23232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232133barEv,_ZThn8_N3aaa9GG23232133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232133fooEv,_ZThn20_N3aaa9GG23232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232133barEv,_ZThn20_N3aaa9GG23232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23232133barEv,_ZThn28_N3aaa9GG23232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323213E[];
Class_Descriptor cd__ZN3aaa9GG2323213E = {  "_ZN3aaa9GG2323213E", // class name
  bases__ZN3aaa9GG2323213E, 6,
  &(vtc__ZN3aaa9GG2323213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323221  : ::aaa::EE232 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23232213fooEv
  ~GG2323221(); // tgen
  GG2323221(); // tgen
};
//SIG(1 _ZN3aaa9GG2323221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23232213fooEv");}
aaa::GG2323221 ::~GG2323221(){ note_dtor("_ZN3aaa9GG2323221E", this);} // tgen
aaa::GG2323221 ::GG2323221(){ note_ctor("_ZN3aaa9GG2323221E", this);} // tgen
}
static void Test__ZN3aaa9GG2323221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323221E, buf);
    ::aaa::GG2323221 *dp, &lv = *(dp=new (buf) ::aaa::GG2323221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323221E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2323221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2323221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2323221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323221E);
    dp->::aaa::GG2323221::~GG2323221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323221E(Test__ZN3aaa9GG2323221E, "_ZN3aaa9GG2323221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323221C1Ev();
extern void _ZN3aaa9GG2323221D1Ev();
Name_Map name_map__ZN3aaa9GG2323221E[] = {
  NSPAIR(_ZN3aaa9GG2323221C1Ev),
  NSPAIR(_ZN3aaa9GG2323221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2323221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323221E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23232213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232213fooEv,_ZThn8_N3aaa9GG23232213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232213fooEv,_ZThn20_N3aaa9GG23232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23232213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232213fooEv,_ZThn8_N3aaa9GG23232213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232213fooEv,_ZThn20_N3aaa9GG23232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323221E[];
Class_Descriptor cd__ZN3aaa9GG2323221E = {  "_ZN3aaa9GG2323221E", // class name
  bases__ZN3aaa9GG2323221E, 6,
  &(vtc__ZN3aaa9GG2323221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323222  : ::aaa::EE232 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23232223barEv
  ~GG2323222(); // tgen
  GG2323222(); // tgen
};
//SIG(1 _ZN3aaa9GG2323222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23232223barEv");}
aaa::GG2323222 ::~GG2323222(){ note_dtor("_ZN3aaa9GG2323222E", this);} // tgen
aaa::GG2323222 ::GG2323222(){ note_ctor("_ZN3aaa9GG2323222E", this);} // tgen
}
static void Test__ZN3aaa9GG2323222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323222E, buf);
    ::aaa::GG2323222 *dp, &lv = *(dp=new (buf) ::aaa::GG2323222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323222E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2323222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2323222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2323222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323222E);
    dp->::aaa::GG2323222::~GG2323222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323222E(Test__ZN3aaa9GG2323222E, "_ZN3aaa9GG2323222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323222C1Ev();
extern void _ZN3aaa9GG2323222D1Ev();
Name_Map name_map__ZN3aaa9GG2323222E[] = {
  NSPAIR(_ZN3aaa9GG2323222C1Ev),
  NSPAIR(_ZN3aaa9GG2323222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2323222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323222E[];
extern void _ZN3aaa9GG23232223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232223barEv,_ZThn8_N3aaa9GG23232223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23232223barEv,_ZThn20_N3aaa9GG23232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23232223barEv,_ZThn28_N3aaa9GG23232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232223barEv,_ZThn8_N3aaa9GG23232223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232223barEv,_ZThn20_N3aaa9GG23232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23232223barEv,_ZThn28_N3aaa9GG23232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323222E[];
Class_Descriptor cd__ZN3aaa9GG2323222E = {  "_ZN3aaa9GG2323222E", // class name
  bases__ZN3aaa9GG2323222E, 6,
  &(vtc__ZN3aaa9GG2323222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323223  : ::aaa::EE232 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23232233fooEv
  virtual void  bar(); // _ZN3aaa9GG23232233barEv
  ~GG2323223(); // tgen
  GG2323223(); // tgen
};
//SIG(1 _ZN3aaa9GG2323223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23232233fooEv");}
void  aaa::GG2323223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23232233barEv");}
aaa::GG2323223 ::~GG2323223(){ note_dtor("_ZN3aaa9GG2323223E", this);} // tgen
aaa::GG2323223 ::GG2323223(){ note_ctor("_ZN3aaa9GG2323223E", this);} // tgen
}
static void Test__ZN3aaa9GG2323223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323223E, buf);
    ::aaa::GG2323223 *dp, &lv = *(dp=new (buf) ::aaa::GG2323223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323223E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2323223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2323223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2323223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323223E);
    dp->::aaa::GG2323223::~GG2323223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323223E(Test__ZN3aaa9GG2323223E, "_ZN3aaa9GG2323223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323223C1Ev();
extern void _ZN3aaa9GG2323223D1Ev();
Name_Map name_map__ZN3aaa9GG2323223E[] = {
  NSPAIR(_ZN3aaa9GG2323223C1Ev),
  NSPAIR(_ZN3aaa9GG2323223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2323223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323223E[];
extern void _ZN3aaa9GG23232233barEv();
extern void _ZN3aaa9GG23232233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232233fooEv,_ZThn8_N3aaa9GG23232233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23232233barEv,_ZThn8_N3aaa9GG23232233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232233fooEv,_ZThn20_N3aaa9GG23232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232233barEv,_ZThn20_N3aaa9GG23232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23232233barEv,_ZThn28_N3aaa9GG23232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23232233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23232233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232233fooEv,_ZThn8_N3aaa9GG23232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232233barEv,_ZThn8_N3aaa9GG23232233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232233fooEv,_ZThn20_N3aaa9GG23232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232233barEv,_ZThn20_N3aaa9GG23232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23232233barEv,_ZThn28_N3aaa9GG23232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323223E[];
Class_Descriptor cd__ZN3aaa9GG2323223E = {  "_ZN3aaa9GG2323223E", // class name
  bases__ZN3aaa9GG2323223E, 6,
  &(vtc__ZN3aaa9GG2323223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323231  : ::aaa::EE232 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23232313fooEv
  ~GG2323231(); // tgen
  GG2323231(); // tgen
};
//SIG(1 _ZN3aaa9GG2323231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23232313fooEv");}
aaa::GG2323231 ::~GG2323231(){ note_dtor("_ZN3aaa9GG2323231E", this);} // tgen
aaa::GG2323231 ::GG2323231(){ note_ctor("_ZN3aaa9GG2323231E", this);} // tgen
}
static void Test__ZN3aaa9GG2323231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323231E, buf);
    ::aaa::GG2323231 *dp, &lv = *(dp=new (buf) ::aaa::GG2323231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323231E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2323231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2323231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2323231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323231E);
    dp->::aaa::GG2323231::~GG2323231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323231E(Test__ZN3aaa9GG2323231E, "_ZN3aaa9GG2323231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323231C1Ev();
extern void _ZN3aaa9GG2323231D1Ev();
Name_Map name_map__ZN3aaa9GG2323231E[] = {
  NSPAIR(_ZN3aaa9GG2323231C1Ev),
  NSPAIR(_ZN3aaa9GG2323231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2323231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323231E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23232313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232313fooEv,_ZThn8_N3aaa9GG23232313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232313fooEv,_ZThn20_N3aaa9GG23232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23232313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232313fooEv,_ZThn8_N3aaa9GG23232313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232313fooEv,_ZThn20_N3aaa9GG23232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323231E[];
Class_Descriptor cd__ZN3aaa9GG2323231E = {  "_ZN3aaa9GG2323231E", // class name
  bases__ZN3aaa9GG2323231E, 6,
  &(vtc__ZN3aaa9GG2323231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323232  : ::aaa::EE232 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23232323barEv
  ~GG2323232(); // tgen
  GG2323232(); // tgen
};
//SIG(1 _ZN3aaa9GG2323232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23232323barEv");}
aaa::GG2323232 ::~GG2323232(){ note_dtor("_ZN3aaa9GG2323232E", this);} // tgen
aaa::GG2323232 ::GG2323232(){ note_ctor("_ZN3aaa9GG2323232E", this);} // tgen
}
static void Test__ZN3aaa9GG2323232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323232E, buf);
    ::aaa::GG2323232 *dp, &lv = *(dp=new (buf) ::aaa::GG2323232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323232E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2323232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2323232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2323232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323232E);
    dp->::aaa::GG2323232::~GG2323232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323232E(Test__ZN3aaa9GG2323232E, "_ZN3aaa9GG2323232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323232C1Ev();
extern void _ZN3aaa9GG2323232D1Ev();
Name_Map name_map__ZN3aaa9GG2323232E[] = {
  NSPAIR(_ZN3aaa9GG2323232C1Ev),
  NSPAIR(_ZN3aaa9GG2323232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2323232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323232E[];
extern void _ZN3aaa9GG23232323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232323barEv,_ZThn8_N3aaa9GG23232323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23232323barEv,_ZThn20_N3aaa9GG23232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23232323barEv,_ZThn28_N3aaa9GG23232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232323barEv,_ZThn8_N3aaa9GG23232323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232323barEv,_ZThn20_N3aaa9GG23232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23232323barEv,_ZThn28_N3aaa9GG23232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323232E[];
Class_Descriptor cd__ZN3aaa9GG2323232E = {  "_ZN3aaa9GG2323232E", // class name
  bases__ZN3aaa9GG2323232E, 6,
  &(vtc__ZN3aaa9GG2323232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323233  : ::aaa::EE232 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23232333fooEv
  virtual void  bar(); // _ZN3aaa9GG23232333barEv
  ~GG2323233(); // tgen
  GG2323233(); // tgen
};
//SIG(1 _ZN3aaa9GG2323233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23232333fooEv");}
void  aaa::GG2323233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23232333barEv");}
aaa::GG2323233 ::~GG2323233(){ note_dtor("_ZN3aaa9GG2323233E", this);} // tgen
aaa::GG2323233 ::GG2323233(){ note_ctor("_ZN3aaa9GG2323233E", this);} // tgen
}
static void Test__ZN3aaa9GG2323233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323233E, buf);
    ::aaa::GG2323233 *dp, &lv = *(dp=new (buf) ::aaa::GG2323233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323233E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2323233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2323233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2323233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323233E);
    dp->::aaa::GG2323233::~GG2323233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323233E(Test__ZN3aaa9GG2323233E, "_ZN3aaa9GG2323233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323233C1Ev();
extern void _ZN3aaa9GG2323233D1Ev();
Name_Map name_map__ZN3aaa9GG2323233E[] = {
  NSPAIR(_ZN3aaa9GG2323233C1Ev),
  NSPAIR(_ZN3aaa9GG2323233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2323233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323233E[];
extern void _ZN3aaa9GG23232333barEv();
extern void _ZN3aaa9GG23232333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23232333fooEv,_ZThn8_N3aaa9GG23232333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23232333barEv,_ZThn8_N3aaa9GG23232333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232333fooEv,_ZThn20_N3aaa9GG23232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23232333barEv,_ZThn20_N3aaa9GG23232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23232333barEv,_ZThn28_N3aaa9GG23232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23232333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23232333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232333fooEv,_ZThn8_N3aaa9GG23232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23232333barEv,_ZThn8_N3aaa9GG23232333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232333fooEv,_ZThn20_N3aaa9GG23232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23232333barEv,_ZThn20_N3aaa9GG23232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23232333barEv,_ZThn28_N3aaa9GG23232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323233E[];
Class_Descriptor cd__ZN3aaa9GG2323233E = {  "_ZN3aaa9GG2323233E", // class name
  bases__ZN3aaa9GG2323233E, 6,
  &(vtc__ZN3aaa9GG2323233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323311  : ::aaa::EE232 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23233113fooEv
  ~GG2323311(); // tgen
  GG2323311(); // tgen
};
//SIG(1 _ZN3aaa9GG2323311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23233113fooEv");}
aaa::GG2323311 ::~GG2323311(){ note_dtor("_ZN3aaa9GG2323311E", this);} // tgen
aaa::GG2323311 ::GG2323311(){ note_ctor("_ZN3aaa9GG2323311E", this);} // tgen
}
static void Test__ZN3aaa9GG2323311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323311E, buf);
    ::aaa::GG2323311 *dp, &lv = *(dp=new (buf) ::aaa::GG2323311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323311E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2323311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2323311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2323311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323311E);
    dp->::aaa::GG2323311::~GG2323311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323311E(Test__ZN3aaa9GG2323311E, "_ZN3aaa9GG2323311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323311C1Ev();
extern void _ZN3aaa9GG2323311D1Ev();
Name_Map name_map__ZN3aaa9GG2323311E[] = {
  NSPAIR(_ZN3aaa9GG2323311C1Ev),
  NSPAIR(_ZN3aaa9GG2323311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2323311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323311E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23233113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233113fooEv,_ZThn8_N3aaa9GG23233113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233113fooEv,_ZThn20_N3aaa9GG23233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23233113fooEv,_ZThn28_N3aaa9GG23233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23233113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233113fooEv,_ZThn8_N3aaa9GG23233113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233113fooEv,_ZThn20_N3aaa9GG23233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233113fooEv,_ZThn28_N3aaa9GG23233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323311E[];
Class_Descriptor cd__ZN3aaa9GG2323311E = {  "_ZN3aaa9GG2323311E", // class name
  bases__ZN3aaa9GG2323311E, 6,
  &(vtc__ZN3aaa9GG2323311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323312  : ::aaa::EE232 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23233123barEv
  ~GG2323312(); // tgen
  GG2323312(); // tgen
};
//SIG(1 _ZN3aaa9GG2323312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23233123barEv");}
aaa::GG2323312 ::~GG2323312(){ note_dtor("_ZN3aaa9GG2323312E", this);} // tgen
aaa::GG2323312 ::GG2323312(){ note_ctor("_ZN3aaa9GG2323312E", this);} // tgen
}
static void Test__ZN3aaa9GG2323312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323312E, buf);
    ::aaa::GG2323312 *dp, &lv = *(dp=new (buf) ::aaa::GG2323312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323312E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2323312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2323312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2323312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323312E);
    dp->::aaa::GG2323312::~GG2323312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323312E(Test__ZN3aaa9GG2323312E, "_ZN3aaa9GG2323312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323312C1Ev();
extern void _ZN3aaa9GG2323312D1Ev();
Name_Map name_map__ZN3aaa9GG2323312E[] = {
  NSPAIR(_ZN3aaa9GG2323312C1Ev),
  NSPAIR(_ZN3aaa9GG2323312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2323312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323312E[];
extern void _ZN3aaa9GG23233123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233123barEv,_ZThn8_N3aaa9GG23233123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23233123barEv,_ZThn20_N3aaa9GG23233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23233123barEv,_ZThn28_N3aaa9GG23233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233123barEv,_ZThn8_N3aaa9GG23233123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233123barEv,_ZThn20_N3aaa9GG23233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233123barEv,_ZThn28_N3aaa9GG23233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323312E[];
Class_Descriptor cd__ZN3aaa9GG2323312E = {  "_ZN3aaa9GG2323312E", // class name
  bases__ZN3aaa9GG2323312E, 6,
  &(vtc__ZN3aaa9GG2323312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323313  : ::aaa::EE232 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23233133fooEv
  virtual void  bar(); // _ZN3aaa9GG23233133barEv
  ~GG2323313(); // tgen
  GG2323313(); // tgen
};
//SIG(1 _ZN3aaa9GG2323313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23233133fooEv");}
void  aaa::GG2323313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23233133barEv");}
aaa::GG2323313 ::~GG2323313(){ note_dtor("_ZN3aaa9GG2323313E", this);} // tgen
aaa::GG2323313 ::GG2323313(){ note_ctor("_ZN3aaa9GG2323313E", this);} // tgen
}
static void Test__ZN3aaa9GG2323313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323313E, buf);
    ::aaa::GG2323313 *dp, &lv = *(dp=new (buf) ::aaa::GG2323313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323313E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2323313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2323313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2323313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323313E);
    dp->::aaa::GG2323313::~GG2323313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323313E(Test__ZN3aaa9GG2323313E, "_ZN3aaa9GG2323313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323313C1Ev();
extern void _ZN3aaa9GG2323313D1Ev();
Name_Map name_map__ZN3aaa9GG2323313E[] = {
  NSPAIR(_ZN3aaa9GG2323313C1Ev),
  NSPAIR(_ZN3aaa9GG2323313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2323313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323313E[];
extern void _ZN3aaa9GG23233133barEv();
extern void _ZN3aaa9GG23233133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233133fooEv,_ZThn8_N3aaa9GG23233133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23233133barEv,_ZThn8_N3aaa9GG23233133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233133fooEv,_ZThn20_N3aaa9GG23233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233133barEv,_ZThn20_N3aaa9GG23233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23233133fooEv,_ZThn28_N3aaa9GG23233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23233133barEv,_ZThn28_N3aaa9GG23233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23233133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23233133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233133fooEv,_ZThn8_N3aaa9GG23233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233133barEv,_ZThn8_N3aaa9GG23233133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233133fooEv,_ZThn20_N3aaa9GG23233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233133barEv,_ZThn20_N3aaa9GG23233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233133fooEv,_ZThn28_N3aaa9GG23233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233133barEv,_ZThn28_N3aaa9GG23233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323313E[];
Class_Descriptor cd__ZN3aaa9GG2323313E = {  "_ZN3aaa9GG2323313E", // class name
  bases__ZN3aaa9GG2323313E, 6,
  &(vtc__ZN3aaa9GG2323313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323321  : ::aaa::EE232 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23233213fooEv
  ~GG2323321(); // tgen
  GG2323321(); // tgen
};
//SIG(1 _ZN3aaa9GG2323321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23233213fooEv");}
aaa::GG2323321 ::~GG2323321(){ note_dtor("_ZN3aaa9GG2323321E", this);} // tgen
aaa::GG2323321 ::GG2323321(){ note_ctor("_ZN3aaa9GG2323321E", this);} // tgen
}
static void Test__ZN3aaa9GG2323321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323321E, buf);
    ::aaa::GG2323321 *dp, &lv = *(dp=new (buf) ::aaa::GG2323321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323321E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2323321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2323321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2323321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323321E);
    dp->::aaa::GG2323321::~GG2323321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323321E(Test__ZN3aaa9GG2323321E, "_ZN3aaa9GG2323321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323321C1Ev();
extern void _ZN3aaa9GG2323321D1Ev();
Name_Map name_map__ZN3aaa9GG2323321E[] = {
  NSPAIR(_ZN3aaa9GG2323321C1Ev),
  NSPAIR(_ZN3aaa9GG2323321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2323321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323321E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23233213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233213fooEv,_ZThn8_N3aaa9GG23233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233213fooEv,_ZThn20_N3aaa9GG23233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23233213fooEv,_ZThn28_N3aaa9GG23233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23233213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233213fooEv,_ZThn8_N3aaa9GG23233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233213fooEv,_ZThn20_N3aaa9GG23233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233213fooEv,_ZThn28_N3aaa9GG23233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323321E[];
Class_Descriptor cd__ZN3aaa9GG2323321E = {  "_ZN3aaa9GG2323321E", // class name
  bases__ZN3aaa9GG2323321E, 6,
  &(vtc__ZN3aaa9GG2323321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323322  : ::aaa::EE232 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23233223barEv
  ~GG2323322(); // tgen
  GG2323322(); // tgen
};
//SIG(1 _ZN3aaa9GG2323322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23233223barEv");}
aaa::GG2323322 ::~GG2323322(){ note_dtor("_ZN3aaa9GG2323322E", this);} // tgen
aaa::GG2323322 ::GG2323322(){ note_ctor("_ZN3aaa9GG2323322E", this);} // tgen
}
static void Test__ZN3aaa9GG2323322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323322E, buf);
    ::aaa::GG2323322 *dp, &lv = *(dp=new (buf) ::aaa::GG2323322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323322E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2323322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2323322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2323322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323322E);
    dp->::aaa::GG2323322::~GG2323322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323322E(Test__ZN3aaa9GG2323322E, "_ZN3aaa9GG2323322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323322C1Ev();
extern void _ZN3aaa9GG2323322D1Ev();
Name_Map name_map__ZN3aaa9GG2323322E[] = {
  NSPAIR(_ZN3aaa9GG2323322C1Ev),
  NSPAIR(_ZN3aaa9GG2323322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2323322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323322E[];
extern void _ZN3aaa9GG23233223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233223barEv,_ZThn8_N3aaa9GG23233223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23233223barEv,_ZThn20_N3aaa9GG23233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23233223barEv,_ZThn28_N3aaa9GG23233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233223barEv,_ZThn8_N3aaa9GG23233223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233223barEv,_ZThn20_N3aaa9GG23233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233223barEv,_ZThn28_N3aaa9GG23233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323322E[];
Class_Descriptor cd__ZN3aaa9GG2323322E = {  "_ZN3aaa9GG2323322E", // class name
  bases__ZN3aaa9GG2323322E, 6,
  &(vtc__ZN3aaa9GG2323322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323323  : ::aaa::EE232 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23233233fooEv
  virtual void  bar(); // _ZN3aaa9GG23233233barEv
  ~GG2323323(); // tgen
  GG2323323(); // tgen
};
//SIG(1 _ZN3aaa9GG2323323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23233233fooEv");}
void  aaa::GG2323323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23233233barEv");}
aaa::GG2323323 ::~GG2323323(){ note_dtor("_ZN3aaa9GG2323323E", this);} // tgen
aaa::GG2323323 ::GG2323323(){ note_ctor("_ZN3aaa9GG2323323E", this);} // tgen
}
static void Test__ZN3aaa9GG2323323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323323E, buf);
    ::aaa::GG2323323 *dp, &lv = *(dp=new (buf) ::aaa::GG2323323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323323E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2323323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2323323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2323323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323323E);
    dp->::aaa::GG2323323::~GG2323323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323323E(Test__ZN3aaa9GG2323323E, "_ZN3aaa9GG2323323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323323C1Ev();
extern void _ZN3aaa9GG2323323D1Ev();
Name_Map name_map__ZN3aaa9GG2323323E[] = {
  NSPAIR(_ZN3aaa9GG2323323C1Ev),
  NSPAIR(_ZN3aaa9GG2323323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2323323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323323E[];
extern void _ZN3aaa9GG23233233barEv();
extern void _ZN3aaa9GG23233233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233233fooEv,_ZThn8_N3aaa9GG23233233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23233233barEv,_ZThn8_N3aaa9GG23233233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233233fooEv,_ZThn20_N3aaa9GG23233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233233barEv,_ZThn20_N3aaa9GG23233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23233233fooEv,_ZThn28_N3aaa9GG23233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23233233barEv,_ZThn28_N3aaa9GG23233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23233233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23233233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233233fooEv,_ZThn8_N3aaa9GG23233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233233barEv,_ZThn8_N3aaa9GG23233233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233233fooEv,_ZThn20_N3aaa9GG23233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233233barEv,_ZThn20_N3aaa9GG23233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233233fooEv,_ZThn28_N3aaa9GG23233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233233barEv,_ZThn28_N3aaa9GG23233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323323E[];
Class_Descriptor cd__ZN3aaa9GG2323323E = {  "_ZN3aaa9GG2323323E", // class name
  bases__ZN3aaa9GG2323323E, 6,
  &(vtc__ZN3aaa9GG2323323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323331  : ::aaa::EE232 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23233313fooEv
  ~GG2323331(); // tgen
  GG2323331(); // tgen
};
//SIG(1 _ZN3aaa9GG2323331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23233313fooEv");}
aaa::GG2323331 ::~GG2323331(){ note_dtor("_ZN3aaa9GG2323331E", this);} // tgen
aaa::GG2323331 ::GG2323331(){ note_ctor("_ZN3aaa9GG2323331E", this);} // tgen
}
static void Test__ZN3aaa9GG2323331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323331E, buf);
    ::aaa::GG2323331 *dp, &lv = *(dp=new (buf) ::aaa::GG2323331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323331E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2323331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2323331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2323331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323331E);
    dp->::aaa::GG2323331::~GG2323331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323331E(Test__ZN3aaa9GG2323331E, "_ZN3aaa9GG2323331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323331C1Ev();
extern void _ZN3aaa9GG2323331D1Ev();
Name_Map name_map__ZN3aaa9GG2323331E[] = {
  NSPAIR(_ZN3aaa9GG2323331C1Ev),
  NSPAIR(_ZN3aaa9GG2323331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2323331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323331E[];
extern void _ZN3aaa5EE2323barEv();
extern void _ZN3aaa9GG23233313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233313fooEv,_ZThn8_N3aaa9GG23233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233313fooEv,_ZThn20_N3aaa9GG23233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23233313fooEv,_ZThn28_N3aaa9GG23233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2323barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23233313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233313fooEv,_ZThn8_N3aaa9GG23233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2323barEv,_ZThn8_N3aaa5EE2323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233313fooEv,_ZThn20_N3aaa9GG23233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233313fooEv,_ZThn28_N3aaa9GG23233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323331E[];
Class_Descriptor cd__ZN3aaa9GG2323331E = {  "_ZN3aaa9GG2323331E", // class name
  bases__ZN3aaa9GG2323331E, 6,
  &(vtc__ZN3aaa9GG2323331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323332  : ::aaa::EE232 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23233323barEv
  ~GG2323332(); // tgen
  GG2323332(); // tgen
};
//SIG(1 _ZN3aaa9GG2323332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2323332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23233323barEv");}
aaa::GG2323332 ::~GG2323332(){ note_dtor("_ZN3aaa9GG2323332E", this);} // tgen
aaa::GG2323332 ::GG2323332(){ note_ctor("_ZN3aaa9GG2323332E", this);} // tgen
}
static void Test__ZN3aaa9GG2323332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323332E, buf);
    ::aaa::GG2323332 *dp, &lv = *(dp=new (buf) ::aaa::GG2323332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323332E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2323332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2323332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2323332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323332E);
    dp->::aaa::GG2323332::~GG2323332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323332E(Test__ZN3aaa9GG2323332E, "_ZN3aaa9GG2323332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323332C1Ev();
extern void _ZN3aaa9GG2323332D1Ev();
Name_Map name_map__ZN3aaa9GG2323332E[] = {
  NSPAIR(_ZN3aaa9GG2323332C1Ev),
  NSPAIR(_ZN3aaa9GG2323332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2323332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //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
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323332E[];
extern void _ZN3aaa9GG23233323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233323barEv,_ZThn8_N3aaa9GG23233323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23233323barEv,_ZThn20_N3aaa9GG23233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23233323barEv,_ZThn28_N3aaa9GG23233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233323barEv,_ZThn8_N3aaa9GG23233323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233323barEv,_ZThn20_N3aaa9GG23233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233323barEv,_ZThn28_N3aaa9GG23233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323332E[];
Class_Descriptor cd__ZN3aaa9GG2323332E = {  "_ZN3aaa9GG2323332E", // class name
  bases__ZN3aaa9GG2323332E, 6,
  &(vtc__ZN3aaa9GG2323332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2323333  : ::aaa::EE232 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23233333fooEv
  virtual void  bar(); // _ZN3aaa9GG23233333barEv
  ~GG2323333(); // tgen
  GG2323333(); // tgen
};
//SIG(1 _ZN3aaa9GG2323333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2323333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23233333fooEv");}
void  aaa::GG2323333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23233333barEv");}
aaa::GG2323333 ::~GG2323333(){ note_dtor("_ZN3aaa9GG2323333E", this);} // tgen
aaa::GG2323333 ::GG2323333(){ note_ctor("_ZN3aaa9GG2323333E", this);} // tgen
}
static void Test__ZN3aaa9GG2323333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2323333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2323333E, buf);
    ::aaa::GG2323333 *dp, &lv = *(dp=new (buf) ::aaa::GG2323333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2323333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2323333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE232*), 0, "_ZN3aaa9GG2323333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE232*), ABISELECT(16,8), "_ZN3aaa9GG2323333E");
    check_base_class_offset(lv, (::aaa::EE232*), 0, "_ZN3aaa9GG2323333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2323333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2323333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2323333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2323333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2323333E);
    dp->::aaa::GG2323333::~GG2323333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2323333E(Test__ZN3aaa9GG2323333E, "_ZN3aaa9GG2323333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2323333C1Ev();
extern void _ZN3aaa9GG2323333D1Ev();
Name_Map name_map__ZN3aaa9GG2323333E[] = {
  NSPAIR(_ZN3aaa9GG2323333C1Ev),
  NSPAIR(_ZN3aaa9GG2323333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE232E;
extern VTBL_ENTRY _ZTIN3aaa5EE232E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE232E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2323333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE232E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2323333E[];
extern void _ZN3aaa9GG23233333barEv();
extern void _ZN3aaa9GG23233333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23233333fooEv,_ZThn8_N3aaa9GG23233333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23233333barEv,_ZThn8_N3aaa9GG23233333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233333fooEv,_ZThn20_N3aaa9GG23233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23233333barEv,_ZThn20_N3aaa9GG23233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23233333fooEv,_ZThn28_N3aaa9GG23233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23233333barEv,_ZThn28_N3aaa9GG23233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2323333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23233333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23233333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233333fooEv,_ZThn8_N3aaa9GG23233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23233333barEv,_ZThn8_N3aaa9GG23233333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233333fooEv,_ZThn20_N3aaa9GG23233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23233333barEv,_ZThn20_N3aaa9GG23233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233333fooEv,_ZThn28_N3aaa9GG23233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23233333barEv,_ZThn28_N3aaa9GG23233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2323333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2323333E[];
Class_Descriptor cd__ZN3aaa9GG2323333E = {  "_ZN3aaa9GG2323333E", // class name
  bases__ZN3aaa9GG2323333E, 6,
  &(vtc__ZN3aaa9GG2323333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2323333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2323333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331111  : ::aaa::EE233 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23311113fooEv
  ~GG2331111(); // tgen
  GG2331111(); // tgen
};
//SIG(1 _ZN3aaa9GG2331111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23311113fooEv");}
aaa::GG2331111 ::~GG2331111(){ note_dtor("_ZN3aaa9GG2331111E", this);} // tgen
aaa::GG2331111 ::GG2331111(){ note_ctor("_ZN3aaa9GG2331111E", this);} // tgen
}
static void Test__ZN3aaa9GG2331111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331111E, buf);
    ::aaa::GG2331111 *dp, &lv = *(dp=new (buf) ::aaa::GG2331111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331111E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2331111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2331111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2331111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331111E);
    dp->::aaa::GG2331111::~GG2331111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331111E(Test__ZN3aaa9GG2331111E, "_ZN3aaa9GG2331111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331111C1Ev();
extern void _ZN3aaa9GG2331111D1Ev();
Name_Map name_map__ZN3aaa9GG2331111E[] = {
  NSPAIR(_ZN3aaa9GG2331111C1Ev),
  NSPAIR(_ZN3aaa9GG2331111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2331111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331111E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23311113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23311113fooEv,_ZThn8_N3aaa9GG23311113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23311113fooEv,_ZThn20_N3aaa9GG23311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23311113fooEv,_ZThn28_N3aaa9GG23311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23311113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311113fooEv,_ZThn8_N3aaa9GG23311113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311113fooEv,_ZThn20_N3aaa9GG23311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23311113fooEv,_ZThn28_N3aaa9GG23311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331111E[];
Class_Descriptor cd__ZN3aaa9GG2331111E = {  "_ZN3aaa9GG2331111E", // class name
  bases__ZN3aaa9GG2331111E, 6,
  &(vtc__ZN3aaa9GG2331111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331112  : ::aaa::EE233 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23311123barEv
  ~GG2331112(); // tgen
  GG2331112(); // tgen
};
//SIG(1 _ZN3aaa9GG2331112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23311123barEv");}
aaa::GG2331112 ::~GG2331112(){ note_dtor("_ZN3aaa9GG2331112E", this);} // tgen
aaa::GG2331112 ::GG2331112(){ note_ctor("_ZN3aaa9GG2331112E", this);} // tgen
}
static void Test__ZN3aaa9GG2331112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331112E, buf);
    ::aaa::GG2331112 *dp, &lv = *(dp=new (buf) ::aaa::GG2331112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331112E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2331112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2331112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2331112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331112E);
    dp->::aaa::GG2331112::~GG2331112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331112E(Test__ZN3aaa9GG2331112E, "_ZN3aaa9GG2331112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331112C1Ev();
extern void _ZN3aaa9GG2331112D1Ev();
Name_Map name_map__ZN3aaa9GG2331112E[] = {
  NSPAIR(_ZN3aaa9GG2331112C1Ev),
  NSPAIR(_ZN3aaa9GG2331112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2331112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331112E[];
extern void _ZN3aaa9GG23311123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23311123barEv,_ZThn8_N3aaa9GG23311123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23311123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311123barEv,_ZThn8_N3aaa9GG23311123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331112E[];
Class_Descriptor cd__ZN3aaa9GG2331112E = {  "_ZN3aaa9GG2331112E", // class name
  bases__ZN3aaa9GG2331112E, 6,
  &(vtc__ZN3aaa9GG2331112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331113  : ::aaa::EE233 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23311133fooEv
  virtual void  bar(); // _ZN3aaa9GG23311133barEv
  ~GG2331113(); // tgen
  GG2331113(); // tgen
};
//SIG(1 _ZN3aaa9GG2331113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23311133fooEv");}
void  aaa::GG2331113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23311133barEv");}
aaa::GG2331113 ::~GG2331113(){ note_dtor("_ZN3aaa9GG2331113E", this);} // tgen
aaa::GG2331113 ::GG2331113(){ note_ctor("_ZN3aaa9GG2331113E", this);} // tgen
}
static void Test__ZN3aaa9GG2331113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331113E, buf);
    ::aaa::GG2331113 *dp, &lv = *(dp=new (buf) ::aaa::GG2331113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331113E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2331113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG2331113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG2331113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331113E);
    dp->::aaa::GG2331113::~GG2331113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331113E(Test__ZN3aaa9GG2331113E, "_ZN3aaa9GG2331113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331113C1Ev();
extern void _ZN3aaa9GG2331113D1Ev();
Name_Map name_map__ZN3aaa9GG2331113E[] = {
  NSPAIR(_ZN3aaa9GG2331113C1Ev),
  NSPAIR(_ZN3aaa9GG2331113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG2331113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331113E[];
extern void _ZN3aaa9GG23311133barEv();
extern void _ZN3aaa9GG23311133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23311133fooEv,_ZThn8_N3aaa9GG23311133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23311133barEv,_ZThn8_N3aaa9GG23311133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23311133fooEv,_ZThn20_N3aaa9GG23311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23311133fooEv,_ZThn28_N3aaa9GG23311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23311133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23311133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311133fooEv,_ZThn8_N3aaa9GG23311133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311133barEv,_ZThn8_N3aaa9GG23311133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311133fooEv,_ZThn20_N3aaa9GG23311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23311133fooEv,_ZThn28_N3aaa9GG23311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331113E[];
Class_Descriptor cd__ZN3aaa9GG2331113E = {  "_ZN3aaa9GG2331113E", // class name
  bases__ZN3aaa9GG2331113E, 6,
  &(vtc__ZN3aaa9GG2331113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331121  : ::aaa::EE233 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23311213fooEv
  ~GG2331121(); // tgen
  GG2331121(); // tgen
};
//SIG(1 _ZN3aaa9GG2331121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23311213fooEv");}
aaa::GG2331121 ::~GG2331121(){ note_dtor("_ZN3aaa9GG2331121E", this);} // tgen
aaa::GG2331121 ::GG2331121(){ note_ctor("_ZN3aaa9GG2331121E", this);} // tgen
}
static void Test__ZN3aaa9GG2331121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331121E, buf);
    ::aaa::GG2331121 *dp, &lv = *(dp=new (buf) ::aaa::GG2331121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331121E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2331121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2331121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2331121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331121E);
    dp->::aaa::GG2331121::~GG2331121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331121E(Test__ZN3aaa9GG2331121E, "_ZN3aaa9GG2331121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331121C1Ev();
extern void _ZN3aaa9GG2331121D1Ev();
Name_Map name_map__ZN3aaa9GG2331121E[] = {
  NSPAIR(_ZN3aaa9GG2331121C1Ev),
  NSPAIR(_ZN3aaa9GG2331121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2331121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331121E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23311213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23311213fooEv,_ZThn8_N3aaa9GG23311213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23311213fooEv,_ZThn20_N3aaa9GG23311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23311213fooEv,_ZThn28_N3aaa9GG23311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23311213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311213fooEv,_ZThn8_N3aaa9GG23311213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311213fooEv,_ZThn20_N3aaa9GG23311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23311213fooEv,_ZThn28_N3aaa9GG23311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331121E[];
Class_Descriptor cd__ZN3aaa9GG2331121E = {  "_ZN3aaa9GG2331121E", // class name
  bases__ZN3aaa9GG2331121E, 6,
  &(vtc__ZN3aaa9GG2331121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331122  : ::aaa::EE233 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23311223barEv
  ~GG2331122(); // tgen
  GG2331122(); // tgen
};
//SIG(1 _ZN3aaa9GG2331122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23311223barEv");}
aaa::GG2331122 ::~GG2331122(){ note_dtor("_ZN3aaa9GG2331122E", this);} // tgen
aaa::GG2331122 ::GG2331122(){ note_ctor("_ZN3aaa9GG2331122E", this);} // tgen
}
static void Test__ZN3aaa9GG2331122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331122E, buf);
    ::aaa::GG2331122 *dp, &lv = *(dp=new (buf) ::aaa::GG2331122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331122E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2331122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2331122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2331122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331122E);
    dp->::aaa::GG2331122::~GG2331122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331122E(Test__ZN3aaa9GG2331122E, "_ZN3aaa9GG2331122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331122C1Ev();
extern void _ZN3aaa9GG2331122D1Ev();
Name_Map name_map__ZN3aaa9GG2331122E[] = {
  NSPAIR(_ZN3aaa9GG2331122C1Ev),
  NSPAIR(_ZN3aaa9GG2331122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2331122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331122E[];
extern void _ZN3aaa9GG23311223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23311223barEv,_ZThn8_N3aaa9GG23311223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23311223barEv,_ZThn20_N3aaa9GG23311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23311223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311223barEv,_ZThn8_N3aaa9GG23311223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311223barEv,_ZThn20_N3aaa9GG23311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331122E[];
Class_Descriptor cd__ZN3aaa9GG2331122E = {  "_ZN3aaa9GG2331122E", // class name
  bases__ZN3aaa9GG2331122E, 6,
  &(vtc__ZN3aaa9GG2331122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331123  : ::aaa::EE233 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23311233fooEv
  virtual void  bar(); // _ZN3aaa9GG23311233barEv
  ~GG2331123(); // tgen
  GG2331123(); // tgen
};
//SIG(1 _ZN3aaa9GG2331123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23311233fooEv");}
void  aaa::GG2331123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23311233barEv");}
aaa::GG2331123 ::~GG2331123(){ note_dtor("_ZN3aaa9GG2331123E", this);} // tgen
aaa::GG2331123 ::GG2331123(){ note_ctor("_ZN3aaa9GG2331123E", this);} // tgen
}
static void Test__ZN3aaa9GG2331123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331123E, buf);
    ::aaa::GG2331123 *dp, &lv = *(dp=new (buf) ::aaa::GG2331123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331123E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2331123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG2331123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG2331123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331123E);
    dp->::aaa::GG2331123::~GG2331123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331123E(Test__ZN3aaa9GG2331123E, "_ZN3aaa9GG2331123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331123C1Ev();
extern void _ZN3aaa9GG2331123D1Ev();
Name_Map name_map__ZN3aaa9GG2331123E[] = {
  NSPAIR(_ZN3aaa9GG2331123C1Ev),
  NSPAIR(_ZN3aaa9GG2331123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG2331123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331123E[];
extern void _ZN3aaa9GG23311233barEv();
extern void _ZN3aaa9GG23311233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23311233fooEv,_ZThn8_N3aaa9GG23311233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23311233barEv,_ZThn8_N3aaa9GG23311233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23311233fooEv,_ZThn20_N3aaa9GG23311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23311233barEv,_ZThn20_N3aaa9GG23311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23311233fooEv,_ZThn28_N3aaa9GG23311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23311233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23311233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311233fooEv,_ZThn8_N3aaa9GG23311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311233barEv,_ZThn8_N3aaa9GG23311233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311233fooEv,_ZThn20_N3aaa9GG23311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311233barEv,_ZThn20_N3aaa9GG23311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23311233fooEv,_ZThn28_N3aaa9GG23311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331123E[];
Class_Descriptor cd__ZN3aaa9GG2331123E = {  "_ZN3aaa9GG2331123E", // class name
  bases__ZN3aaa9GG2331123E, 6,
  &(vtc__ZN3aaa9GG2331123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331131  : ::aaa::EE233 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23311313fooEv
  ~GG2331131(); // tgen
  GG2331131(); // tgen
};
//SIG(1 _ZN3aaa9GG2331131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23311313fooEv");}
aaa::GG2331131 ::~GG2331131(){ note_dtor("_ZN3aaa9GG2331131E", this);} // tgen
aaa::GG2331131 ::GG2331131(){ note_ctor("_ZN3aaa9GG2331131E", this);} // tgen
}
static void Test__ZN3aaa9GG2331131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331131E, buf);
    ::aaa::GG2331131 *dp, &lv = *(dp=new (buf) ::aaa::GG2331131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331131E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2331131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2331131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2331131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331131E);
    dp->::aaa::GG2331131::~GG2331131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331131E(Test__ZN3aaa9GG2331131E, "_ZN3aaa9GG2331131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331131C1Ev();
extern void _ZN3aaa9GG2331131D1Ev();
Name_Map name_map__ZN3aaa9GG2331131E[] = {
  NSPAIR(_ZN3aaa9GG2331131C1Ev),
  NSPAIR(_ZN3aaa9GG2331131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2331131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331131E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23311313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23311313fooEv,_ZThn8_N3aaa9GG23311313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23311313fooEv,_ZThn20_N3aaa9GG23311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23311313fooEv,_ZThn28_N3aaa9GG23311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23311313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311313fooEv,_ZThn8_N3aaa9GG23311313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311313fooEv,_ZThn20_N3aaa9GG23311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23311313fooEv,_ZThn28_N3aaa9GG23311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331131E[];
Class_Descriptor cd__ZN3aaa9GG2331131E = {  "_ZN3aaa9GG2331131E", // class name
  bases__ZN3aaa9GG2331131E, 6,
  &(vtc__ZN3aaa9GG2331131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331132  : ::aaa::EE233 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23311323barEv
  ~GG2331132(); // tgen
  GG2331132(); // tgen
};
//SIG(1 _ZN3aaa9GG2331132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23311323barEv");}
aaa::GG2331132 ::~GG2331132(){ note_dtor("_ZN3aaa9GG2331132E", this);} // tgen
aaa::GG2331132 ::GG2331132(){ note_ctor("_ZN3aaa9GG2331132E", this);} // tgen
}
static void Test__ZN3aaa9GG2331132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331132E, buf);
    ::aaa::GG2331132 *dp, &lv = *(dp=new (buf) ::aaa::GG2331132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331132E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2331132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2331132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2331132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331132E);
    dp->::aaa::GG2331132::~GG2331132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331132E(Test__ZN3aaa9GG2331132E, "_ZN3aaa9GG2331132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331132C1Ev();
extern void _ZN3aaa9GG2331132D1Ev();
Name_Map name_map__ZN3aaa9GG2331132E[] = {
  NSPAIR(_ZN3aaa9GG2331132C1Ev),
  NSPAIR(_ZN3aaa9GG2331132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2331132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331132E[];
extern void _ZN3aaa9GG23311323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23311323barEv,_ZThn8_N3aaa9GG23311323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23311323barEv,_ZThn20_N3aaa9GG23311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23311323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311323barEv,_ZThn8_N3aaa9GG23311323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311323barEv,_ZThn20_N3aaa9GG23311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331132E[];
Class_Descriptor cd__ZN3aaa9GG2331132E = {  "_ZN3aaa9GG2331132E", // class name
  bases__ZN3aaa9GG2331132E, 6,
  &(vtc__ZN3aaa9GG2331132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331133  : ::aaa::EE233 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23311333fooEv
  virtual void  bar(); // _ZN3aaa9GG23311333barEv
  ~GG2331133(); // tgen
  GG2331133(); // tgen
};
//SIG(1 _ZN3aaa9GG2331133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23311333fooEv");}
void  aaa::GG2331133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23311333barEv");}
aaa::GG2331133 ::~GG2331133(){ note_dtor("_ZN3aaa9GG2331133E", this);} // tgen
aaa::GG2331133 ::GG2331133(){ note_ctor("_ZN3aaa9GG2331133E", this);} // tgen
}
static void Test__ZN3aaa9GG2331133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331133E, buf);
    ::aaa::GG2331133 *dp, &lv = *(dp=new (buf) ::aaa::GG2331133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331133E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2331133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG2331133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG2331133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331133E);
    dp->::aaa::GG2331133::~GG2331133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331133E(Test__ZN3aaa9GG2331133E, "_ZN3aaa9GG2331133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331133C1Ev();
extern void _ZN3aaa9GG2331133D1Ev();
Name_Map name_map__ZN3aaa9GG2331133E[] = {
  NSPAIR(_ZN3aaa9GG2331133C1Ev),
  NSPAIR(_ZN3aaa9GG2331133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG2331133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331133E[];
extern void _ZN3aaa9GG23311333barEv();
extern void _ZN3aaa9GG23311333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23311333fooEv,_ZThn8_N3aaa9GG23311333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23311333barEv,_ZThn8_N3aaa9GG23311333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23311333fooEv,_ZThn20_N3aaa9GG23311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23311333barEv,_ZThn20_N3aaa9GG23311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23311333fooEv,_ZThn28_N3aaa9GG23311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23311333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23311333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311333fooEv,_ZThn8_N3aaa9GG23311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23311333barEv,_ZThn8_N3aaa9GG23311333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311333fooEv,_ZThn20_N3aaa9GG23311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23311333barEv,_ZThn20_N3aaa9GG23311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23311333fooEv,_ZThn28_N3aaa9GG23311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331133E[];
Class_Descriptor cd__ZN3aaa9GG2331133E = {  "_ZN3aaa9GG2331133E", // class name
  bases__ZN3aaa9GG2331133E, 6,
  &(vtc__ZN3aaa9GG2331133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331211  : ::aaa::EE233 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23312113fooEv
  ~GG2331211(); // tgen
  GG2331211(); // tgen
};
//SIG(1 _ZN3aaa9GG2331211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23312113fooEv");}
aaa::GG2331211 ::~GG2331211(){ note_dtor("_ZN3aaa9GG2331211E", this);} // tgen
aaa::GG2331211 ::GG2331211(){ note_ctor("_ZN3aaa9GG2331211E", this);} // tgen
}
static void Test__ZN3aaa9GG2331211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331211E, buf);
    ::aaa::GG2331211 *dp, &lv = *(dp=new (buf) ::aaa::GG2331211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331211E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2331211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2331211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2331211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331211E);
    dp->::aaa::GG2331211::~GG2331211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331211E(Test__ZN3aaa9GG2331211E, "_ZN3aaa9GG2331211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331211C1Ev();
extern void _ZN3aaa9GG2331211D1Ev();
Name_Map name_map__ZN3aaa9GG2331211E[] = {
  NSPAIR(_ZN3aaa9GG2331211C1Ev),
  NSPAIR(_ZN3aaa9GG2331211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2331211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331211E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23312113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23312113fooEv,_ZThn8_N3aaa9GG23312113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23312113fooEv,_ZThn20_N3aaa9GG23312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23312113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312113fooEv,_ZThn8_N3aaa9GG23312113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312113fooEv,_ZThn20_N3aaa9GG23312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331211E[];
Class_Descriptor cd__ZN3aaa9GG2331211E = {  "_ZN3aaa9GG2331211E", // class name
  bases__ZN3aaa9GG2331211E, 6,
  &(vtc__ZN3aaa9GG2331211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331212  : ::aaa::EE233 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23312123barEv
  ~GG2331212(); // tgen
  GG2331212(); // tgen
};
//SIG(1 _ZN3aaa9GG2331212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23312123barEv");}
aaa::GG2331212 ::~GG2331212(){ note_dtor("_ZN3aaa9GG2331212E", this);} // tgen
aaa::GG2331212 ::GG2331212(){ note_ctor("_ZN3aaa9GG2331212E", this);} // tgen
}
static void Test__ZN3aaa9GG2331212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331212E, buf);
    ::aaa::GG2331212 *dp, &lv = *(dp=new (buf) ::aaa::GG2331212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331212E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2331212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2331212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2331212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331212E);
    dp->::aaa::GG2331212::~GG2331212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331212E(Test__ZN3aaa9GG2331212E, "_ZN3aaa9GG2331212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331212C1Ev();
extern void _ZN3aaa9GG2331212D1Ev();
Name_Map name_map__ZN3aaa9GG2331212E[] = {
  NSPAIR(_ZN3aaa9GG2331212C1Ev),
  NSPAIR(_ZN3aaa9GG2331212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2331212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331212E[];
extern void _ZN3aaa9GG23312123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23312123barEv,_ZThn8_N3aaa9GG23312123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23312123barEv,_ZThn28_N3aaa9GG23312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23312123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312123barEv,_ZThn8_N3aaa9GG23312123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23312123barEv,_ZThn28_N3aaa9GG23312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331212E[];
Class_Descriptor cd__ZN3aaa9GG2331212E = {  "_ZN3aaa9GG2331212E", // class name
  bases__ZN3aaa9GG2331212E, 6,
  &(vtc__ZN3aaa9GG2331212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331213  : ::aaa::EE233 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23312133fooEv
  virtual void  bar(); // _ZN3aaa9GG23312133barEv
  ~GG2331213(); // tgen
  GG2331213(); // tgen
};
//SIG(1 _ZN3aaa9GG2331213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23312133fooEv");}
void  aaa::GG2331213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23312133barEv");}
aaa::GG2331213 ::~GG2331213(){ note_dtor("_ZN3aaa9GG2331213E", this);} // tgen
aaa::GG2331213 ::GG2331213(){ note_ctor("_ZN3aaa9GG2331213E", this);} // tgen
}
static void Test__ZN3aaa9GG2331213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331213E, buf);
    ::aaa::GG2331213 *dp, &lv = *(dp=new (buf) ::aaa::GG2331213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331213E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2331213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG2331213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG2331213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331213E);
    dp->::aaa::GG2331213::~GG2331213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331213E(Test__ZN3aaa9GG2331213E, "_ZN3aaa9GG2331213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331213C1Ev();
extern void _ZN3aaa9GG2331213D1Ev();
Name_Map name_map__ZN3aaa9GG2331213E[] = {
  NSPAIR(_ZN3aaa9GG2331213C1Ev),
  NSPAIR(_ZN3aaa9GG2331213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG2331213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331213E[];
extern void _ZN3aaa9GG23312133barEv();
extern void _ZN3aaa9GG23312133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23312133fooEv,_ZThn8_N3aaa9GG23312133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23312133barEv,_ZThn8_N3aaa9GG23312133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23312133fooEv,_ZThn20_N3aaa9GG23312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23312133barEv,_ZThn28_N3aaa9GG23312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23312133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23312133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312133fooEv,_ZThn8_N3aaa9GG23312133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312133barEv,_ZThn8_N3aaa9GG23312133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312133fooEv,_ZThn20_N3aaa9GG23312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23312133barEv,_ZThn28_N3aaa9GG23312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331213E[];
Class_Descriptor cd__ZN3aaa9GG2331213E = {  "_ZN3aaa9GG2331213E", // class name
  bases__ZN3aaa9GG2331213E, 6,
  &(vtc__ZN3aaa9GG2331213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331221  : ::aaa::EE233 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23312213fooEv
  ~GG2331221(); // tgen
  GG2331221(); // tgen
};
//SIG(1 _ZN3aaa9GG2331221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23312213fooEv");}
aaa::GG2331221 ::~GG2331221(){ note_dtor("_ZN3aaa9GG2331221E", this);} // tgen
aaa::GG2331221 ::GG2331221(){ note_ctor("_ZN3aaa9GG2331221E", this);} // tgen
}
static void Test__ZN3aaa9GG2331221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331221E, buf);
    ::aaa::GG2331221 *dp, &lv = *(dp=new (buf) ::aaa::GG2331221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331221E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2331221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2331221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2331221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331221E);
    dp->::aaa::GG2331221::~GG2331221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331221E(Test__ZN3aaa9GG2331221E, "_ZN3aaa9GG2331221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331221C1Ev();
extern void _ZN3aaa9GG2331221D1Ev();
Name_Map name_map__ZN3aaa9GG2331221E[] = {
  NSPAIR(_ZN3aaa9GG2331221C1Ev),
  NSPAIR(_ZN3aaa9GG2331221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2331221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331221E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23312213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23312213fooEv,_ZThn8_N3aaa9GG23312213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23312213fooEv,_ZThn20_N3aaa9GG23312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23312213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312213fooEv,_ZThn8_N3aaa9GG23312213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312213fooEv,_ZThn20_N3aaa9GG23312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331221E[];
Class_Descriptor cd__ZN3aaa9GG2331221E = {  "_ZN3aaa9GG2331221E", // class name
  bases__ZN3aaa9GG2331221E, 6,
  &(vtc__ZN3aaa9GG2331221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331222  : ::aaa::EE233 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23312223barEv
  ~GG2331222(); // tgen
  GG2331222(); // tgen
};
//SIG(1 _ZN3aaa9GG2331222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23312223barEv");}
aaa::GG2331222 ::~GG2331222(){ note_dtor("_ZN3aaa9GG2331222E", this);} // tgen
aaa::GG2331222 ::GG2331222(){ note_ctor("_ZN3aaa9GG2331222E", this);} // tgen
}
static void Test__ZN3aaa9GG2331222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331222E, buf);
    ::aaa::GG2331222 *dp, &lv = *(dp=new (buf) ::aaa::GG2331222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331222E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2331222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2331222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2331222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331222E);
    dp->::aaa::GG2331222::~GG2331222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331222E(Test__ZN3aaa9GG2331222E, "_ZN3aaa9GG2331222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331222C1Ev();
extern void _ZN3aaa9GG2331222D1Ev();
Name_Map name_map__ZN3aaa9GG2331222E[] = {
  NSPAIR(_ZN3aaa9GG2331222C1Ev),
  NSPAIR(_ZN3aaa9GG2331222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2331222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331222E[];
extern void _ZN3aaa9GG23312223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23312223barEv,_ZThn8_N3aaa9GG23312223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23312223barEv,_ZThn20_N3aaa9GG23312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23312223barEv,_ZThn28_N3aaa9GG23312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23312223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312223barEv,_ZThn8_N3aaa9GG23312223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312223barEv,_ZThn20_N3aaa9GG23312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23312223barEv,_ZThn28_N3aaa9GG23312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331222E[];
Class_Descriptor cd__ZN3aaa9GG2331222E = {  "_ZN3aaa9GG2331222E", // class name
  bases__ZN3aaa9GG2331222E, 6,
  &(vtc__ZN3aaa9GG2331222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331223  : ::aaa::EE233 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23312233fooEv
  virtual void  bar(); // _ZN3aaa9GG23312233barEv
  ~GG2331223(); // tgen
  GG2331223(); // tgen
};
//SIG(1 _ZN3aaa9GG2331223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23312233fooEv");}
void  aaa::GG2331223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23312233barEv");}
aaa::GG2331223 ::~GG2331223(){ note_dtor("_ZN3aaa9GG2331223E", this);} // tgen
aaa::GG2331223 ::GG2331223(){ note_ctor("_ZN3aaa9GG2331223E", this);} // tgen
}
static void Test__ZN3aaa9GG2331223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331223E, buf);
    ::aaa::GG2331223 *dp, &lv = *(dp=new (buf) ::aaa::GG2331223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331223E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2331223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG2331223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG2331223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331223E);
    dp->::aaa::GG2331223::~GG2331223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331223E(Test__ZN3aaa9GG2331223E, "_ZN3aaa9GG2331223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331223C1Ev();
extern void _ZN3aaa9GG2331223D1Ev();
Name_Map name_map__ZN3aaa9GG2331223E[] = {
  NSPAIR(_ZN3aaa9GG2331223C1Ev),
  NSPAIR(_ZN3aaa9GG2331223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG2331223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331223E[];
extern void _ZN3aaa9GG23312233barEv();
extern void _ZN3aaa9GG23312233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23312233fooEv,_ZThn8_N3aaa9GG23312233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23312233barEv,_ZThn8_N3aaa9GG23312233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23312233fooEv,_ZThn20_N3aaa9GG23312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23312233barEv,_ZThn20_N3aaa9GG23312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23312233barEv,_ZThn28_N3aaa9GG23312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23312233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23312233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312233fooEv,_ZThn8_N3aaa9GG23312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312233barEv,_ZThn8_N3aaa9GG23312233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312233fooEv,_ZThn20_N3aaa9GG23312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312233barEv,_ZThn20_N3aaa9GG23312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23312233barEv,_ZThn28_N3aaa9GG23312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331223E[];
Class_Descriptor cd__ZN3aaa9GG2331223E = {  "_ZN3aaa9GG2331223E", // class name
  bases__ZN3aaa9GG2331223E, 6,
  &(vtc__ZN3aaa9GG2331223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331231  : ::aaa::EE233 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23312313fooEv
  ~GG2331231(); // tgen
  GG2331231(); // tgen
};
//SIG(1 _ZN3aaa9GG2331231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23312313fooEv");}
aaa::GG2331231 ::~GG2331231(){ note_dtor("_ZN3aaa9GG2331231E", this);} // tgen
aaa::GG2331231 ::GG2331231(){ note_ctor("_ZN3aaa9GG2331231E", this);} // tgen
}
static void Test__ZN3aaa9GG2331231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331231E, buf);
    ::aaa::GG2331231 *dp, &lv = *(dp=new (buf) ::aaa::GG2331231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331231E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2331231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2331231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2331231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331231E);
    dp->::aaa::GG2331231::~GG2331231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331231E(Test__ZN3aaa9GG2331231E, "_ZN3aaa9GG2331231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331231C1Ev();
extern void _ZN3aaa9GG2331231D1Ev();
Name_Map name_map__ZN3aaa9GG2331231E[] = {
  NSPAIR(_ZN3aaa9GG2331231C1Ev),
  NSPAIR(_ZN3aaa9GG2331231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2331231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331231E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23312313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23312313fooEv,_ZThn8_N3aaa9GG23312313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23312313fooEv,_ZThn20_N3aaa9GG23312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23312313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312313fooEv,_ZThn8_N3aaa9GG23312313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312313fooEv,_ZThn20_N3aaa9GG23312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331231E[];
Class_Descriptor cd__ZN3aaa9GG2331231E = {  "_ZN3aaa9GG2331231E", // class name
  bases__ZN3aaa9GG2331231E, 6,
  &(vtc__ZN3aaa9GG2331231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331232  : ::aaa::EE233 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23312323barEv
  ~GG2331232(); // tgen
  GG2331232(); // tgen
};
//SIG(1 _ZN3aaa9GG2331232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23312323barEv");}
aaa::GG2331232 ::~GG2331232(){ note_dtor("_ZN3aaa9GG2331232E", this);} // tgen
aaa::GG2331232 ::GG2331232(){ note_ctor("_ZN3aaa9GG2331232E", this);} // tgen
}
static void Test__ZN3aaa9GG2331232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331232E, buf);
    ::aaa::GG2331232 *dp, &lv = *(dp=new (buf) ::aaa::GG2331232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331232E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2331232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2331232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2331232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331232E);
    dp->::aaa::GG2331232::~GG2331232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331232E(Test__ZN3aaa9GG2331232E, "_ZN3aaa9GG2331232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331232C1Ev();
extern void _ZN3aaa9GG2331232D1Ev();
Name_Map name_map__ZN3aaa9GG2331232E[] = {
  NSPAIR(_ZN3aaa9GG2331232C1Ev),
  NSPAIR(_ZN3aaa9GG2331232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2331232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331232E[];
extern void _ZN3aaa9GG23312323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23312323barEv,_ZThn8_N3aaa9GG23312323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23312323barEv,_ZThn20_N3aaa9GG23312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23312323barEv,_ZThn28_N3aaa9GG23312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23312323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312323barEv,_ZThn8_N3aaa9GG23312323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312323barEv,_ZThn20_N3aaa9GG23312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23312323barEv,_ZThn28_N3aaa9GG23312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331232E[];
Class_Descriptor cd__ZN3aaa9GG2331232E = {  "_ZN3aaa9GG2331232E", // class name
  bases__ZN3aaa9GG2331232E, 6,
  &(vtc__ZN3aaa9GG2331232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331233  : ::aaa::EE233 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23312333fooEv
  virtual void  bar(); // _ZN3aaa9GG23312333barEv
  ~GG2331233(); // tgen
  GG2331233(); // tgen
};
//SIG(1 _ZN3aaa9GG2331233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23312333fooEv");}
void  aaa::GG2331233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23312333barEv");}
aaa::GG2331233 ::~GG2331233(){ note_dtor("_ZN3aaa9GG2331233E", this);} // tgen
aaa::GG2331233 ::GG2331233(){ note_ctor("_ZN3aaa9GG2331233E", this);} // tgen
}
static void Test__ZN3aaa9GG2331233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331233E, buf);
    ::aaa::GG2331233 *dp, &lv = *(dp=new (buf) ::aaa::GG2331233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331233E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2331233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG2331233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG2331233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331233E);
    dp->::aaa::GG2331233::~GG2331233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331233E(Test__ZN3aaa9GG2331233E, "_ZN3aaa9GG2331233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331233C1Ev();
extern void _ZN3aaa9GG2331233D1Ev();
Name_Map name_map__ZN3aaa9GG2331233E[] = {
  NSPAIR(_ZN3aaa9GG2331233C1Ev),
  NSPAIR(_ZN3aaa9GG2331233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG2331233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331233E[];
extern void _ZN3aaa9GG23312333barEv();
extern void _ZN3aaa9GG23312333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23312333fooEv,_ZThn8_N3aaa9GG23312333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23312333barEv,_ZThn8_N3aaa9GG23312333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23312333fooEv,_ZThn20_N3aaa9GG23312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23312333barEv,_ZThn20_N3aaa9GG23312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23312333barEv,_ZThn28_N3aaa9GG23312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23312333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23312333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312333fooEv,_ZThn8_N3aaa9GG23312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23312333barEv,_ZThn8_N3aaa9GG23312333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312333fooEv,_ZThn20_N3aaa9GG23312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23312333barEv,_ZThn20_N3aaa9GG23312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23312333barEv,_ZThn28_N3aaa9GG23312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331233E[];
Class_Descriptor cd__ZN3aaa9GG2331233E = {  "_ZN3aaa9GG2331233E", // class name
  bases__ZN3aaa9GG2331233E, 6,
  &(vtc__ZN3aaa9GG2331233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331311  : ::aaa::EE233 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23313113fooEv
  ~GG2331311(); // tgen
  GG2331311(); // tgen
};
//SIG(1 _ZN3aaa9GG2331311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23313113fooEv");}
aaa::GG2331311 ::~GG2331311(){ note_dtor("_ZN3aaa9GG2331311E", this);} // tgen
aaa::GG2331311 ::GG2331311(){ note_ctor("_ZN3aaa9GG2331311E", this);} // tgen
}
static void Test__ZN3aaa9GG2331311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331311E, buf);
    ::aaa::GG2331311 *dp, &lv = *(dp=new (buf) ::aaa::GG2331311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331311E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2331311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2331311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2331311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331311E);
    dp->::aaa::GG2331311::~GG2331311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331311E(Test__ZN3aaa9GG2331311E, "_ZN3aaa9GG2331311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331311C1Ev();
extern void _ZN3aaa9GG2331311D1Ev();
Name_Map name_map__ZN3aaa9GG2331311E[] = {
  NSPAIR(_ZN3aaa9GG2331311C1Ev),
  NSPAIR(_ZN3aaa9GG2331311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2331311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331311E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23313113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23313113fooEv,_ZThn8_N3aaa9GG23313113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23313113fooEv,_ZThn20_N3aaa9GG23313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313113fooEv,_ZThn28_N3aaa9GG23313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23313113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313113fooEv,_ZThn8_N3aaa9GG23313113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313113fooEv,_ZThn20_N3aaa9GG23313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313113fooEv,_ZThn28_N3aaa9GG23313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331311E[];
Class_Descriptor cd__ZN3aaa9GG2331311E = {  "_ZN3aaa9GG2331311E", // class name
  bases__ZN3aaa9GG2331311E, 6,
  &(vtc__ZN3aaa9GG2331311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331312  : ::aaa::EE233 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23313123barEv
  ~GG2331312(); // tgen
  GG2331312(); // tgen
};
//SIG(1 _ZN3aaa9GG2331312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23313123barEv");}
aaa::GG2331312 ::~GG2331312(){ note_dtor("_ZN3aaa9GG2331312E", this);} // tgen
aaa::GG2331312 ::GG2331312(){ note_ctor("_ZN3aaa9GG2331312E", this);} // tgen
}
static void Test__ZN3aaa9GG2331312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331312E, buf);
    ::aaa::GG2331312 *dp, &lv = *(dp=new (buf) ::aaa::GG2331312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331312E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2331312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2331312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2331312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331312E);
    dp->::aaa::GG2331312::~GG2331312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331312E(Test__ZN3aaa9GG2331312E, "_ZN3aaa9GG2331312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331312C1Ev();
extern void _ZN3aaa9GG2331312D1Ev();
Name_Map name_map__ZN3aaa9GG2331312E[] = {
  NSPAIR(_ZN3aaa9GG2331312C1Ev),
  NSPAIR(_ZN3aaa9GG2331312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2331312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331312E[];
extern void _ZN3aaa9GG23313123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23313123barEv,_ZThn8_N3aaa9GG23313123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313123barEv,_ZThn28_N3aaa9GG23313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23313123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313123barEv,_ZThn8_N3aaa9GG23313123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313123barEv,_ZThn28_N3aaa9GG23313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331312E[];
Class_Descriptor cd__ZN3aaa9GG2331312E = {  "_ZN3aaa9GG2331312E", // class name
  bases__ZN3aaa9GG2331312E, 6,
  &(vtc__ZN3aaa9GG2331312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331313  : ::aaa::EE233 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23313133fooEv
  virtual void  bar(); // _ZN3aaa9GG23313133barEv
  ~GG2331313(); // tgen
  GG2331313(); // tgen
};
//SIG(1 _ZN3aaa9GG2331313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23313133fooEv");}
void  aaa::GG2331313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23313133barEv");}
aaa::GG2331313 ::~GG2331313(){ note_dtor("_ZN3aaa9GG2331313E", this);} // tgen
aaa::GG2331313 ::GG2331313(){ note_ctor("_ZN3aaa9GG2331313E", this);} // tgen
}
static void Test__ZN3aaa9GG2331313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331313E, buf);
    ::aaa::GG2331313 *dp, &lv = *(dp=new (buf) ::aaa::GG2331313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331313E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2331313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG2331313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG2331313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331313E);
    dp->::aaa::GG2331313::~GG2331313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331313E(Test__ZN3aaa9GG2331313E, "_ZN3aaa9GG2331313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331313C1Ev();
extern void _ZN3aaa9GG2331313D1Ev();
Name_Map name_map__ZN3aaa9GG2331313E[] = {
  NSPAIR(_ZN3aaa9GG2331313C1Ev),
  NSPAIR(_ZN3aaa9GG2331313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG2331313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331313E[];
extern void _ZN3aaa9GG23313133barEv();
extern void _ZN3aaa9GG23313133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23313133fooEv,_ZThn8_N3aaa9GG23313133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23313133barEv,_ZThn8_N3aaa9GG23313133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23313133fooEv,_ZThn20_N3aaa9GG23313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313133fooEv,_ZThn28_N3aaa9GG23313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313133barEv,_ZThn28_N3aaa9GG23313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23313133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23313133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313133fooEv,_ZThn8_N3aaa9GG23313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313133barEv,_ZThn8_N3aaa9GG23313133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313133fooEv,_ZThn20_N3aaa9GG23313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313133fooEv,_ZThn28_N3aaa9GG23313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313133barEv,_ZThn28_N3aaa9GG23313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331313E[];
Class_Descriptor cd__ZN3aaa9GG2331313E = {  "_ZN3aaa9GG2331313E", // class name
  bases__ZN3aaa9GG2331313E, 6,
  &(vtc__ZN3aaa9GG2331313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331321  : ::aaa::EE233 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23313213fooEv
  ~GG2331321(); // tgen
  GG2331321(); // tgen
};
//SIG(1 _ZN3aaa9GG2331321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23313213fooEv");}
aaa::GG2331321 ::~GG2331321(){ note_dtor("_ZN3aaa9GG2331321E", this);} // tgen
aaa::GG2331321 ::GG2331321(){ note_ctor("_ZN3aaa9GG2331321E", this);} // tgen
}
static void Test__ZN3aaa9GG2331321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331321E, buf);
    ::aaa::GG2331321 *dp, &lv = *(dp=new (buf) ::aaa::GG2331321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331321E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2331321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2331321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2331321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331321E);
    dp->::aaa::GG2331321::~GG2331321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331321E(Test__ZN3aaa9GG2331321E, "_ZN3aaa9GG2331321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331321C1Ev();
extern void _ZN3aaa9GG2331321D1Ev();
Name_Map name_map__ZN3aaa9GG2331321E[] = {
  NSPAIR(_ZN3aaa9GG2331321C1Ev),
  NSPAIR(_ZN3aaa9GG2331321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2331321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331321E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23313213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23313213fooEv,_ZThn8_N3aaa9GG23313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23313213fooEv,_ZThn20_N3aaa9GG23313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23313213fooEv,_ZThn28_N3aaa9GG23313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23313213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313213fooEv,_ZThn8_N3aaa9GG23313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313213fooEv,_ZThn20_N3aaa9GG23313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313213fooEv,_ZThn28_N3aaa9GG23313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331321E[];
Class_Descriptor cd__ZN3aaa9GG2331321E = {  "_ZN3aaa9GG2331321E", // class name
  bases__ZN3aaa9GG2331321E, 6,
  &(vtc__ZN3aaa9GG2331321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331322  : ::aaa::EE233 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23313223barEv
  ~GG2331322(); // tgen
  GG2331322(); // tgen
};
//SIG(1 _ZN3aaa9GG2331322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23313223barEv");}
aaa::GG2331322 ::~GG2331322(){ note_dtor("_ZN3aaa9GG2331322E", this);} // tgen
aaa::GG2331322 ::GG2331322(){ note_ctor("_ZN3aaa9GG2331322E", this);} // tgen
}
static void Test__ZN3aaa9GG2331322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331322E, buf);
    ::aaa::GG2331322 *dp, &lv = *(dp=new (buf) ::aaa::GG2331322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331322E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2331322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2331322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2331322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331322E);
    dp->::aaa::GG2331322::~GG2331322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331322E(Test__ZN3aaa9GG2331322E, "_ZN3aaa9GG2331322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331322C1Ev();
extern void _ZN3aaa9GG2331322D1Ev();
Name_Map name_map__ZN3aaa9GG2331322E[] = {
  NSPAIR(_ZN3aaa9GG2331322C1Ev),
  NSPAIR(_ZN3aaa9GG2331322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2331322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331322E[];
extern void _ZN3aaa9GG23313223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23313223barEv,_ZThn8_N3aaa9GG23313223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23313223barEv,_ZThn20_N3aaa9GG23313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23313223barEv,_ZThn28_N3aaa9GG23313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23313223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313223barEv,_ZThn8_N3aaa9GG23313223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313223barEv,_ZThn20_N3aaa9GG23313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313223barEv,_ZThn28_N3aaa9GG23313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331322E[];
Class_Descriptor cd__ZN3aaa9GG2331322E = {  "_ZN3aaa9GG2331322E", // class name
  bases__ZN3aaa9GG2331322E, 6,
  &(vtc__ZN3aaa9GG2331322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331323  : ::aaa::EE233 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23313233fooEv
  virtual void  bar(); // _ZN3aaa9GG23313233barEv
  ~GG2331323(); // tgen
  GG2331323(); // tgen
};
//SIG(1 _ZN3aaa9GG2331323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23313233fooEv");}
void  aaa::GG2331323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23313233barEv");}
aaa::GG2331323 ::~GG2331323(){ note_dtor("_ZN3aaa9GG2331323E", this);} // tgen
aaa::GG2331323 ::GG2331323(){ note_ctor("_ZN3aaa9GG2331323E", this);} // tgen
}
static void Test__ZN3aaa9GG2331323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331323E, buf);
    ::aaa::GG2331323 *dp, &lv = *(dp=new (buf) ::aaa::GG2331323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331323E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2331323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG2331323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG2331323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331323E);
    dp->::aaa::GG2331323::~GG2331323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331323E(Test__ZN3aaa9GG2331323E, "_ZN3aaa9GG2331323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331323C1Ev();
extern void _ZN3aaa9GG2331323D1Ev();
Name_Map name_map__ZN3aaa9GG2331323E[] = {
  NSPAIR(_ZN3aaa9GG2331323C1Ev),
  NSPAIR(_ZN3aaa9GG2331323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG2331323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331323E[];
extern void _ZN3aaa9GG23313233barEv();
extern void _ZN3aaa9GG23313233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23313233fooEv,_ZThn8_N3aaa9GG23313233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23313233barEv,_ZThn8_N3aaa9GG23313233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23313233fooEv,_ZThn20_N3aaa9GG23313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23313233barEv,_ZThn20_N3aaa9GG23313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313233fooEv,_ZThn28_N3aaa9GG23313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313233barEv,_ZThn28_N3aaa9GG23313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23313233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23313233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313233fooEv,_ZThn8_N3aaa9GG23313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313233barEv,_ZThn8_N3aaa9GG23313233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313233fooEv,_ZThn20_N3aaa9GG23313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313233barEv,_ZThn20_N3aaa9GG23313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313233fooEv,_ZThn28_N3aaa9GG23313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313233barEv,_ZThn28_N3aaa9GG23313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331323E[];
Class_Descriptor cd__ZN3aaa9GG2331323E = {  "_ZN3aaa9GG2331323E", // class name
  bases__ZN3aaa9GG2331323E, 6,
  &(vtc__ZN3aaa9GG2331323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331331  : ::aaa::EE233 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23313313fooEv
  ~GG2331331(); // tgen
  GG2331331(); // tgen
};
//SIG(1 _ZN3aaa9GG2331331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23313313fooEv");}
aaa::GG2331331 ::~GG2331331(){ note_dtor("_ZN3aaa9GG2331331E", this);} // tgen
aaa::GG2331331 ::GG2331331(){ note_ctor("_ZN3aaa9GG2331331E", this);} // tgen
}
static void Test__ZN3aaa9GG2331331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331331E, buf);
    ::aaa::GG2331331 *dp, &lv = *(dp=new (buf) ::aaa::GG2331331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331331E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2331331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2331331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2331331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331331E);
    dp->::aaa::GG2331331::~GG2331331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331331E(Test__ZN3aaa9GG2331331E, "_ZN3aaa9GG2331331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331331C1Ev();
extern void _ZN3aaa9GG2331331D1Ev();
Name_Map name_map__ZN3aaa9GG2331331E[] = {
  NSPAIR(_ZN3aaa9GG2331331C1Ev),
  NSPAIR(_ZN3aaa9GG2331331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2331331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331331E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23313313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23313313fooEv,_ZThn8_N3aaa9GG23313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23313313fooEv,_ZThn20_N3aaa9GG23313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23313313fooEv,_ZThn28_N3aaa9GG23313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23313313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313313fooEv,_ZThn8_N3aaa9GG23313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313313fooEv,_ZThn20_N3aaa9GG23313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313313fooEv,_ZThn28_N3aaa9GG23313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331331E[];
Class_Descriptor cd__ZN3aaa9GG2331331E = {  "_ZN3aaa9GG2331331E", // class name
  bases__ZN3aaa9GG2331331E, 6,
  &(vtc__ZN3aaa9GG2331331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331332  : ::aaa::EE233 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23313323barEv
  ~GG2331332(); // tgen
  GG2331332(); // tgen
};
//SIG(1 _ZN3aaa9GG2331332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2331332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23313323barEv");}
aaa::GG2331332 ::~GG2331332(){ note_dtor("_ZN3aaa9GG2331332E", this);} // tgen
aaa::GG2331332 ::GG2331332(){ note_ctor("_ZN3aaa9GG2331332E", this);} // tgen
}
static void Test__ZN3aaa9GG2331332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331332E, buf);
    ::aaa::GG2331332 *dp, &lv = *(dp=new (buf) ::aaa::GG2331332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331332E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2331332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2331332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2331332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331332E);
    dp->::aaa::GG2331332::~GG2331332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331332E(Test__ZN3aaa9GG2331332E, "_ZN3aaa9GG2331332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331332C1Ev();
extern void _ZN3aaa9GG2331332D1Ev();
Name_Map name_map__ZN3aaa9GG2331332E[] = {
  NSPAIR(_ZN3aaa9GG2331332C1Ev),
  NSPAIR(_ZN3aaa9GG2331332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2331332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331332E[];
extern void _ZN3aaa9GG23313323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23313323barEv,_ZThn8_N3aaa9GG23313323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23313323barEv,_ZThn20_N3aaa9GG23313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313323barEv,_ZThn28_N3aaa9GG23313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23313323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313323barEv,_ZThn8_N3aaa9GG23313323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313323barEv,_ZThn20_N3aaa9GG23313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313323barEv,_ZThn28_N3aaa9GG23313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331332E[];
Class_Descriptor cd__ZN3aaa9GG2331332E = {  "_ZN3aaa9GG2331332E", // class name
  bases__ZN3aaa9GG2331332E, 6,
  &(vtc__ZN3aaa9GG2331332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2331333  : ::aaa::EE233 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23313333fooEv
  virtual void  bar(); // _ZN3aaa9GG23313333barEv
  ~GG2331333(); // tgen
  GG2331333(); // tgen
};
//SIG(1 _ZN3aaa9GG2331333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2331333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23313333fooEv");}
void  aaa::GG2331333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23313333barEv");}
aaa::GG2331333 ::~GG2331333(){ note_dtor("_ZN3aaa9GG2331333E", this);} // tgen
aaa::GG2331333 ::GG2331333(){ note_ctor("_ZN3aaa9GG2331333E", this);} // tgen
}
static void Test__ZN3aaa9GG2331333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2331333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2331333E, buf);
    ::aaa::GG2331333 *dp, &lv = *(dp=new (buf) ::aaa::GG2331333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2331333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2331333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2331333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2331333E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2331333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2331333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG2331333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG2331333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2331333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2331333E);
    dp->::aaa::GG2331333::~GG2331333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2331333E(Test__ZN3aaa9GG2331333E, "_ZN3aaa9GG2331333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2331333C1Ev();
extern void _ZN3aaa9GG2331333D1Ev();
Name_Map name_map__ZN3aaa9GG2331333E[] = {
  NSPAIR(_ZN3aaa9GG2331333C1Ev),
  NSPAIR(_ZN3aaa9GG2331333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG2331333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2331333E[];
extern void _ZN3aaa9GG23313333barEv();
extern void _ZN3aaa9GG23313333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23313333fooEv,_ZThn8_N3aaa9GG23313333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23313333barEv,_ZThn8_N3aaa9GG23313333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23313333fooEv,_ZThn20_N3aaa9GG23313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23313333barEv,_ZThn20_N3aaa9GG23313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313333fooEv,_ZThn28_N3aaa9GG23313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23313333barEv,_ZThn28_N3aaa9GG23313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2331333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23313333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23313333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313333fooEv,_ZThn8_N3aaa9GG23313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23313333barEv,_ZThn8_N3aaa9GG23313333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313333fooEv,_ZThn20_N3aaa9GG23313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23313333barEv,_ZThn20_N3aaa9GG23313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313333fooEv,_ZThn28_N3aaa9GG23313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23313333barEv,_ZThn28_N3aaa9GG23313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2331333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2331333E[];
Class_Descriptor cd__ZN3aaa9GG2331333E = {  "_ZN3aaa9GG2331333E", // class name
  bases__ZN3aaa9GG2331333E, 6,
  &(vtc__ZN3aaa9GG2331333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2331333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2331333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332111  : ::aaa::EE233 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23321113fooEv
  ~GG2332111(); // tgen
  GG2332111(); // tgen
};
//SIG(1 _ZN3aaa9GG2332111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23321113fooEv");}
aaa::GG2332111 ::~GG2332111(){ note_dtor("_ZN3aaa9GG2332111E", this);} // tgen
aaa::GG2332111 ::GG2332111(){ note_ctor("_ZN3aaa9GG2332111E", this);} // tgen
}
static void Test__ZN3aaa9GG2332111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332111E, buf);
    ::aaa::GG2332111 *dp, &lv = *(dp=new (buf) ::aaa::GG2332111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332111E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2332111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2332111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2332111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332111E);
    dp->::aaa::GG2332111::~GG2332111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332111E(Test__ZN3aaa9GG2332111E, "_ZN3aaa9GG2332111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332111C1Ev();
extern void _ZN3aaa9GG2332111D1Ev();
Name_Map name_map__ZN3aaa9GG2332111E[] = {
  NSPAIR(_ZN3aaa9GG2332111C1Ev),
  NSPAIR(_ZN3aaa9GG2332111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2332111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332111E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23321113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23321113fooEv,_ZThn8_N3aaa9GG23321113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23321113fooEv,_ZThn20_N3aaa9GG23321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23321113fooEv,_ZThn28_N3aaa9GG23321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23321113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321113fooEv,_ZThn8_N3aaa9GG23321113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321113fooEv,_ZThn20_N3aaa9GG23321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23321113fooEv,_ZThn28_N3aaa9GG23321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332111E[];
Class_Descriptor cd__ZN3aaa9GG2332111E = {  "_ZN3aaa9GG2332111E", // class name
  bases__ZN3aaa9GG2332111E, 6,
  &(vtc__ZN3aaa9GG2332111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332112  : ::aaa::EE233 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23321123barEv
  ~GG2332112(); // tgen
  GG2332112(); // tgen
};
//SIG(1 _ZN3aaa9GG2332112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23321123barEv");}
aaa::GG2332112 ::~GG2332112(){ note_dtor("_ZN3aaa9GG2332112E", this);} // tgen
aaa::GG2332112 ::GG2332112(){ note_ctor("_ZN3aaa9GG2332112E", this);} // tgen
}
static void Test__ZN3aaa9GG2332112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332112E, buf);
    ::aaa::GG2332112 *dp, &lv = *(dp=new (buf) ::aaa::GG2332112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332112E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2332112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2332112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2332112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332112E);
    dp->::aaa::GG2332112::~GG2332112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332112E(Test__ZN3aaa9GG2332112E, "_ZN3aaa9GG2332112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332112C1Ev();
extern void _ZN3aaa9GG2332112D1Ev();
Name_Map name_map__ZN3aaa9GG2332112E[] = {
  NSPAIR(_ZN3aaa9GG2332112C1Ev),
  NSPAIR(_ZN3aaa9GG2332112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2332112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332112E[];
extern void _ZN3aaa9GG23321123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23321123barEv,_ZThn8_N3aaa9GG23321123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23321123barEv,_ZThn20_N3aaa9GG23321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23321123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321123barEv,_ZThn8_N3aaa9GG23321123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321123barEv,_ZThn20_N3aaa9GG23321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332112E[];
Class_Descriptor cd__ZN3aaa9GG2332112E = {  "_ZN3aaa9GG2332112E", // class name
  bases__ZN3aaa9GG2332112E, 6,
  &(vtc__ZN3aaa9GG2332112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332113  : ::aaa::EE233 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23321133fooEv
  virtual void  bar(); // _ZN3aaa9GG23321133barEv
  ~GG2332113(); // tgen
  GG2332113(); // tgen
};
//SIG(1 _ZN3aaa9GG2332113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23321133fooEv");}
void  aaa::GG2332113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23321133barEv");}
aaa::GG2332113 ::~GG2332113(){ note_dtor("_ZN3aaa9GG2332113E", this);} // tgen
aaa::GG2332113 ::GG2332113(){ note_ctor("_ZN3aaa9GG2332113E", this);} // tgen
}
static void Test__ZN3aaa9GG2332113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332113E, buf);
    ::aaa::GG2332113 *dp, &lv = *(dp=new (buf) ::aaa::GG2332113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332113E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2332113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG2332113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG2332113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332113E);
    dp->::aaa::GG2332113::~GG2332113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332113E(Test__ZN3aaa9GG2332113E, "_ZN3aaa9GG2332113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332113C1Ev();
extern void _ZN3aaa9GG2332113D1Ev();
Name_Map name_map__ZN3aaa9GG2332113E[] = {
  NSPAIR(_ZN3aaa9GG2332113C1Ev),
  NSPAIR(_ZN3aaa9GG2332113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG2332113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332113E[];
extern void _ZN3aaa9GG23321133barEv();
extern void _ZN3aaa9GG23321133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23321133fooEv,_ZThn8_N3aaa9GG23321133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23321133barEv,_ZThn8_N3aaa9GG23321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23321133barEv,_ZThn20_N3aaa9GG23321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23321133fooEv,_ZThn20_N3aaa9GG23321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23321133fooEv,_ZThn28_N3aaa9GG23321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23321133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23321133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321133fooEv,_ZThn8_N3aaa9GG23321133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321133barEv,_ZThn8_N3aaa9GG23321133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321133barEv,_ZThn20_N3aaa9GG23321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321133fooEv,_ZThn20_N3aaa9GG23321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23321133fooEv,_ZThn28_N3aaa9GG23321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332113E[];
Class_Descriptor cd__ZN3aaa9GG2332113E = {  "_ZN3aaa9GG2332113E", // class name
  bases__ZN3aaa9GG2332113E, 6,
  &(vtc__ZN3aaa9GG2332113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332121  : ::aaa::EE233 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23321213fooEv
  ~GG2332121(); // tgen
  GG2332121(); // tgen
};
//SIG(1 _ZN3aaa9GG2332121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23321213fooEv");}
aaa::GG2332121 ::~GG2332121(){ note_dtor("_ZN3aaa9GG2332121E", this);} // tgen
aaa::GG2332121 ::GG2332121(){ note_ctor("_ZN3aaa9GG2332121E", this);} // tgen
}
static void Test__ZN3aaa9GG2332121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332121E, buf);
    ::aaa::GG2332121 *dp, &lv = *(dp=new (buf) ::aaa::GG2332121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332121E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2332121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2332121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2332121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332121E);
    dp->::aaa::GG2332121::~GG2332121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332121E(Test__ZN3aaa9GG2332121E, "_ZN3aaa9GG2332121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332121C1Ev();
extern void _ZN3aaa9GG2332121D1Ev();
Name_Map name_map__ZN3aaa9GG2332121E[] = {
  NSPAIR(_ZN3aaa9GG2332121C1Ev),
  NSPAIR(_ZN3aaa9GG2332121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2332121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332121E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23321213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23321213fooEv,_ZThn8_N3aaa9GG23321213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23321213fooEv,_ZThn28_N3aaa9GG23321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23321213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321213fooEv,_ZThn8_N3aaa9GG23321213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23321213fooEv,_ZThn28_N3aaa9GG23321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332121E[];
Class_Descriptor cd__ZN3aaa9GG2332121E = {  "_ZN3aaa9GG2332121E", // class name
  bases__ZN3aaa9GG2332121E, 6,
  &(vtc__ZN3aaa9GG2332121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332122  : ::aaa::EE233 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23321223barEv
  ~GG2332122(); // tgen
  GG2332122(); // tgen
};
//SIG(1 _ZN3aaa9GG2332122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23321223barEv");}
aaa::GG2332122 ::~GG2332122(){ note_dtor("_ZN3aaa9GG2332122E", this);} // tgen
aaa::GG2332122 ::GG2332122(){ note_ctor("_ZN3aaa9GG2332122E", this);} // tgen
}
static void Test__ZN3aaa9GG2332122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332122E, buf);
    ::aaa::GG2332122 *dp, &lv = *(dp=new (buf) ::aaa::GG2332122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332122E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2332122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2332122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2332122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332122E);
    dp->::aaa::GG2332122::~GG2332122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332122E(Test__ZN3aaa9GG2332122E, "_ZN3aaa9GG2332122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332122C1Ev();
extern void _ZN3aaa9GG2332122D1Ev();
Name_Map name_map__ZN3aaa9GG2332122E[] = {
  NSPAIR(_ZN3aaa9GG2332122C1Ev),
  NSPAIR(_ZN3aaa9GG2332122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2332122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332122E[];
extern void _ZN3aaa9GG23321223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23321223barEv,_ZThn8_N3aaa9GG23321223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23321223barEv,_ZThn20_N3aaa9GG23321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23321223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321223barEv,_ZThn8_N3aaa9GG23321223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321223barEv,_ZThn20_N3aaa9GG23321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332122E[];
Class_Descriptor cd__ZN3aaa9GG2332122E = {  "_ZN3aaa9GG2332122E", // class name
  bases__ZN3aaa9GG2332122E, 6,
  &(vtc__ZN3aaa9GG2332122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332123  : ::aaa::EE233 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23321233fooEv
  virtual void  bar(); // _ZN3aaa9GG23321233barEv
  ~GG2332123(); // tgen
  GG2332123(); // tgen
};
//SIG(1 _ZN3aaa9GG2332123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23321233fooEv");}
void  aaa::GG2332123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23321233barEv");}
aaa::GG2332123 ::~GG2332123(){ note_dtor("_ZN3aaa9GG2332123E", this);} // tgen
aaa::GG2332123 ::GG2332123(){ note_ctor("_ZN3aaa9GG2332123E", this);} // tgen
}
static void Test__ZN3aaa9GG2332123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332123E, buf);
    ::aaa::GG2332123 *dp, &lv = *(dp=new (buf) ::aaa::GG2332123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332123E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2332123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG2332123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG2332123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332123E);
    dp->::aaa::GG2332123::~GG2332123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332123E(Test__ZN3aaa9GG2332123E, "_ZN3aaa9GG2332123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332123C1Ev();
extern void _ZN3aaa9GG2332123D1Ev();
Name_Map name_map__ZN3aaa9GG2332123E[] = {
  NSPAIR(_ZN3aaa9GG2332123C1Ev),
  NSPAIR(_ZN3aaa9GG2332123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG2332123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332123E[];
extern void _ZN3aaa9GG23321233barEv();
extern void _ZN3aaa9GG23321233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23321233fooEv,_ZThn8_N3aaa9GG23321233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23321233barEv,_ZThn8_N3aaa9GG23321233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23321233barEv,_ZThn20_N3aaa9GG23321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23321233fooEv,_ZThn28_N3aaa9GG23321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23321233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23321233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321233fooEv,_ZThn8_N3aaa9GG23321233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321233barEv,_ZThn8_N3aaa9GG23321233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321233barEv,_ZThn20_N3aaa9GG23321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23321233fooEv,_ZThn28_N3aaa9GG23321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332123E[];
Class_Descriptor cd__ZN3aaa9GG2332123E = {  "_ZN3aaa9GG2332123E", // class name
  bases__ZN3aaa9GG2332123E, 6,
  &(vtc__ZN3aaa9GG2332123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332131  : ::aaa::EE233 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23321313fooEv
  ~GG2332131(); // tgen
  GG2332131(); // tgen
};
//SIG(1 _ZN3aaa9GG2332131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23321313fooEv");}
aaa::GG2332131 ::~GG2332131(){ note_dtor("_ZN3aaa9GG2332131E", this);} // tgen
aaa::GG2332131 ::GG2332131(){ note_ctor("_ZN3aaa9GG2332131E", this);} // tgen
}
static void Test__ZN3aaa9GG2332131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332131E, buf);
    ::aaa::GG2332131 *dp, &lv = *(dp=new (buf) ::aaa::GG2332131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332131E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2332131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2332131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2332131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332131E);
    dp->::aaa::GG2332131::~GG2332131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332131E(Test__ZN3aaa9GG2332131E, "_ZN3aaa9GG2332131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332131C1Ev();
extern void _ZN3aaa9GG2332131D1Ev();
Name_Map name_map__ZN3aaa9GG2332131E[] = {
  NSPAIR(_ZN3aaa9GG2332131C1Ev),
  NSPAIR(_ZN3aaa9GG2332131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2332131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332131E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23321313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23321313fooEv,_ZThn8_N3aaa9GG23321313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23321313fooEv,_ZThn20_N3aaa9GG23321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23321313fooEv,_ZThn28_N3aaa9GG23321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23321313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321313fooEv,_ZThn8_N3aaa9GG23321313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321313fooEv,_ZThn20_N3aaa9GG23321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23321313fooEv,_ZThn28_N3aaa9GG23321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332131E[];
Class_Descriptor cd__ZN3aaa9GG2332131E = {  "_ZN3aaa9GG2332131E", // class name
  bases__ZN3aaa9GG2332131E, 6,
  &(vtc__ZN3aaa9GG2332131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332132  : ::aaa::EE233 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23321323barEv
  ~GG2332132(); // tgen
  GG2332132(); // tgen
};
//SIG(1 _ZN3aaa9GG2332132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23321323barEv");}
aaa::GG2332132 ::~GG2332132(){ note_dtor("_ZN3aaa9GG2332132E", this);} // tgen
aaa::GG2332132 ::GG2332132(){ note_ctor("_ZN3aaa9GG2332132E", this);} // tgen
}
static void Test__ZN3aaa9GG2332132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332132E, buf);
    ::aaa::GG2332132 *dp, &lv = *(dp=new (buf) ::aaa::GG2332132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332132E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2332132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2332132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2332132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332132E);
    dp->::aaa::GG2332132::~GG2332132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332132E(Test__ZN3aaa9GG2332132E, "_ZN3aaa9GG2332132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332132C1Ev();
extern void _ZN3aaa9GG2332132D1Ev();
Name_Map name_map__ZN3aaa9GG2332132E[] = {
  NSPAIR(_ZN3aaa9GG2332132C1Ev),
  NSPAIR(_ZN3aaa9GG2332132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2332132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332132E[];
extern void _ZN3aaa9GG23321323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23321323barEv,_ZThn8_N3aaa9GG23321323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23321323barEv,_ZThn20_N3aaa9GG23321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23321323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321323barEv,_ZThn8_N3aaa9GG23321323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321323barEv,_ZThn20_N3aaa9GG23321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332132E[];
Class_Descriptor cd__ZN3aaa9GG2332132E = {  "_ZN3aaa9GG2332132E", // class name
  bases__ZN3aaa9GG2332132E, 6,
  &(vtc__ZN3aaa9GG2332132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332133  : ::aaa::EE233 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23321333fooEv
  virtual void  bar(); // _ZN3aaa9GG23321333barEv
  ~GG2332133(); // tgen
  GG2332133(); // tgen
};
//SIG(1 _ZN3aaa9GG2332133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23321333fooEv");}
void  aaa::GG2332133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23321333barEv");}
aaa::GG2332133 ::~GG2332133(){ note_dtor("_ZN3aaa9GG2332133E", this);} // tgen
aaa::GG2332133 ::GG2332133(){ note_ctor("_ZN3aaa9GG2332133E", this);} // tgen
}
static void Test__ZN3aaa9GG2332133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332133E, buf);
    ::aaa::GG2332133 *dp, &lv = *(dp=new (buf) ::aaa::GG2332133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332133E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2332133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG2332133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG2332133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332133E);
    dp->::aaa::GG2332133::~GG2332133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332133E(Test__ZN3aaa9GG2332133E, "_ZN3aaa9GG2332133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332133C1Ev();
extern void _ZN3aaa9GG2332133D1Ev();
Name_Map name_map__ZN3aaa9GG2332133E[] = {
  NSPAIR(_ZN3aaa9GG2332133C1Ev),
  NSPAIR(_ZN3aaa9GG2332133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG2332133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332133E[];
extern void _ZN3aaa9GG23321333barEv();
extern void _ZN3aaa9GG23321333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23321333fooEv,_ZThn8_N3aaa9GG23321333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23321333barEv,_ZThn8_N3aaa9GG23321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23321333barEv,_ZThn20_N3aaa9GG23321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23321333fooEv,_ZThn20_N3aaa9GG23321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23321333fooEv,_ZThn28_N3aaa9GG23321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23321333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23321333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321333fooEv,_ZThn8_N3aaa9GG23321333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23321333barEv,_ZThn8_N3aaa9GG23321333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321333barEv,_ZThn20_N3aaa9GG23321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23321333fooEv,_ZThn20_N3aaa9GG23321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23321333fooEv,_ZThn28_N3aaa9GG23321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332133E[];
Class_Descriptor cd__ZN3aaa9GG2332133E = {  "_ZN3aaa9GG2332133E", // class name
  bases__ZN3aaa9GG2332133E, 6,
  &(vtc__ZN3aaa9GG2332133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332211  : ::aaa::EE233 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23322113fooEv
  ~GG2332211(); // tgen
  GG2332211(); // tgen
};
//SIG(1 _ZN3aaa9GG2332211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23322113fooEv");}
aaa::GG2332211 ::~GG2332211(){ note_dtor("_ZN3aaa9GG2332211E", this);} // tgen
aaa::GG2332211 ::GG2332211(){ note_ctor("_ZN3aaa9GG2332211E", this);} // tgen
}
static void Test__ZN3aaa9GG2332211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332211E, buf);
    ::aaa::GG2332211 *dp, &lv = *(dp=new (buf) ::aaa::GG2332211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332211E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2332211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2332211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2332211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332211E);
    dp->::aaa::GG2332211::~GG2332211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332211E(Test__ZN3aaa9GG2332211E, "_ZN3aaa9GG2332211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332211C1Ev();
extern void _ZN3aaa9GG2332211D1Ev();
Name_Map name_map__ZN3aaa9GG2332211E[] = {
  NSPAIR(_ZN3aaa9GG2332211C1Ev),
  NSPAIR(_ZN3aaa9GG2332211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2332211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332211E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23322113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23322113fooEv,_ZThn8_N3aaa9GG23322113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23322113fooEv,_ZThn20_N3aaa9GG23322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23322113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322113fooEv,_ZThn8_N3aaa9GG23322113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322113fooEv,_ZThn20_N3aaa9GG23322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332211E[];
Class_Descriptor cd__ZN3aaa9GG2332211E = {  "_ZN3aaa9GG2332211E", // class name
  bases__ZN3aaa9GG2332211E, 6,
  &(vtc__ZN3aaa9GG2332211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332212  : ::aaa::EE233 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23322123barEv
  ~GG2332212(); // tgen
  GG2332212(); // tgen
};
//SIG(1 _ZN3aaa9GG2332212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23322123barEv");}
aaa::GG2332212 ::~GG2332212(){ note_dtor("_ZN3aaa9GG2332212E", this);} // tgen
aaa::GG2332212 ::GG2332212(){ note_ctor("_ZN3aaa9GG2332212E", this);} // tgen
}
static void Test__ZN3aaa9GG2332212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332212E, buf);
    ::aaa::GG2332212 *dp, &lv = *(dp=new (buf) ::aaa::GG2332212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332212E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2332212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2332212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2332212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332212E);
    dp->::aaa::GG2332212::~GG2332212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332212E(Test__ZN3aaa9GG2332212E, "_ZN3aaa9GG2332212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332212C1Ev();
extern void _ZN3aaa9GG2332212D1Ev();
Name_Map name_map__ZN3aaa9GG2332212E[] = {
  NSPAIR(_ZN3aaa9GG2332212C1Ev),
  NSPAIR(_ZN3aaa9GG2332212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2332212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332212E[];
extern void _ZN3aaa9GG23322123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23322123barEv,_ZThn8_N3aaa9GG23322123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23322123barEv,_ZThn20_N3aaa9GG23322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23322123barEv,_ZThn28_N3aaa9GG23322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23322123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322123barEv,_ZThn8_N3aaa9GG23322123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322123barEv,_ZThn20_N3aaa9GG23322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23322123barEv,_ZThn28_N3aaa9GG23322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332212E[];
Class_Descriptor cd__ZN3aaa9GG2332212E = {  "_ZN3aaa9GG2332212E", // class name
  bases__ZN3aaa9GG2332212E, 6,
  &(vtc__ZN3aaa9GG2332212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332213  : ::aaa::EE233 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23322133fooEv
  virtual void  bar(); // _ZN3aaa9GG23322133barEv
  ~GG2332213(); // tgen
  GG2332213(); // tgen
};
//SIG(1 _ZN3aaa9GG2332213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23322133fooEv");}
void  aaa::GG2332213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23322133barEv");}
aaa::GG2332213 ::~GG2332213(){ note_dtor("_ZN3aaa9GG2332213E", this);} // tgen
aaa::GG2332213 ::GG2332213(){ note_ctor("_ZN3aaa9GG2332213E", this);} // tgen
}
static void Test__ZN3aaa9GG2332213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332213E, buf);
    ::aaa::GG2332213 *dp, &lv = *(dp=new (buf) ::aaa::GG2332213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332213E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2332213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG2332213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG2332213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332213E);
    dp->::aaa::GG2332213::~GG2332213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332213E(Test__ZN3aaa9GG2332213E, "_ZN3aaa9GG2332213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332213C1Ev();
extern void _ZN3aaa9GG2332213D1Ev();
Name_Map name_map__ZN3aaa9GG2332213E[] = {
  NSPAIR(_ZN3aaa9GG2332213C1Ev),
  NSPAIR(_ZN3aaa9GG2332213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG2332213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332213E[];
extern void _ZN3aaa9GG23322133barEv();
extern void _ZN3aaa9GG23322133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23322133fooEv,_ZThn8_N3aaa9GG23322133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23322133barEv,_ZThn8_N3aaa9GG23322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23322133barEv,_ZThn20_N3aaa9GG23322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23322133fooEv,_ZThn20_N3aaa9GG23322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23322133barEv,_ZThn28_N3aaa9GG23322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23322133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23322133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322133fooEv,_ZThn8_N3aaa9GG23322133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322133barEv,_ZThn8_N3aaa9GG23322133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322133barEv,_ZThn20_N3aaa9GG23322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322133fooEv,_ZThn20_N3aaa9GG23322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23322133barEv,_ZThn28_N3aaa9GG23322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332213E[];
Class_Descriptor cd__ZN3aaa9GG2332213E = {  "_ZN3aaa9GG2332213E", // class name
  bases__ZN3aaa9GG2332213E, 6,
  &(vtc__ZN3aaa9GG2332213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332221  : ::aaa::EE233 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23322213fooEv
  ~GG2332221(); // tgen
  GG2332221(); // tgen
};
//SIG(1 _ZN3aaa9GG2332221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23322213fooEv");}
aaa::GG2332221 ::~GG2332221(){ note_dtor("_ZN3aaa9GG2332221E", this);} // tgen
aaa::GG2332221 ::GG2332221(){ note_ctor("_ZN3aaa9GG2332221E", this);} // tgen
}
static void Test__ZN3aaa9GG2332221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332221E, buf);
    ::aaa::GG2332221 *dp, &lv = *(dp=new (buf) ::aaa::GG2332221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332221E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2332221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2332221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2332221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332221E);
    dp->::aaa::GG2332221::~GG2332221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332221E(Test__ZN3aaa9GG2332221E, "_ZN3aaa9GG2332221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332221C1Ev();
extern void _ZN3aaa9GG2332221D1Ev();
Name_Map name_map__ZN3aaa9GG2332221E[] = {
  NSPAIR(_ZN3aaa9GG2332221C1Ev),
  NSPAIR(_ZN3aaa9GG2332221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2332221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332221E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23322213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23322213fooEv,_ZThn8_N3aaa9GG23322213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23322213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322213fooEv,_ZThn8_N3aaa9GG23322213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332221E[];
Class_Descriptor cd__ZN3aaa9GG2332221E = {  "_ZN3aaa9GG2332221E", // class name
  bases__ZN3aaa9GG2332221E, 6,
  &(vtc__ZN3aaa9GG2332221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332222  : ::aaa::EE233 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23322223barEv
  ~GG2332222(); // tgen
  GG2332222(); // tgen
};
//SIG(1 _ZN3aaa9GG2332222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23322223barEv");}
aaa::GG2332222 ::~GG2332222(){ note_dtor("_ZN3aaa9GG2332222E", this);} // tgen
aaa::GG2332222 ::GG2332222(){ note_ctor("_ZN3aaa9GG2332222E", this);} // tgen
}
static void Test__ZN3aaa9GG2332222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332222E, buf);
    ::aaa::GG2332222 *dp, &lv = *(dp=new (buf) ::aaa::GG2332222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332222E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2332222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2332222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2332222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332222E);
    dp->::aaa::GG2332222::~GG2332222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332222E(Test__ZN3aaa9GG2332222E, "_ZN3aaa9GG2332222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332222C1Ev();
extern void _ZN3aaa9GG2332222D1Ev();
Name_Map name_map__ZN3aaa9GG2332222E[] = {
  NSPAIR(_ZN3aaa9GG2332222C1Ev),
  NSPAIR(_ZN3aaa9GG2332222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2332222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332222E[];
extern void _ZN3aaa9GG23322223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23322223barEv,_ZThn8_N3aaa9GG23322223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23322223barEv,_ZThn20_N3aaa9GG23322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23322223barEv,_ZThn28_N3aaa9GG23322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23322223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322223barEv,_ZThn8_N3aaa9GG23322223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322223barEv,_ZThn20_N3aaa9GG23322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23322223barEv,_ZThn28_N3aaa9GG23322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332222E[];
Class_Descriptor cd__ZN3aaa9GG2332222E = {  "_ZN3aaa9GG2332222E", // class name
  bases__ZN3aaa9GG2332222E, 6,
  &(vtc__ZN3aaa9GG2332222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332223  : ::aaa::EE233 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23322233fooEv
  virtual void  bar(); // _ZN3aaa9GG23322233barEv
  ~GG2332223(); // tgen
  GG2332223(); // tgen
};
//SIG(1 _ZN3aaa9GG2332223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23322233fooEv");}
void  aaa::GG2332223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23322233barEv");}
aaa::GG2332223 ::~GG2332223(){ note_dtor("_ZN3aaa9GG2332223E", this);} // tgen
aaa::GG2332223 ::GG2332223(){ note_ctor("_ZN3aaa9GG2332223E", this);} // tgen
}
static void Test__ZN3aaa9GG2332223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332223E, buf);
    ::aaa::GG2332223 *dp, &lv = *(dp=new (buf) ::aaa::GG2332223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332223E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2332223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG2332223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG2332223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332223E);
    dp->::aaa::GG2332223::~GG2332223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332223E(Test__ZN3aaa9GG2332223E, "_ZN3aaa9GG2332223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332223C1Ev();
extern void _ZN3aaa9GG2332223D1Ev();
Name_Map name_map__ZN3aaa9GG2332223E[] = {
  NSPAIR(_ZN3aaa9GG2332223C1Ev),
  NSPAIR(_ZN3aaa9GG2332223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG2332223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332223E[];
extern void _ZN3aaa9GG23322233barEv();
extern void _ZN3aaa9GG23322233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23322233fooEv,_ZThn8_N3aaa9GG23322233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23322233barEv,_ZThn8_N3aaa9GG23322233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23322233barEv,_ZThn20_N3aaa9GG23322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23322233barEv,_ZThn28_N3aaa9GG23322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23322233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23322233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322233fooEv,_ZThn8_N3aaa9GG23322233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322233barEv,_ZThn8_N3aaa9GG23322233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322233barEv,_ZThn20_N3aaa9GG23322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23322233barEv,_ZThn28_N3aaa9GG23322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332223E[];
Class_Descriptor cd__ZN3aaa9GG2332223E = {  "_ZN3aaa9GG2332223E", // class name
  bases__ZN3aaa9GG2332223E, 6,
  &(vtc__ZN3aaa9GG2332223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332231  : ::aaa::EE233 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23322313fooEv
  ~GG2332231(); // tgen
  GG2332231(); // tgen
};
//SIG(1 _ZN3aaa9GG2332231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23322313fooEv");}
aaa::GG2332231 ::~GG2332231(){ note_dtor("_ZN3aaa9GG2332231E", this);} // tgen
aaa::GG2332231 ::GG2332231(){ note_ctor("_ZN3aaa9GG2332231E", this);} // tgen
}
static void Test__ZN3aaa9GG2332231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332231E, buf);
    ::aaa::GG2332231 *dp, &lv = *(dp=new (buf) ::aaa::GG2332231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332231E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2332231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2332231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2332231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332231E);
    dp->::aaa::GG2332231::~GG2332231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332231E(Test__ZN3aaa9GG2332231E, "_ZN3aaa9GG2332231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332231C1Ev();
extern void _ZN3aaa9GG2332231D1Ev();
Name_Map name_map__ZN3aaa9GG2332231E[] = {
  NSPAIR(_ZN3aaa9GG2332231C1Ev),
  NSPAIR(_ZN3aaa9GG2332231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2332231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332231E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23322313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23322313fooEv,_ZThn8_N3aaa9GG23322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23322313fooEv,_ZThn20_N3aaa9GG23322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23322313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322313fooEv,_ZThn8_N3aaa9GG23322313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322313fooEv,_ZThn20_N3aaa9GG23322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332231E[];
Class_Descriptor cd__ZN3aaa9GG2332231E = {  "_ZN3aaa9GG2332231E", // class name
  bases__ZN3aaa9GG2332231E, 6,
  &(vtc__ZN3aaa9GG2332231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332232  : ::aaa::EE233 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23322323barEv
  ~GG2332232(); // tgen
  GG2332232(); // tgen
};
//SIG(1 _ZN3aaa9GG2332232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23322323barEv");}
aaa::GG2332232 ::~GG2332232(){ note_dtor("_ZN3aaa9GG2332232E", this);} // tgen
aaa::GG2332232 ::GG2332232(){ note_ctor("_ZN3aaa9GG2332232E", this);} // tgen
}
static void Test__ZN3aaa9GG2332232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332232E, buf);
    ::aaa::GG2332232 *dp, &lv = *(dp=new (buf) ::aaa::GG2332232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332232E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2332232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2332232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2332232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332232E);
    dp->::aaa::GG2332232::~GG2332232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332232E(Test__ZN3aaa9GG2332232E, "_ZN3aaa9GG2332232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332232C1Ev();
extern void _ZN3aaa9GG2332232D1Ev();
Name_Map name_map__ZN3aaa9GG2332232E[] = {
  NSPAIR(_ZN3aaa9GG2332232C1Ev),
  NSPAIR(_ZN3aaa9GG2332232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2332232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332232E[];
extern void _ZN3aaa9GG23322323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23322323barEv,_ZThn8_N3aaa9GG23322323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23322323barEv,_ZThn20_N3aaa9GG23322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23322323barEv,_ZThn28_N3aaa9GG23322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23322323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322323barEv,_ZThn8_N3aaa9GG23322323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322323barEv,_ZThn20_N3aaa9GG23322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23322323barEv,_ZThn28_N3aaa9GG23322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332232E[];
Class_Descriptor cd__ZN3aaa9GG2332232E = {  "_ZN3aaa9GG2332232E", // class name
  bases__ZN3aaa9GG2332232E, 6,
  &(vtc__ZN3aaa9GG2332232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332233  : ::aaa::EE233 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23322333fooEv
  virtual void  bar(); // _ZN3aaa9GG23322333barEv
  ~GG2332233(); // tgen
  GG2332233(); // tgen
};
//SIG(1 _ZN3aaa9GG2332233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23322333fooEv");}
void  aaa::GG2332233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23322333barEv");}
aaa::GG2332233 ::~GG2332233(){ note_dtor("_ZN3aaa9GG2332233E", this);} // tgen
aaa::GG2332233 ::GG2332233(){ note_ctor("_ZN3aaa9GG2332233E", this);} // tgen
}
static void Test__ZN3aaa9GG2332233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332233E, buf);
    ::aaa::GG2332233 *dp, &lv = *(dp=new (buf) ::aaa::GG2332233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332233E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2332233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG2332233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG2332233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332233E);
    dp->::aaa::GG2332233::~GG2332233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332233E(Test__ZN3aaa9GG2332233E, "_ZN3aaa9GG2332233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332233C1Ev();
extern void _ZN3aaa9GG2332233D1Ev();
Name_Map name_map__ZN3aaa9GG2332233E[] = {
  NSPAIR(_ZN3aaa9GG2332233C1Ev),
  NSPAIR(_ZN3aaa9GG2332233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG2332233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332233E[];
extern void _ZN3aaa9GG23322333barEv();
extern void _ZN3aaa9GG23322333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23322333fooEv,_ZThn8_N3aaa9GG23322333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23322333barEv,_ZThn8_N3aaa9GG23322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23322333barEv,_ZThn20_N3aaa9GG23322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23322333fooEv,_ZThn20_N3aaa9GG23322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23322333barEv,_ZThn28_N3aaa9GG23322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23322333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23322333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322333fooEv,_ZThn8_N3aaa9GG23322333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23322333barEv,_ZThn8_N3aaa9GG23322333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322333barEv,_ZThn20_N3aaa9GG23322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23322333fooEv,_ZThn20_N3aaa9GG23322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23322333barEv,_ZThn28_N3aaa9GG23322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332233E[];
Class_Descriptor cd__ZN3aaa9GG2332233E = {  "_ZN3aaa9GG2332233E", // class name
  bases__ZN3aaa9GG2332233E, 6,
  &(vtc__ZN3aaa9GG2332233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332311  : ::aaa::EE233 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23323113fooEv
  ~GG2332311(); // tgen
  GG2332311(); // tgen
};
//SIG(1 _ZN3aaa9GG2332311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23323113fooEv");}
aaa::GG2332311 ::~GG2332311(){ note_dtor("_ZN3aaa9GG2332311E", this);} // tgen
aaa::GG2332311 ::GG2332311(){ note_ctor("_ZN3aaa9GG2332311E", this);} // tgen
}
static void Test__ZN3aaa9GG2332311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332311E, buf);
    ::aaa::GG2332311 *dp, &lv = *(dp=new (buf) ::aaa::GG2332311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332311E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2332311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2332311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2332311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332311E);
    dp->::aaa::GG2332311::~GG2332311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332311E(Test__ZN3aaa9GG2332311E, "_ZN3aaa9GG2332311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332311C1Ev();
extern void _ZN3aaa9GG2332311D1Ev();
Name_Map name_map__ZN3aaa9GG2332311E[] = {
  NSPAIR(_ZN3aaa9GG2332311C1Ev),
  NSPAIR(_ZN3aaa9GG2332311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2332311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332311E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23323113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23323113fooEv,_ZThn8_N3aaa9GG23323113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23323113fooEv,_ZThn20_N3aaa9GG23323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323113fooEv,_ZThn28_N3aaa9GG23323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23323113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323113fooEv,_ZThn8_N3aaa9GG23323113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323113fooEv,_ZThn20_N3aaa9GG23323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323113fooEv,_ZThn28_N3aaa9GG23323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332311E[];
Class_Descriptor cd__ZN3aaa9GG2332311E = {  "_ZN3aaa9GG2332311E", // class name
  bases__ZN3aaa9GG2332311E, 6,
  &(vtc__ZN3aaa9GG2332311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332312  : ::aaa::EE233 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23323123barEv
  ~GG2332312(); // tgen
  GG2332312(); // tgen
};
//SIG(1 _ZN3aaa9GG2332312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23323123barEv");}
aaa::GG2332312 ::~GG2332312(){ note_dtor("_ZN3aaa9GG2332312E", this);} // tgen
aaa::GG2332312 ::GG2332312(){ note_ctor("_ZN3aaa9GG2332312E", this);} // tgen
}
static void Test__ZN3aaa9GG2332312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332312E, buf);
    ::aaa::GG2332312 *dp, &lv = *(dp=new (buf) ::aaa::GG2332312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332312E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2332312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2332312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2332312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332312E);
    dp->::aaa::GG2332312::~GG2332312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332312E(Test__ZN3aaa9GG2332312E, "_ZN3aaa9GG2332312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332312C1Ev();
extern void _ZN3aaa9GG2332312D1Ev();
Name_Map name_map__ZN3aaa9GG2332312E[] = {
  NSPAIR(_ZN3aaa9GG2332312C1Ev),
  NSPAIR(_ZN3aaa9GG2332312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2332312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332312E[];
extern void _ZN3aaa9GG23323123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23323123barEv,_ZThn8_N3aaa9GG23323123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23323123barEv,_ZThn20_N3aaa9GG23323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323123barEv,_ZThn28_N3aaa9GG23323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23323123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323123barEv,_ZThn8_N3aaa9GG23323123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323123barEv,_ZThn20_N3aaa9GG23323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323123barEv,_ZThn28_N3aaa9GG23323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332312E[];
Class_Descriptor cd__ZN3aaa9GG2332312E = {  "_ZN3aaa9GG2332312E", // class name
  bases__ZN3aaa9GG2332312E, 6,
  &(vtc__ZN3aaa9GG2332312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332313  : ::aaa::EE233 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23323133fooEv
  virtual void  bar(); // _ZN3aaa9GG23323133barEv
  ~GG2332313(); // tgen
  GG2332313(); // tgen
};
//SIG(1 _ZN3aaa9GG2332313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23323133fooEv");}
void  aaa::GG2332313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23323133barEv");}
aaa::GG2332313 ::~GG2332313(){ note_dtor("_ZN3aaa9GG2332313E", this);} // tgen
aaa::GG2332313 ::GG2332313(){ note_ctor("_ZN3aaa9GG2332313E", this);} // tgen
}
static void Test__ZN3aaa9GG2332313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332313E, buf);
    ::aaa::GG2332313 *dp, &lv = *(dp=new (buf) ::aaa::GG2332313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332313E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2332313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG2332313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG2332313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332313E);
    dp->::aaa::GG2332313::~GG2332313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332313E(Test__ZN3aaa9GG2332313E, "_ZN3aaa9GG2332313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332313C1Ev();
extern void _ZN3aaa9GG2332313D1Ev();
Name_Map name_map__ZN3aaa9GG2332313E[] = {
  NSPAIR(_ZN3aaa9GG2332313C1Ev),
  NSPAIR(_ZN3aaa9GG2332313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG2332313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332313E[];
extern void _ZN3aaa9GG23323133barEv();
extern void _ZN3aaa9GG23323133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23323133fooEv,_ZThn8_N3aaa9GG23323133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23323133barEv,_ZThn8_N3aaa9GG23323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23323133barEv,_ZThn20_N3aaa9GG23323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23323133fooEv,_ZThn20_N3aaa9GG23323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323133fooEv,_ZThn28_N3aaa9GG23323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323133barEv,_ZThn28_N3aaa9GG23323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23323133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23323133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323133fooEv,_ZThn8_N3aaa9GG23323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323133barEv,_ZThn8_N3aaa9GG23323133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323133barEv,_ZThn20_N3aaa9GG23323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323133fooEv,_ZThn20_N3aaa9GG23323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323133fooEv,_ZThn28_N3aaa9GG23323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323133barEv,_ZThn28_N3aaa9GG23323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332313E[];
Class_Descriptor cd__ZN3aaa9GG2332313E = {  "_ZN3aaa9GG2332313E", // class name
  bases__ZN3aaa9GG2332313E, 6,
  &(vtc__ZN3aaa9GG2332313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332321  : ::aaa::EE233 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23323213fooEv
  ~GG2332321(); // tgen
  GG2332321(); // tgen
};
//SIG(1 _ZN3aaa9GG2332321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23323213fooEv");}
aaa::GG2332321 ::~GG2332321(){ note_dtor("_ZN3aaa9GG2332321E", this);} // tgen
aaa::GG2332321 ::GG2332321(){ note_ctor("_ZN3aaa9GG2332321E", this);} // tgen
}
static void Test__ZN3aaa9GG2332321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332321E, buf);
    ::aaa::GG2332321 *dp, &lv = *(dp=new (buf) ::aaa::GG2332321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332321E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2332321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2332321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2332321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332321E);
    dp->::aaa::GG2332321::~GG2332321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332321E(Test__ZN3aaa9GG2332321E, "_ZN3aaa9GG2332321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332321C1Ev();
extern void _ZN3aaa9GG2332321D1Ev();
Name_Map name_map__ZN3aaa9GG2332321E[] = {
  NSPAIR(_ZN3aaa9GG2332321C1Ev),
  NSPAIR(_ZN3aaa9GG2332321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2332321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332321E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23323213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23323213fooEv,_ZThn8_N3aaa9GG23323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23323213fooEv,_ZThn28_N3aaa9GG23323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23323213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323213fooEv,_ZThn8_N3aaa9GG23323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323213fooEv,_ZThn28_N3aaa9GG23323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332321E[];
Class_Descriptor cd__ZN3aaa9GG2332321E = {  "_ZN3aaa9GG2332321E", // class name
  bases__ZN3aaa9GG2332321E, 6,
  &(vtc__ZN3aaa9GG2332321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332322  : ::aaa::EE233 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23323223barEv
  ~GG2332322(); // tgen
  GG2332322(); // tgen
};
//SIG(1 _ZN3aaa9GG2332322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23323223barEv");}
aaa::GG2332322 ::~GG2332322(){ note_dtor("_ZN3aaa9GG2332322E", this);} // tgen
aaa::GG2332322 ::GG2332322(){ note_ctor("_ZN3aaa9GG2332322E", this);} // tgen
}
static void Test__ZN3aaa9GG2332322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332322E, buf);
    ::aaa::GG2332322 *dp, &lv = *(dp=new (buf) ::aaa::GG2332322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332322E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2332322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2332322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2332322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332322E);
    dp->::aaa::GG2332322::~GG2332322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332322E(Test__ZN3aaa9GG2332322E, "_ZN3aaa9GG2332322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332322C1Ev();
extern void _ZN3aaa9GG2332322D1Ev();
Name_Map name_map__ZN3aaa9GG2332322E[] = {
  NSPAIR(_ZN3aaa9GG2332322C1Ev),
  NSPAIR(_ZN3aaa9GG2332322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2332322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332322E[];
extern void _ZN3aaa9GG23323223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23323223barEv,_ZThn8_N3aaa9GG23323223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23323223barEv,_ZThn20_N3aaa9GG23323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23323223barEv,_ZThn28_N3aaa9GG23323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23323223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323223barEv,_ZThn8_N3aaa9GG23323223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323223barEv,_ZThn20_N3aaa9GG23323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323223barEv,_ZThn28_N3aaa9GG23323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332322E[];
Class_Descriptor cd__ZN3aaa9GG2332322E = {  "_ZN3aaa9GG2332322E", // class name
  bases__ZN3aaa9GG2332322E, 6,
  &(vtc__ZN3aaa9GG2332322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332323  : ::aaa::EE233 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23323233fooEv
  virtual void  bar(); // _ZN3aaa9GG23323233barEv
  ~GG2332323(); // tgen
  GG2332323(); // tgen
};
//SIG(1 _ZN3aaa9GG2332323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23323233fooEv");}
void  aaa::GG2332323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23323233barEv");}
aaa::GG2332323 ::~GG2332323(){ note_dtor("_ZN3aaa9GG2332323E", this);} // tgen
aaa::GG2332323 ::GG2332323(){ note_ctor("_ZN3aaa9GG2332323E", this);} // tgen
}
static void Test__ZN3aaa9GG2332323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332323E, buf);
    ::aaa::GG2332323 *dp, &lv = *(dp=new (buf) ::aaa::GG2332323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332323E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2332323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG2332323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG2332323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332323E);
    dp->::aaa::GG2332323::~GG2332323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332323E(Test__ZN3aaa9GG2332323E, "_ZN3aaa9GG2332323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332323C1Ev();
extern void _ZN3aaa9GG2332323D1Ev();
Name_Map name_map__ZN3aaa9GG2332323E[] = {
  NSPAIR(_ZN3aaa9GG2332323C1Ev),
  NSPAIR(_ZN3aaa9GG2332323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG2332323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332323E[];
extern void _ZN3aaa9GG23323233barEv();
extern void _ZN3aaa9GG23323233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23323233fooEv,_ZThn8_N3aaa9GG23323233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23323233barEv,_ZThn8_N3aaa9GG23323233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23323233barEv,_ZThn20_N3aaa9GG23323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323233fooEv,_ZThn28_N3aaa9GG23323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323233barEv,_ZThn28_N3aaa9GG23323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23323233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23323233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323233fooEv,_ZThn8_N3aaa9GG23323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323233barEv,_ZThn8_N3aaa9GG23323233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323233barEv,_ZThn20_N3aaa9GG23323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323233fooEv,_ZThn28_N3aaa9GG23323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323233barEv,_ZThn28_N3aaa9GG23323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332323E[];
Class_Descriptor cd__ZN3aaa9GG2332323E = {  "_ZN3aaa9GG2332323E", // class name
  bases__ZN3aaa9GG2332323E, 6,
  &(vtc__ZN3aaa9GG2332323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332331  : ::aaa::EE233 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23323313fooEv
  ~GG2332331(); // tgen
  GG2332331(); // tgen
};
//SIG(1 _ZN3aaa9GG2332331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23323313fooEv");}
aaa::GG2332331 ::~GG2332331(){ note_dtor("_ZN3aaa9GG2332331E", this);} // tgen
aaa::GG2332331 ::GG2332331(){ note_ctor("_ZN3aaa9GG2332331E", this);} // tgen
}
static void Test__ZN3aaa9GG2332331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332331E, buf);
    ::aaa::GG2332331 *dp, &lv = *(dp=new (buf) ::aaa::GG2332331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332331E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2332331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2332331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2332331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332331E);
    dp->::aaa::GG2332331::~GG2332331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332331E(Test__ZN3aaa9GG2332331E, "_ZN3aaa9GG2332331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332331C1Ev();
extern void _ZN3aaa9GG2332331D1Ev();
Name_Map name_map__ZN3aaa9GG2332331E[] = {
  NSPAIR(_ZN3aaa9GG2332331C1Ev),
  NSPAIR(_ZN3aaa9GG2332331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2332331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332331E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23323313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23323313fooEv,_ZThn8_N3aaa9GG23323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23323313fooEv,_ZThn20_N3aaa9GG23323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323313fooEv,_ZThn28_N3aaa9GG23323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23323313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323313fooEv,_ZThn8_N3aaa9GG23323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323313fooEv,_ZThn20_N3aaa9GG23323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323313fooEv,_ZThn28_N3aaa9GG23323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332331E[];
Class_Descriptor cd__ZN3aaa9GG2332331E = {  "_ZN3aaa9GG2332331E", // class name
  bases__ZN3aaa9GG2332331E, 6,
  &(vtc__ZN3aaa9GG2332331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332332  : ::aaa::EE233 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23323323barEv
  ~GG2332332(); // tgen
  GG2332332(); // tgen
};
//SIG(1 _ZN3aaa9GG2332332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2332332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23323323barEv");}
aaa::GG2332332 ::~GG2332332(){ note_dtor("_ZN3aaa9GG2332332E", this);} // tgen
aaa::GG2332332 ::GG2332332(){ note_ctor("_ZN3aaa9GG2332332E", this);} // tgen
}
static void Test__ZN3aaa9GG2332332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332332E, buf);
    ::aaa::GG2332332 *dp, &lv = *(dp=new (buf) ::aaa::GG2332332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332332E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2332332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2332332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2332332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332332E);
    dp->::aaa::GG2332332::~GG2332332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332332E(Test__ZN3aaa9GG2332332E, "_ZN3aaa9GG2332332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332332C1Ev();
extern void _ZN3aaa9GG2332332D1Ev();
Name_Map name_map__ZN3aaa9GG2332332E[] = {
  NSPAIR(_ZN3aaa9GG2332332C1Ev),
  NSPAIR(_ZN3aaa9GG2332332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2332332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332332E[];
extern void _ZN3aaa9GG23323323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23323323barEv,_ZThn8_N3aaa9GG23323323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23323323barEv,_ZThn20_N3aaa9GG23323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323323barEv,_ZThn28_N3aaa9GG23323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23323323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323323barEv,_ZThn8_N3aaa9GG23323323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323323barEv,_ZThn20_N3aaa9GG23323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323323barEv,_ZThn28_N3aaa9GG23323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332332E[];
Class_Descriptor cd__ZN3aaa9GG2332332E = {  "_ZN3aaa9GG2332332E", // class name
  bases__ZN3aaa9GG2332332E, 6,
  &(vtc__ZN3aaa9GG2332332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2332333  : ::aaa::EE233 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23323333fooEv
  virtual void  bar(); // _ZN3aaa9GG23323333barEv
  ~GG2332333(); // tgen
  GG2332333(); // tgen
};
//SIG(1 _ZN3aaa9GG2332333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2332333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23323333fooEv");}
void  aaa::GG2332333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23323333barEv");}
aaa::GG2332333 ::~GG2332333(){ note_dtor("_ZN3aaa9GG2332333E", this);} // tgen
aaa::GG2332333 ::GG2332333(){ note_ctor("_ZN3aaa9GG2332333E", this);} // tgen
}
static void Test__ZN3aaa9GG2332333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2332333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2332333E, buf);
    ::aaa::GG2332333 *dp, &lv = *(dp=new (buf) ::aaa::GG2332333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2332333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2332333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2332333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2332333E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2332333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2332333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG2332333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG2332333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2332333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2332333E);
    dp->::aaa::GG2332333::~GG2332333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2332333E(Test__ZN3aaa9GG2332333E, "_ZN3aaa9GG2332333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2332333C1Ev();
extern void _ZN3aaa9GG2332333D1Ev();
Name_Map name_map__ZN3aaa9GG2332333E[] = {
  NSPAIR(_ZN3aaa9GG2332333C1Ev),
  NSPAIR(_ZN3aaa9GG2332333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG2332333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2332333E[];
extern void _ZN3aaa9GG23323333barEv();
extern void _ZN3aaa9GG23323333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23323333fooEv,_ZThn8_N3aaa9GG23323333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23323333barEv,_ZThn8_N3aaa9GG23323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23323333barEv,_ZThn20_N3aaa9GG23323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23323333fooEv,_ZThn20_N3aaa9GG23323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323333fooEv,_ZThn28_N3aaa9GG23323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23323333barEv,_ZThn28_N3aaa9GG23323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2332333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23323333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23323333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323333fooEv,_ZThn8_N3aaa9GG23323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23323333barEv,_ZThn8_N3aaa9GG23323333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323333barEv,_ZThn20_N3aaa9GG23323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23323333fooEv,_ZThn20_N3aaa9GG23323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323333fooEv,_ZThn28_N3aaa9GG23323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23323333barEv,_ZThn28_N3aaa9GG23323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2332333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2332333E[];
Class_Descriptor cd__ZN3aaa9GG2332333E = {  "_ZN3aaa9GG2332333E", // class name
  bases__ZN3aaa9GG2332333E, 6,
  &(vtc__ZN3aaa9GG2332333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2332333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2332333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333111  : ::aaa::EE233 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23331113fooEv
  ~GG2333111(); // tgen
  GG2333111(); // tgen
};
//SIG(1 _ZN3aaa9GG2333111E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333111 ::foo(){vfunc_called(this, "_ZN3aaa9GG23331113fooEv");}
aaa::GG2333111 ::~GG2333111(){ note_dtor("_ZN3aaa9GG2333111E", this);} // tgen
aaa::GG2333111 ::GG2333111(){ note_ctor("_ZN3aaa9GG2333111E", this);} // tgen
}
static void Test__ZN3aaa9GG2333111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333111E, buf);
    ::aaa::GG2333111 *dp, &lv = *(dp=new (buf) ::aaa::GG2333111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333111E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333111E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2333111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2333111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2333111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333111E);
    dp->::aaa::GG2333111::~GG2333111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333111E(Test__ZN3aaa9GG2333111E, "_ZN3aaa9GG2333111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333111C1Ev();
extern void _ZN3aaa9GG2333111D1Ev();
Name_Map name_map__ZN3aaa9GG2333111E[] = {
  NSPAIR(_ZN3aaa9GG2333111C1Ev),
  NSPAIR(_ZN3aaa9GG2333111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2333111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333111E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23331113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23331113fooEv,_ZThn8_N3aaa9GG23331113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331113fooEv,_ZThn20_N3aaa9GG23331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23331113fooEv,_ZThn28_N3aaa9GG23331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333111E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23331113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331113fooEv,_ZThn8_N3aaa9GG23331113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331113fooEv,_ZThn20_N3aaa9GG23331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23331113fooEv,_ZThn28_N3aaa9GG23331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333111E[];
Class_Descriptor cd__ZN3aaa9GG2333111E = {  "_ZN3aaa9GG2333111E", // class name
  bases__ZN3aaa9GG2333111E, 6,
  &(vtc__ZN3aaa9GG2333111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333112  : ::aaa::EE233 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23331123barEv
  ~GG2333112(); // tgen
  GG2333112(); // tgen
};
//SIG(1 _ZN3aaa9GG2333112E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333112 ::bar(){vfunc_called(this, "_ZN3aaa9GG23331123barEv");}
aaa::GG2333112 ::~GG2333112(){ note_dtor("_ZN3aaa9GG2333112E", this);} // tgen
aaa::GG2333112 ::GG2333112(){ note_ctor("_ZN3aaa9GG2333112E", this);} // tgen
}
static void Test__ZN3aaa9GG2333112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333112E, buf);
    ::aaa::GG2333112 *dp, &lv = *(dp=new (buf) ::aaa::GG2333112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333112E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333112E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2333112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2333112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2333112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333112E);
    dp->::aaa::GG2333112::~GG2333112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333112E(Test__ZN3aaa9GG2333112E, "_ZN3aaa9GG2333112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333112C1Ev();
extern void _ZN3aaa9GG2333112D1Ev();
Name_Map name_map__ZN3aaa9GG2333112E[] = {
  NSPAIR(_ZN3aaa9GG2333112C1Ev),
  NSPAIR(_ZN3aaa9GG2333112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2333112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333112E[];
extern void _ZN3aaa9GG23331123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23331123barEv,_ZThn8_N3aaa9GG23331123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23331123barEv,_ZThn20_N3aaa9GG23331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333112E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23331123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331123barEv,_ZThn8_N3aaa9GG23331123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331123barEv,_ZThn20_N3aaa9GG23331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333112E[];
Class_Descriptor cd__ZN3aaa9GG2333112E = {  "_ZN3aaa9GG2333112E", // class name
  bases__ZN3aaa9GG2333112E, 6,
  &(vtc__ZN3aaa9GG2333112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333113  : ::aaa::EE233 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23331133fooEv
  virtual void  bar(); // _ZN3aaa9GG23331133barEv
  ~GG2333113(); // tgen
  GG2333113(); // tgen
};
//SIG(1 _ZN3aaa9GG2333113E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333113 ::foo(){vfunc_called(this, "_ZN3aaa9GG23331133fooEv");}
void  aaa::GG2333113 ::bar(){vfunc_called(this, "_ZN3aaa9GG23331133barEv");}
aaa::GG2333113 ::~GG2333113(){ note_dtor("_ZN3aaa9GG2333113E", this);} // tgen
aaa::GG2333113 ::GG2333113(){ note_ctor("_ZN3aaa9GG2333113E", this);} // tgen
}
static void Test__ZN3aaa9GG2333113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333113E, buf);
    ::aaa::GG2333113 *dp, &lv = *(dp=new (buf) ::aaa::GG2333113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333113E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333113E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2333113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG2333113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG2333113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333113E);
    dp->::aaa::GG2333113::~GG2333113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333113E(Test__ZN3aaa9GG2333113E, "_ZN3aaa9GG2333113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333113C1Ev();
extern void _ZN3aaa9GG2333113D1Ev();
Name_Map name_map__ZN3aaa9GG2333113E[] = {
  NSPAIR(_ZN3aaa9GG2333113C1Ev),
  NSPAIR(_ZN3aaa9GG2333113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG2333113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333113E[];
extern void _ZN3aaa9GG23331133barEv();
extern void _ZN3aaa9GG23331133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23331133fooEv,_ZThn8_N3aaa9GG23331133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23331133barEv,_ZThn8_N3aaa9GG23331133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331133fooEv,_ZThn20_N3aaa9GG23331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331133barEv,_ZThn20_N3aaa9GG23331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23331133fooEv,_ZThn28_N3aaa9GG23331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23331133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23331133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331133fooEv,_ZThn8_N3aaa9GG23331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331133barEv,_ZThn8_N3aaa9GG23331133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331133fooEv,_ZThn20_N3aaa9GG23331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331133barEv,_ZThn20_N3aaa9GG23331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23331133fooEv,_ZThn28_N3aaa9GG23331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333113E[];
Class_Descriptor cd__ZN3aaa9GG2333113E = {  "_ZN3aaa9GG2333113E", // class name
  bases__ZN3aaa9GG2333113E, 6,
  &(vtc__ZN3aaa9GG2333113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333121  : ::aaa::EE233 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23331213fooEv
  ~GG2333121(); // tgen
  GG2333121(); // tgen
};
//SIG(1 _ZN3aaa9GG2333121E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333121 ::foo(){vfunc_called(this, "_ZN3aaa9GG23331213fooEv");}
aaa::GG2333121 ::~GG2333121(){ note_dtor("_ZN3aaa9GG2333121E", this);} // tgen
aaa::GG2333121 ::GG2333121(){ note_ctor("_ZN3aaa9GG2333121E", this);} // tgen
}
static void Test__ZN3aaa9GG2333121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333121E, buf);
    ::aaa::GG2333121 *dp, &lv = *(dp=new (buf) ::aaa::GG2333121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333121E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333121E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2333121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2333121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2333121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333121E);
    dp->::aaa::GG2333121::~GG2333121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333121E(Test__ZN3aaa9GG2333121E, "_ZN3aaa9GG2333121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333121C1Ev();
extern void _ZN3aaa9GG2333121D1Ev();
Name_Map name_map__ZN3aaa9GG2333121E[] = {
  NSPAIR(_ZN3aaa9GG2333121C1Ev),
  NSPAIR(_ZN3aaa9GG2333121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2333121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333121E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23331213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23331213fooEv,_ZThn8_N3aaa9GG23331213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331213fooEv,_ZThn20_N3aaa9GG23331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23331213fooEv,_ZThn28_N3aaa9GG23331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23331213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331213fooEv,_ZThn8_N3aaa9GG23331213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331213fooEv,_ZThn20_N3aaa9GG23331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23331213fooEv,_ZThn28_N3aaa9GG23331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333121E[];
Class_Descriptor cd__ZN3aaa9GG2333121E = {  "_ZN3aaa9GG2333121E", // class name
  bases__ZN3aaa9GG2333121E, 6,
  &(vtc__ZN3aaa9GG2333121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333122  : ::aaa::EE233 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23331223barEv
  ~GG2333122(); // tgen
  GG2333122(); // tgen
};
//SIG(1 _ZN3aaa9GG2333122E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333122 ::bar(){vfunc_called(this, "_ZN3aaa9GG23331223barEv");}
aaa::GG2333122 ::~GG2333122(){ note_dtor("_ZN3aaa9GG2333122E", this);} // tgen
aaa::GG2333122 ::GG2333122(){ note_ctor("_ZN3aaa9GG2333122E", this);} // tgen
}
static void Test__ZN3aaa9GG2333122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333122E, buf);
    ::aaa::GG2333122 *dp, &lv = *(dp=new (buf) ::aaa::GG2333122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333122E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333122E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2333122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2333122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2333122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333122E);
    dp->::aaa::GG2333122::~GG2333122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333122E(Test__ZN3aaa9GG2333122E, "_ZN3aaa9GG2333122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333122C1Ev();
extern void _ZN3aaa9GG2333122D1Ev();
Name_Map name_map__ZN3aaa9GG2333122E[] = {
  NSPAIR(_ZN3aaa9GG2333122C1Ev),
  NSPAIR(_ZN3aaa9GG2333122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2333122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333122E[];
extern void _ZN3aaa9GG23331223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23331223barEv,_ZThn8_N3aaa9GG23331223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23331223barEv,_ZThn20_N3aaa9GG23331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23331223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331223barEv,_ZThn8_N3aaa9GG23331223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331223barEv,_ZThn20_N3aaa9GG23331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333122E[];
Class_Descriptor cd__ZN3aaa9GG2333122E = {  "_ZN3aaa9GG2333122E", // class name
  bases__ZN3aaa9GG2333122E, 6,
  &(vtc__ZN3aaa9GG2333122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333123  : ::aaa::EE233 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23331233fooEv
  virtual void  bar(); // _ZN3aaa9GG23331233barEv
  ~GG2333123(); // tgen
  GG2333123(); // tgen
};
//SIG(1 _ZN3aaa9GG2333123E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333123 ::foo(){vfunc_called(this, "_ZN3aaa9GG23331233fooEv");}
void  aaa::GG2333123 ::bar(){vfunc_called(this, "_ZN3aaa9GG23331233barEv");}
aaa::GG2333123 ::~GG2333123(){ note_dtor("_ZN3aaa9GG2333123E", this);} // tgen
aaa::GG2333123 ::GG2333123(){ note_ctor("_ZN3aaa9GG2333123E", this);} // tgen
}
static void Test__ZN3aaa9GG2333123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333123E, buf);
    ::aaa::GG2333123 *dp, &lv = *(dp=new (buf) ::aaa::GG2333123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333123E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333123E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2333123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG2333123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG2333123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333123E);
    dp->::aaa::GG2333123::~GG2333123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333123E(Test__ZN3aaa9GG2333123E, "_ZN3aaa9GG2333123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333123C1Ev();
extern void _ZN3aaa9GG2333123D1Ev();
Name_Map name_map__ZN3aaa9GG2333123E[] = {
  NSPAIR(_ZN3aaa9GG2333123C1Ev),
  NSPAIR(_ZN3aaa9GG2333123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG2333123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333123E[];
extern void _ZN3aaa9GG23331233barEv();
extern void _ZN3aaa9GG23331233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23331233fooEv,_ZThn8_N3aaa9GG23331233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23331233barEv,_ZThn8_N3aaa9GG23331233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331233fooEv,_ZThn20_N3aaa9GG23331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331233barEv,_ZThn20_N3aaa9GG23331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23331233fooEv,_ZThn28_N3aaa9GG23331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23331233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23331233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331233fooEv,_ZThn8_N3aaa9GG23331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331233barEv,_ZThn8_N3aaa9GG23331233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331233fooEv,_ZThn20_N3aaa9GG23331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331233barEv,_ZThn20_N3aaa9GG23331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23331233fooEv,_ZThn28_N3aaa9GG23331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333123E[];
Class_Descriptor cd__ZN3aaa9GG2333123E = {  "_ZN3aaa9GG2333123E", // class name
  bases__ZN3aaa9GG2333123E, 6,
  &(vtc__ZN3aaa9GG2333123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333131  : ::aaa::EE233 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23331313fooEv
  ~GG2333131(); // tgen
  GG2333131(); // tgen
};
//SIG(1 _ZN3aaa9GG2333131E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333131 ::foo(){vfunc_called(this, "_ZN3aaa9GG23331313fooEv");}
aaa::GG2333131 ::~GG2333131(){ note_dtor("_ZN3aaa9GG2333131E", this);} // tgen
aaa::GG2333131 ::GG2333131(){ note_ctor("_ZN3aaa9GG2333131E", this);} // tgen
}
static void Test__ZN3aaa9GG2333131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333131E, buf);
    ::aaa::GG2333131 *dp, &lv = *(dp=new (buf) ::aaa::GG2333131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333131E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333131E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2333131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2333131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2333131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333131E);
    dp->::aaa::GG2333131::~GG2333131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333131E(Test__ZN3aaa9GG2333131E, "_ZN3aaa9GG2333131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333131C1Ev();
extern void _ZN3aaa9GG2333131D1Ev();
Name_Map name_map__ZN3aaa9GG2333131E[] = {
  NSPAIR(_ZN3aaa9GG2333131C1Ev),
  NSPAIR(_ZN3aaa9GG2333131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2333131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333131E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23331313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23331313fooEv,_ZThn8_N3aaa9GG23331313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331313fooEv,_ZThn20_N3aaa9GG23331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23331313fooEv,_ZThn28_N3aaa9GG23331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23331313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331313fooEv,_ZThn8_N3aaa9GG23331313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331313fooEv,_ZThn20_N3aaa9GG23331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23331313fooEv,_ZThn28_N3aaa9GG23331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333131E[];
Class_Descriptor cd__ZN3aaa9GG2333131E = {  "_ZN3aaa9GG2333131E", // class name
  bases__ZN3aaa9GG2333131E, 6,
  &(vtc__ZN3aaa9GG2333131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333132  : ::aaa::EE233 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23331323barEv
  ~GG2333132(); // tgen
  GG2333132(); // tgen
};
//SIG(1 _ZN3aaa9GG2333132E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333132 ::bar(){vfunc_called(this, "_ZN3aaa9GG23331323barEv");}
aaa::GG2333132 ::~GG2333132(){ note_dtor("_ZN3aaa9GG2333132E", this);} // tgen
aaa::GG2333132 ::GG2333132(){ note_ctor("_ZN3aaa9GG2333132E", this);} // tgen
}
static void Test__ZN3aaa9GG2333132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333132E, buf);
    ::aaa::GG2333132 *dp, &lv = *(dp=new (buf) ::aaa::GG2333132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333132E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333132E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2333132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2333132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2333132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333132E);
    dp->::aaa::GG2333132::~GG2333132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333132E(Test__ZN3aaa9GG2333132E, "_ZN3aaa9GG2333132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333132C1Ev();
extern void _ZN3aaa9GG2333132D1Ev();
Name_Map name_map__ZN3aaa9GG2333132E[] = {
  NSPAIR(_ZN3aaa9GG2333132C1Ev),
  NSPAIR(_ZN3aaa9GG2333132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2333132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333132E[];
extern void _ZN3aaa9GG23331323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23331323barEv,_ZThn8_N3aaa9GG23331323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23331323barEv,_ZThn20_N3aaa9GG23331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333132E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23331323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331323barEv,_ZThn8_N3aaa9GG23331323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331323barEv,_ZThn20_N3aaa9GG23331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333132E[];
Class_Descriptor cd__ZN3aaa9GG2333132E = {  "_ZN3aaa9GG2333132E", // class name
  bases__ZN3aaa9GG2333132E, 6,
  &(vtc__ZN3aaa9GG2333132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333133  : ::aaa::EE233 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23331333fooEv
  virtual void  bar(); // _ZN3aaa9GG23331333barEv
  ~GG2333133(); // tgen
  GG2333133(); // tgen
};
//SIG(1 _ZN3aaa9GG2333133E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333133 ::foo(){vfunc_called(this, "_ZN3aaa9GG23331333fooEv");}
void  aaa::GG2333133 ::bar(){vfunc_called(this, "_ZN3aaa9GG23331333barEv");}
aaa::GG2333133 ::~GG2333133(){ note_dtor("_ZN3aaa9GG2333133E", this);} // tgen
aaa::GG2333133 ::GG2333133(){ note_ctor("_ZN3aaa9GG2333133E", this);} // tgen
}
static void Test__ZN3aaa9GG2333133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333133E, buf);
    ::aaa::GG2333133 *dp, &lv = *(dp=new (buf) ::aaa::GG2333133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333133E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333133E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2333133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG2333133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG2333133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333133E);
    dp->::aaa::GG2333133::~GG2333133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333133E(Test__ZN3aaa9GG2333133E, "_ZN3aaa9GG2333133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333133C1Ev();
extern void _ZN3aaa9GG2333133D1Ev();
Name_Map name_map__ZN3aaa9GG2333133E[] = {
  NSPAIR(_ZN3aaa9GG2333133C1Ev),
  NSPAIR(_ZN3aaa9GG2333133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG2333133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333133E[];
extern void _ZN3aaa9GG23331333barEv();
extern void _ZN3aaa9GG23331333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23331333fooEv,_ZThn8_N3aaa9GG23331333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23331333barEv,_ZThn8_N3aaa9GG23331333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331333fooEv,_ZThn20_N3aaa9GG23331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23331333barEv,_ZThn20_N3aaa9GG23331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23331333fooEv,_ZThn28_N3aaa9GG23331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23331333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23331333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331333fooEv,_ZThn8_N3aaa9GG23331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23331333barEv,_ZThn8_N3aaa9GG23331333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331333fooEv,_ZThn20_N3aaa9GG23331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23331333barEv,_ZThn20_N3aaa9GG23331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23331333fooEv,_ZThn28_N3aaa9GG23331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333133E[];
Class_Descriptor cd__ZN3aaa9GG2333133E = {  "_ZN3aaa9GG2333133E", // class name
  bases__ZN3aaa9GG2333133E, 6,
  &(vtc__ZN3aaa9GG2333133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333211  : ::aaa::EE233 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23332113fooEv
  ~GG2333211(); // tgen
  GG2333211(); // tgen
};
//SIG(1 _ZN3aaa9GG2333211E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333211 ::foo(){vfunc_called(this, "_ZN3aaa9GG23332113fooEv");}
aaa::GG2333211 ::~GG2333211(){ note_dtor("_ZN3aaa9GG2333211E", this);} // tgen
aaa::GG2333211 ::GG2333211(){ note_ctor("_ZN3aaa9GG2333211E", this);} // tgen
}
static void Test__ZN3aaa9GG2333211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333211E, buf);
    ::aaa::GG2333211 *dp, &lv = *(dp=new (buf) ::aaa::GG2333211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333211E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333211E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2333211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2333211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2333211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333211E);
    dp->::aaa::GG2333211::~GG2333211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333211E(Test__ZN3aaa9GG2333211E, "_ZN3aaa9GG2333211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333211C1Ev();
extern void _ZN3aaa9GG2333211D1Ev();
Name_Map name_map__ZN3aaa9GG2333211E[] = {
  NSPAIR(_ZN3aaa9GG2333211C1Ev),
  NSPAIR(_ZN3aaa9GG2333211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2333211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333211E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23332113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23332113fooEv,_ZThn8_N3aaa9GG23332113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332113fooEv,_ZThn20_N3aaa9GG23332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333211E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23332113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332113fooEv,_ZThn8_N3aaa9GG23332113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332113fooEv,_ZThn20_N3aaa9GG23332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333211E[];
Class_Descriptor cd__ZN3aaa9GG2333211E = {  "_ZN3aaa9GG2333211E", // class name
  bases__ZN3aaa9GG2333211E, 6,
  &(vtc__ZN3aaa9GG2333211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333212  : ::aaa::EE233 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23332123barEv
  ~GG2333212(); // tgen
  GG2333212(); // tgen
};
//SIG(1 _ZN3aaa9GG2333212E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333212 ::bar(){vfunc_called(this, "_ZN3aaa9GG23332123barEv");}
aaa::GG2333212 ::~GG2333212(){ note_dtor("_ZN3aaa9GG2333212E", this);} // tgen
aaa::GG2333212 ::GG2333212(){ note_ctor("_ZN3aaa9GG2333212E", this);} // tgen
}
static void Test__ZN3aaa9GG2333212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333212E, buf);
    ::aaa::GG2333212 *dp, &lv = *(dp=new (buf) ::aaa::GG2333212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333212E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333212E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2333212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2333212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2333212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333212E);
    dp->::aaa::GG2333212::~GG2333212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333212E(Test__ZN3aaa9GG2333212E, "_ZN3aaa9GG2333212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333212C1Ev();
extern void _ZN3aaa9GG2333212D1Ev();
Name_Map name_map__ZN3aaa9GG2333212E[] = {
  NSPAIR(_ZN3aaa9GG2333212C1Ev),
  NSPAIR(_ZN3aaa9GG2333212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2333212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333212E[];
extern void _ZN3aaa9GG23332123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23332123barEv,_ZThn8_N3aaa9GG23332123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23332123barEv,_ZThn20_N3aaa9GG23332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23332123barEv,_ZThn28_N3aaa9GG23332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333212E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23332123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332123barEv,_ZThn8_N3aaa9GG23332123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332123barEv,_ZThn20_N3aaa9GG23332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23332123barEv,_ZThn28_N3aaa9GG23332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333212E[];
Class_Descriptor cd__ZN3aaa9GG2333212E = {  "_ZN3aaa9GG2333212E", // class name
  bases__ZN3aaa9GG2333212E, 6,
  &(vtc__ZN3aaa9GG2333212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333213  : ::aaa::EE233 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23332133fooEv
  virtual void  bar(); // _ZN3aaa9GG23332133barEv
  ~GG2333213(); // tgen
  GG2333213(); // tgen
};
//SIG(1 _ZN3aaa9GG2333213E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333213 ::foo(){vfunc_called(this, "_ZN3aaa9GG23332133fooEv");}
void  aaa::GG2333213 ::bar(){vfunc_called(this, "_ZN3aaa9GG23332133barEv");}
aaa::GG2333213 ::~GG2333213(){ note_dtor("_ZN3aaa9GG2333213E", this);} // tgen
aaa::GG2333213 ::GG2333213(){ note_ctor("_ZN3aaa9GG2333213E", this);} // tgen
}
static void Test__ZN3aaa9GG2333213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333213E, buf);
    ::aaa::GG2333213 *dp, &lv = *(dp=new (buf) ::aaa::GG2333213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333213E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333213E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2333213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG2333213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG2333213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333213E);
    dp->::aaa::GG2333213::~GG2333213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333213E(Test__ZN3aaa9GG2333213E, "_ZN3aaa9GG2333213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333213C1Ev();
extern void _ZN3aaa9GG2333213D1Ev();
Name_Map name_map__ZN3aaa9GG2333213E[] = {
  NSPAIR(_ZN3aaa9GG2333213C1Ev),
  NSPAIR(_ZN3aaa9GG2333213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG2333213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333213E[];
extern void _ZN3aaa9GG23332133barEv();
extern void _ZN3aaa9GG23332133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23332133fooEv,_ZThn8_N3aaa9GG23332133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23332133barEv,_ZThn8_N3aaa9GG23332133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332133fooEv,_ZThn20_N3aaa9GG23332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332133barEv,_ZThn20_N3aaa9GG23332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23332133barEv,_ZThn28_N3aaa9GG23332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23332133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23332133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332133fooEv,_ZThn8_N3aaa9GG23332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332133barEv,_ZThn8_N3aaa9GG23332133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332133fooEv,_ZThn20_N3aaa9GG23332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332133barEv,_ZThn20_N3aaa9GG23332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23332133barEv,_ZThn28_N3aaa9GG23332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333213E[];
Class_Descriptor cd__ZN3aaa9GG2333213E = {  "_ZN3aaa9GG2333213E", // class name
  bases__ZN3aaa9GG2333213E, 6,
  &(vtc__ZN3aaa9GG2333213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333221  : ::aaa::EE233 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23332213fooEv
  ~GG2333221(); // tgen
  GG2333221(); // tgen
};
//SIG(1 _ZN3aaa9GG2333221E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333221 ::foo(){vfunc_called(this, "_ZN3aaa9GG23332213fooEv");}
aaa::GG2333221 ::~GG2333221(){ note_dtor("_ZN3aaa9GG2333221E", this);} // tgen
aaa::GG2333221 ::GG2333221(){ note_ctor("_ZN3aaa9GG2333221E", this);} // tgen
}
static void Test__ZN3aaa9GG2333221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333221E, buf);
    ::aaa::GG2333221 *dp, &lv = *(dp=new (buf) ::aaa::GG2333221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333221E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333221E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2333221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2333221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2333221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333221E);
    dp->::aaa::GG2333221::~GG2333221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333221E(Test__ZN3aaa9GG2333221E, "_ZN3aaa9GG2333221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333221C1Ev();
extern void _ZN3aaa9GG2333221D1Ev();
Name_Map name_map__ZN3aaa9GG2333221E[] = {
  NSPAIR(_ZN3aaa9GG2333221C1Ev),
  NSPAIR(_ZN3aaa9GG2333221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2333221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333221E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23332213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23332213fooEv,_ZThn8_N3aaa9GG23332213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332213fooEv,_ZThn20_N3aaa9GG23332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23332213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332213fooEv,_ZThn8_N3aaa9GG23332213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332213fooEv,_ZThn20_N3aaa9GG23332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333221E[];
Class_Descriptor cd__ZN3aaa9GG2333221E = {  "_ZN3aaa9GG2333221E", // class name
  bases__ZN3aaa9GG2333221E, 6,
  &(vtc__ZN3aaa9GG2333221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333222  : ::aaa::EE233 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23332223barEv
  ~GG2333222(); // tgen
  GG2333222(); // tgen
};
//SIG(1 _ZN3aaa9GG2333222E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333222 ::bar(){vfunc_called(this, "_ZN3aaa9GG23332223barEv");}
aaa::GG2333222 ::~GG2333222(){ note_dtor("_ZN3aaa9GG2333222E", this);} // tgen
aaa::GG2333222 ::GG2333222(){ note_ctor("_ZN3aaa9GG2333222E", this);} // tgen
}
static void Test__ZN3aaa9GG2333222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333222E, buf);
    ::aaa::GG2333222 *dp, &lv = *(dp=new (buf) ::aaa::GG2333222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333222E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333222E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2333222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2333222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2333222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333222E);
    dp->::aaa::GG2333222::~GG2333222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333222E(Test__ZN3aaa9GG2333222E, "_ZN3aaa9GG2333222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333222C1Ev();
extern void _ZN3aaa9GG2333222D1Ev();
Name_Map name_map__ZN3aaa9GG2333222E[] = {
  NSPAIR(_ZN3aaa9GG2333222C1Ev),
  NSPAIR(_ZN3aaa9GG2333222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2333222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333222E[];
extern void _ZN3aaa9GG23332223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23332223barEv,_ZThn8_N3aaa9GG23332223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23332223barEv,_ZThn20_N3aaa9GG23332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23332223barEv,_ZThn28_N3aaa9GG23332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333222E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23332223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332223barEv,_ZThn8_N3aaa9GG23332223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332223barEv,_ZThn20_N3aaa9GG23332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23332223barEv,_ZThn28_N3aaa9GG23332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333222E[];
Class_Descriptor cd__ZN3aaa9GG2333222E = {  "_ZN3aaa9GG2333222E", // class name
  bases__ZN3aaa9GG2333222E, 6,
  &(vtc__ZN3aaa9GG2333222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333223  : ::aaa::EE233 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23332233fooEv
  virtual void  bar(); // _ZN3aaa9GG23332233barEv
  ~GG2333223(); // tgen
  GG2333223(); // tgen
};
//SIG(1 _ZN3aaa9GG2333223E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333223 ::foo(){vfunc_called(this, "_ZN3aaa9GG23332233fooEv");}
void  aaa::GG2333223 ::bar(){vfunc_called(this, "_ZN3aaa9GG23332233barEv");}
aaa::GG2333223 ::~GG2333223(){ note_dtor("_ZN3aaa9GG2333223E", this);} // tgen
aaa::GG2333223 ::GG2333223(){ note_ctor("_ZN3aaa9GG2333223E", this);} // tgen
}
static void Test__ZN3aaa9GG2333223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333223E, buf);
    ::aaa::GG2333223 *dp, &lv = *(dp=new (buf) ::aaa::GG2333223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333223E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333223E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2333223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG2333223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG2333223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333223E);
    dp->::aaa::GG2333223::~GG2333223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333223E(Test__ZN3aaa9GG2333223E, "_ZN3aaa9GG2333223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333223C1Ev();
extern void _ZN3aaa9GG2333223D1Ev();
Name_Map name_map__ZN3aaa9GG2333223E[] = {
  NSPAIR(_ZN3aaa9GG2333223C1Ev),
  NSPAIR(_ZN3aaa9GG2333223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG2333223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333223E[];
extern void _ZN3aaa9GG23332233barEv();
extern void _ZN3aaa9GG23332233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23332233fooEv,_ZThn8_N3aaa9GG23332233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23332233barEv,_ZThn8_N3aaa9GG23332233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332233fooEv,_ZThn20_N3aaa9GG23332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332233barEv,_ZThn20_N3aaa9GG23332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23332233barEv,_ZThn28_N3aaa9GG23332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23332233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23332233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332233fooEv,_ZThn8_N3aaa9GG23332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332233barEv,_ZThn8_N3aaa9GG23332233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332233fooEv,_ZThn20_N3aaa9GG23332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332233barEv,_ZThn20_N3aaa9GG23332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23332233barEv,_ZThn28_N3aaa9GG23332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333223E[];
Class_Descriptor cd__ZN3aaa9GG2333223E = {  "_ZN3aaa9GG2333223E", // class name
  bases__ZN3aaa9GG2333223E, 6,
  &(vtc__ZN3aaa9GG2333223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333231  : ::aaa::EE233 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23332313fooEv
  ~GG2333231(); // tgen
  GG2333231(); // tgen
};
//SIG(1 _ZN3aaa9GG2333231E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333231 ::foo(){vfunc_called(this, "_ZN3aaa9GG23332313fooEv");}
aaa::GG2333231 ::~GG2333231(){ note_dtor("_ZN3aaa9GG2333231E", this);} // tgen
aaa::GG2333231 ::GG2333231(){ note_ctor("_ZN3aaa9GG2333231E", this);} // tgen
}
static void Test__ZN3aaa9GG2333231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333231E, buf);
    ::aaa::GG2333231 *dp, &lv = *(dp=new (buf) ::aaa::GG2333231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333231E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333231E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2333231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2333231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2333231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333231E);
    dp->::aaa::GG2333231::~GG2333231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333231E(Test__ZN3aaa9GG2333231E, "_ZN3aaa9GG2333231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333231C1Ev();
extern void _ZN3aaa9GG2333231D1Ev();
Name_Map name_map__ZN3aaa9GG2333231E[] = {
  NSPAIR(_ZN3aaa9GG2333231C1Ev),
  NSPAIR(_ZN3aaa9GG2333231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2333231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333231E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23332313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23332313fooEv,_ZThn8_N3aaa9GG23332313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332313fooEv,_ZThn20_N3aaa9GG23332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23332313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332313fooEv,_ZThn8_N3aaa9GG23332313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332313fooEv,_ZThn20_N3aaa9GG23332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333231E[];
Class_Descriptor cd__ZN3aaa9GG2333231E = {  "_ZN3aaa9GG2333231E", // class name
  bases__ZN3aaa9GG2333231E, 6,
  &(vtc__ZN3aaa9GG2333231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333232  : ::aaa::EE233 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23332323barEv
  ~GG2333232(); // tgen
  GG2333232(); // tgen
};
//SIG(1 _ZN3aaa9GG2333232E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333232 ::bar(){vfunc_called(this, "_ZN3aaa9GG23332323barEv");}
aaa::GG2333232 ::~GG2333232(){ note_dtor("_ZN3aaa9GG2333232E", this);} // tgen
aaa::GG2333232 ::GG2333232(){ note_ctor("_ZN3aaa9GG2333232E", this);} // tgen
}
static void Test__ZN3aaa9GG2333232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333232E, buf);
    ::aaa::GG2333232 *dp, &lv = *(dp=new (buf) ::aaa::GG2333232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333232E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333232E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2333232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2333232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2333232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333232E);
    dp->::aaa::GG2333232::~GG2333232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333232E(Test__ZN3aaa9GG2333232E, "_ZN3aaa9GG2333232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333232C1Ev();
extern void _ZN3aaa9GG2333232D1Ev();
Name_Map name_map__ZN3aaa9GG2333232E[] = {
  NSPAIR(_ZN3aaa9GG2333232C1Ev),
  NSPAIR(_ZN3aaa9GG2333232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2333232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333232E[];
extern void _ZN3aaa9GG23332323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23332323barEv,_ZThn8_N3aaa9GG23332323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23332323barEv,_ZThn20_N3aaa9GG23332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23332323barEv,_ZThn28_N3aaa9GG23332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333232E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23332323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332323barEv,_ZThn8_N3aaa9GG23332323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332323barEv,_ZThn20_N3aaa9GG23332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23332323barEv,_ZThn28_N3aaa9GG23332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333232E[];
Class_Descriptor cd__ZN3aaa9GG2333232E = {  "_ZN3aaa9GG2333232E", // class name
  bases__ZN3aaa9GG2333232E, 6,
  &(vtc__ZN3aaa9GG2333232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333233  : ::aaa::EE233 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23332333fooEv
  virtual void  bar(); // _ZN3aaa9GG23332333barEv
  ~GG2333233(); // tgen
  GG2333233(); // tgen
};
//SIG(1 _ZN3aaa9GG2333233E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333233 ::foo(){vfunc_called(this, "_ZN3aaa9GG23332333fooEv");}
void  aaa::GG2333233 ::bar(){vfunc_called(this, "_ZN3aaa9GG23332333barEv");}
aaa::GG2333233 ::~GG2333233(){ note_dtor("_ZN3aaa9GG2333233E", this);} // tgen
aaa::GG2333233 ::GG2333233(){ note_ctor("_ZN3aaa9GG2333233E", this);} // tgen
}
static void Test__ZN3aaa9GG2333233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333233E, buf);
    ::aaa::GG2333233 *dp, &lv = *(dp=new (buf) ::aaa::GG2333233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333233E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333233E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2333233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG2333233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG2333233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333233E);
    dp->::aaa::GG2333233::~GG2333233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333233E(Test__ZN3aaa9GG2333233E, "_ZN3aaa9GG2333233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333233C1Ev();
extern void _ZN3aaa9GG2333233D1Ev();
Name_Map name_map__ZN3aaa9GG2333233E[] = {
  NSPAIR(_ZN3aaa9GG2333233C1Ev),
  NSPAIR(_ZN3aaa9GG2333233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG2333233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333233E[];
extern void _ZN3aaa9GG23332333barEv();
extern void _ZN3aaa9GG23332333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23332333fooEv,_ZThn8_N3aaa9GG23332333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23332333barEv,_ZThn8_N3aaa9GG23332333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332333fooEv,_ZThn20_N3aaa9GG23332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23332333barEv,_ZThn20_N3aaa9GG23332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23332333barEv,_ZThn28_N3aaa9GG23332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23332333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23332333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332333fooEv,_ZThn8_N3aaa9GG23332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23332333barEv,_ZThn8_N3aaa9GG23332333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332333fooEv,_ZThn20_N3aaa9GG23332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23332333barEv,_ZThn20_N3aaa9GG23332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23332333barEv,_ZThn28_N3aaa9GG23332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333233E[];
Class_Descriptor cd__ZN3aaa9GG2333233E = {  "_ZN3aaa9GG2333233E", // class name
  bases__ZN3aaa9GG2333233E, 6,
  &(vtc__ZN3aaa9GG2333233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333311  : ::aaa::EE233 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23333113fooEv
  ~GG2333311(); // tgen
  GG2333311(); // tgen
};
//SIG(1 _ZN3aaa9GG2333311E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333311 ::foo(){vfunc_called(this, "_ZN3aaa9GG23333113fooEv");}
aaa::GG2333311 ::~GG2333311(){ note_dtor("_ZN3aaa9GG2333311E", this);} // tgen
aaa::GG2333311 ::GG2333311(){ note_ctor("_ZN3aaa9GG2333311E", this);} // tgen
}
static void Test__ZN3aaa9GG2333311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333311E, buf);
    ::aaa::GG2333311 *dp, &lv = *(dp=new (buf) ::aaa::GG2333311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333311E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333311E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2333311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2333311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2333311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333311E);
    dp->::aaa::GG2333311::~GG2333311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333311E(Test__ZN3aaa9GG2333311E, "_ZN3aaa9GG2333311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333311C1Ev();
extern void _ZN3aaa9GG2333311D1Ev();
Name_Map name_map__ZN3aaa9GG2333311E[] = {
  NSPAIR(_ZN3aaa9GG2333311C1Ev),
  NSPAIR(_ZN3aaa9GG2333311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2333311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333311E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23333113fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23333113fooEv,_ZThn8_N3aaa9GG23333113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333113fooEv,_ZThn20_N3aaa9GG23333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23333113fooEv,_ZThn28_N3aaa9GG23333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333311E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23333113fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333113fooEv,_ZThn8_N3aaa9GG23333113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333113fooEv,_ZThn20_N3aaa9GG23333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333113fooEv,_ZThn28_N3aaa9GG23333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333311E[];
Class_Descriptor cd__ZN3aaa9GG2333311E = {  "_ZN3aaa9GG2333311E", // class name
  bases__ZN3aaa9GG2333311E, 6,
  &(vtc__ZN3aaa9GG2333311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333312  : ::aaa::EE233 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23333123barEv
  ~GG2333312(); // tgen
  GG2333312(); // tgen
};
//SIG(1 _ZN3aaa9GG2333312E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333312 ::bar(){vfunc_called(this, "_ZN3aaa9GG23333123barEv");}
aaa::GG2333312 ::~GG2333312(){ note_dtor("_ZN3aaa9GG2333312E", this);} // tgen
aaa::GG2333312 ::GG2333312(){ note_ctor("_ZN3aaa9GG2333312E", this);} // tgen
}
static void Test__ZN3aaa9GG2333312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333312E, buf);
    ::aaa::GG2333312 *dp, &lv = *(dp=new (buf) ::aaa::GG2333312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333312E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333312E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2333312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2333312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2333312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333312E);
    dp->::aaa::GG2333312::~GG2333312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333312E(Test__ZN3aaa9GG2333312E, "_ZN3aaa9GG2333312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333312C1Ev();
extern void _ZN3aaa9GG2333312D1Ev();
Name_Map name_map__ZN3aaa9GG2333312E[] = {
  NSPAIR(_ZN3aaa9GG2333312C1Ev),
  NSPAIR(_ZN3aaa9GG2333312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2333312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333312E[];
extern void _ZN3aaa9GG23333123barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23333123barEv,_ZThn8_N3aaa9GG23333123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23333123barEv,_ZThn20_N3aaa9GG23333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23333123barEv,_ZThn28_N3aaa9GG23333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333312E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23333123barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333123barEv,_ZThn8_N3aaa9GG23333123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333123barEv,_ZThn20_N3aaa9GG23333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333123barEv,_ZThn28_N3aaa9GG23333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333312E[];
Class_Descriptor cd__ZN3aaa9GG2333312E = {  "_ZN3aaa9GG2333312E", // class name
  bases__ZN3aaa9GG2333312E, 6,
  &(vtc__ZN3aaa9GG2333312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333313  : ::aaa::EE233 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23333133fooEv
  virtual void  bar(); // _ZN3aaa9GG23333133barEv
  ~GG2333313(); // tgen
  GG2333313(); // tgen
};
//SIG(1 _ZN3aaa9GG2333313E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333313 ::foo(){vfunc_called(this, "_ZN3aaa9GG23333133fooEv");}
void  aaa::GG2333313 ::bar(){vfunc_called(this, "_ZN3aaa9GG23333133barEv");}
aaa::GG2333313 ::~GG2333313(){ note_dtor("_ZN3aaa9GG2333313E", this);} // tgen
aaa::GG2333313 ::GG2333313(){ note_ctor("_ZN3aaa9GG2333313E", this);} // tgen
}
static void Test__ZN3aaa9GG2333313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333313E, buf);
    ::aaa::GG2333313 *dp, &lv = *(dp=new (buf) ::aaa::GG2333313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333313E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333313E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2333313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG2333313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG2333313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333313E);
    dp->::aaa::GG2333313::~GG2333313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333313E(Test__ZN3aaa9GG2333313E, "_ZN3aaa9GG2333313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333313C1Ev();
extern void _ZN3aaa9GG2333313D1Ev();
Name_Map name_map__ZN3aaa9GG2333313E[] = {
  NSPAIR(_ZN3aaa9GG2333313C1Ev),
  NSPAIR(_ZN3aaa9GG2333313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG2333313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333313E[];
extern void _ZN3aaa9GG23333133barEv();
extern void _ZN3aaa9GG23333133fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23333133fooEv,_ZThn8_N3aaa9GG23333133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23333133barEv,_ZThn8_N3aaa9GG23333133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333133fooEv,_ZThn20_N3aaa9GG23333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333133barEv,_ZThn20_N3aaa9GG23333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23333133fooEv,_ZThn28_N3aaa9GG23333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23333133barEv,_ZThn28_N3aaa9GG23333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23333133barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23333133fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333133fooEv,_ZThn8_N3aaa9GG23333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333133barEv,_ZThn8_N3aaa9GG23333133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333133fooEv,_ZThn20_N3aaa9GG23333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333133barEv,_ZThn20_N3aaa9GG23333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333133fooEv,_ZThn28_N3aaa9GG23333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333133barEv,_ZThn28_N3aaa9GG23333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333313E[];
Class_Descriptor cd__ZN3aaa9GG2333313E = {  "_ZN3aaa9GG2333313E", // class name
  bases__ZN3aaa9GG2333313E, 6,
  &(vtc__ZN3aaa9GG2333313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333321  : ::aaa::EE233 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23333213fooEv
  ~GG2333321(); // tgen
  GG2333321(); // tgen
};
//SIG(1 _ZN3aaa9GG2333321E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333321 ::foo(){vfunc_called(this, "_ZN3aaa9GG23333213fooEv");}
aaa::GG2333321 ::~GG2333321(){ note_dtor("_ZN3aaa9GG2333321E", this);} // tgen
aaa::GG2333321 ::GG2333321(){ note_ctor("_ZN3aaa9GG2333321E", this);} // tgen
}
static void Test__ZN3aaa9GG2333321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333321E, buf);
    ::aaa::GG2333321 *dp, &lv = *(dp=new (buf) ::aaa::GG2333321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333321E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333321E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2333321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2333321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2333321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333321E);
    dp->::aaa::GG2333321::~GG2333321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333321E(Test__ZN3aaa9GG2333321E, "_ZN3aaa9GG2333321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333321C1Ev();
extern void _ZN3aaa9GG2333321D1Ev();
Name_Map name_map__ZN3aaa9GG2333321E[] = {
  NSPAIR(_ZN3aaa9GG2333321C1Ev),
  NSPAIR(_ZN3aaa9GG2333321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2333321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333321E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23333213fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23333213fooEv,_ZThn8_N3aaa9GG23333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333213fooEv,_ZThn20_N3aaa9GG23333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23333213fooEv,_ZThn28_N3aaa9GG23333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23333213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333213fooEv,_ZThn8_N3aaa9GG23333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333213fooEv,_ZThn20_N3aaa9GG23333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333213fooEv,_ZThn28_N3aaa9GG23333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333321E[];
Class_Descriptor cd__ZN3aaa9GG2333321E = {  "_ZN3aaa9GG2333321E", // class name
  bases__ZN3aaa9GG2333321E, 6,
  &(vtc__ZN3aaa9GG2333321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333322  : ::aaa::EE233 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23333223barEv
  ~GG2333322(); // tgen
  GG2333322(); // tgen
};
//SIG(1 _ZN3aaa9GG2333322E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333322 ::bar(){vfunc_called(this, "_ZN3aaa9GG23333223barEv");}
aaa::GG2333322 ::~GG2333322(){ note_dtor("_ZN3aaa9GG2333322E", this);} // tgen
aaa::GG2333322 ::GG2333322(){ note_ctor("_ZN3aaa9GG2333322E", this);} // tgen
}
static void Test__ZN3aaa9GG2333322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333322E, buf);
    ::aaa::GG2333322 *dp, &lv = *(dp=new (buf) ::aaa::GG2333322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333322E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333322E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2333322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2333322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2333322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333322E);
    dp->::aaa::GG2333322::~GG2333322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333322E(Test__ZN3aaa9GG2333322E, "_ZN3aaa9GG2333322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333322C1Ev();
extern void _ZN3aaa9GG2333322D1Ev();
Name_Map name_map__ZN3aaa9GG2333322E[] = {
  NSPAIR(_ZN3aaa9GG2333322C1Ev),
  NSPAIR(_ZN3aaa9GG2333322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2333322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333322E[];
extern void _ZN3aaa9GG23333223barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23333223barEv,_ZThn8_N3aaa9GG23333223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23333223barEv,_ZThn20_N3aaa9GG23333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23333223barEv,_ZThn28_N3aaa9GG23333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23333223barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333223barEv,_ZThn8_N3aaa9GG23333223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333223barEv,_ZThn20_N3aaa9GG23333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333223barEv,_ZThn28_N3aaa9GG23333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333322E[];
Class_Descriptor cd__ZN3aaa9GG2333322E = {  "_ZN3aaa9GG2333322E", // class name
  bases__ZN3aaa9GG2333322E, 6,
  &(vtc__ZN3aaa9GG2333322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333323  : ::aaa::EE233 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23333233fooEv
  virtual void  bar(); // _ZN3aaa9GG23333233barEv
  ~GG2333323(); // tgen
  GG2333323(); // tgen
};
//SIG(1 _ZN3aaa9GG2333323E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333323 ::foo(){vfunc_called(this, "_ZN3aaa9GG23333233fooEv");}
void  aaa::GG2333323 ::bar(){vfunc_called(this, "_ZN3aaa9GG23333233barEv");}
aaa::GG2333323 ::~GG2333323(){ note_dtor("_ZN3aaa9GG2333323E", this);} // tgen
aaa::GG2333323 ::GG2333323(){ note_ctor("_ZN3aaa9GG2333323E", this);} // tgen
}
static void Test__ZN3aaa9GG2333323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333323E, buf);
    ::aaa::GG2333323 *dp, &lv = *(dp=new (buf) ::aaa::GG2333323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333323E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333323E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2333323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG2333323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG2333323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333323E);
    dp->::aaa::GG2333323::~GG2333323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333323E(Test__ZN3aaa9GG2333323E, "_ZN3aaa9GG2333323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333323C1Ev();
extern void _ZN3aaa9GG2333323D1Ev();
Name_Map name_map__ZN3aaa9GG2333323E[] = {
  NSPAIR(_ZN3aaa9GG2333323C1Ev),
  NSPAIR(_ZN3aaa9GG2333323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG2333323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333323E[];
extern void _ZN3aaa9GG23333233barEv();
extern void _ZN3aaa9GG23333233fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23333233fooEv,_ZThn8_N3aaa9GG23333233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23333233barEv,_ZThn8_N3aaa9GG23333233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333233fooEv,_ZThn20_N3aaa9GG23333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333233barEv,_ZThn20_N3aaa9GG23333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23333233fooEv,_ZThn28_N3aaa9GG23333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23333233barEv,_ZThn28_N3aaa9GG23333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23333233barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23333233fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333233fooEv,_ZThn8_N3aaa9GG23333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333233barEv,_ZThn8_N3aaa9GG23333233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333233fooEv,_ZThn20_N3aaa9GG23333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333233barEv,_ZThn20_N3aaa9GG23333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333233fooEv,_ZThn28_N3aaa9GG23333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333233barEv,_ZThn28_N3aaa9GG23333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333323E[];
Class_Descriptor cd__ZN3aaa9GG2333323E = {  "_ZN3aaa9GG2333323E", // class name
  bases__ZN3aaa9GG2333323E, 6,
  &(vtc__ZN3aaa9GG2333323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333331  : ::aaa::EE233 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23333313fooEv
  ~GG2333331(); // tgen
  GG2333331(); // tgen
};
//SIG(1 _ZN3aaa9GG2333331E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333331 ::foo(){vfunc_called(this, "_ZN3aaa9GG23333313fooEv");}
aaa::GG2333331 ::~GG2333331(){ note_dtor("_ZN3aaa9GG2333331E", this);} // tgen
aaa::GG2333331 ::GG2333331(){ note_ctor("_ZN3aaa9GG2333331E", this);} // tgen
}
static void Test__ZN3aaa9GG2333331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333331E, buf);
    ::aaa::GG2333331 *dp, &lv = *(dp=new (buf) ::aaa::GG2333331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333331E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333331E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2333331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2333331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2333331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333331E);
    dp->::aaa::GG2333331::~GG2333331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333331E(Test__ZN3aaa9GG2333331E, "_ZN3aaa9GG2333331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333331C1Ev();
extern void _ZN3aaa9GG2333331D1Ev();
Name_Map name_map__ZN3aaa9GG2333331E[] = {
  NSPAIR(_ZN3aaa9GG2333331C1Ev),
  NSPAIR(_ZN3aaa9GG2333331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2333331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333331E[];
extern void _ZN3aaa5EE2333barEv();
extern void _ZN3aaa9GG23333313fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23333313fooEv,_ZThn8_N3aaa9GG23333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333313fooEv,_ZThn20_N3aaa9GG23333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG23333313fooEv,_ZThn28_N3aaa9GG23333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE2333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23333313fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333313fooEv,_ZThn8_N3aaa9GG23333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333barEv,_ZThn8_N3aaa5EE2333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333313fooEv,_ZThn20_N3aaa9GG23333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333313fooEv,_ZThn28_N3aaa9GG23333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333331E[];
Class_Descriptor cd__ZN3aaa9GG2333331E = {  "_ZN3aaa9GG2333331E", // class name
  bases__ZN3aaa9GG2333331E, 6,
  &(vtc__ZN3aaa9GG2333331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333332  : ::aaa::EE233 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG23333323barEv
  ~GG2333332(); // tgen
  GG2333332(); // tgen
};
//SIG(1 _ZN3aaa9GG2333332E) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG2333332 ::bar(){vfunc_called(this, "_ZN3aaa9GG23333323barEv");}
aaa::GG2333332 ::~GG2333332(){ note_dtor("_ZN3aaa9GG2333332E", this);} // tgen
aaa::GG2333332 ::GG2333332(){ note_ctor("_ZN3aaa9GG2333332E", this);} // tgen
}
static void Test__ZN3aaa9GG2333332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333332E, buf);
    ::aaa::GG2333332 *dp, &lv = *(dp=new (buf) ::aaa::GG2333332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333332E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333332E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2333332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2333332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2333332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333332E);
    dp->::aaa::GG2333332::~GG2333332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333332E(Test__ZN3aaa9GG2333332E, "_ZN3aaa9GG2333332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333332C1Ev();
extern void _ZN3aaa9GG2333332D1Ev();
Name_Map name_map__ZN3aaa9GG2333332E[] = {
  NSPAIR(_ZN3aaa9GG2333332C1Ev),
  NSPAIR(_ZN3aaa9GG2333332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2333332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333332E[];
extern void _ZN3aaa9GG23333323barEv();
extern void _ZN3aaa5EE2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23333323barEv,_ZThn8_N3aaa9GG23333323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG23333323barEv,_ZThn20_N3aaa9GG23333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23333323barEv,_ZThn28_N3aaa9GG23333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333332E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23333323barEv,
  (VTBL_ENTRY)&_ZN3aaa5EE2333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE2333fooEv,_ZThn8_N3aaa5EE2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333323barEv,_ZThn8_N3aaa9GG23333323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333323barEv,_ZThn20_N3aaa9GG23333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333323barEv,_ZThn28_N3aaa9GG23333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333332E[];
Class_Descriptor cd__ZN3aaa9GG2333332E = {  "_ZN3aaa9GG2333332E", // class name
  bases__ZN3aaa9GG2333332E, 6,
  &(vtc__ZN3aaa9GG2333332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG2333333  : ::aaa::EE233 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG23333333fooEv
  virtual void  bar(); // _ZN3aaa9GG23333333barEv
  ~GG2333333(); // tgen
  GG2333333(); // tgen
};
//SIG(1 _ZN3aaa9GG2333333E) C1{ BC2{ BC3{ v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG2333333 ::foo(){vfunc_called(this, "_ZN3aaa9GG23333333fooEv");}
void  aaa::GG2333333 ::bar(){vfunc_called(this, "_ZN3aaa9GG23333333barEv");}
aaa::GG2333333 ::~GG2333333(){ note_dtor("_ZN3aaa9GG2333333E", this);} // tgen
aaa::GG2333333 ::GG2333333(){ note_ctor("_ZN3aaa9GG2333333E", this);} // tgen
}
static void Test__ZN3aaa9GG2333333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG2333333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG2333333E, buf);
    ::aaa::GG2333333 *dp, &lv = *(dp=new (buf) ::aaa::GG2333333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG2333333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG2333333E)");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::EE233*), 0, "_ZN3aaa9GG2333333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE233*), ABISELECT(16,8), "_ZN3aaa9GG2333333E");
    check_base_class_offset(lv, (::aaa::EE233*), 0, "_ZN3aaa9GG2333333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2333333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG2333333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG2333333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG2333333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG2333333E);
    dp->::aaa::GG2333333::~GG2333333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG2333333E(Test__ZN3aaa9GG2333333E, "_ZN3aaa9GG2333333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG2333333C1Ev();
extern void _ZN3aaa9GG2333333D1Ev();
Name_Map name_map__ZN3aaa9GG2333333E[] = {
  NSPAIR(_ZN3aaa9GG2333333C1Ev),
  NSPAIR(_ZN3aaa9GG2333333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE233E;
extern VTBL_ENTRY _ZTIN3aaa5EE233E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE233E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG2333333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA2E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE233E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG2333333E[];
extern void _ZN3aaa9GG23333333barEv();
extern void _ZN3aaa9GG23333333fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG23333333fooEv,_ZThn8_N3aaa9GG23333333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG23333333barEv,_ZThn8_N3aaa9GG23333333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333333fooEv,_ZThn20_N3aaa9GG23333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG23333333barEv,_ZThn20_N3aaa9GG23333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23333333fooEv,_ZThn28_N3aaa9GG23333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG23333333barEv,_ZThn28_N3aaa9GG23333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG2333333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG23333333barEv,
  (VTBL_ENTRY)&_ZN3aaa9GG23333333fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333333fooEv,_ZThn8_N3aaa9GG23333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG23333333barEv,_ZThn8_N3aaa9GG23333333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333333fooEv,_ZThn20_N3aaa9GG23333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG23333333barEv,_ZThn20_N3aaa9GG23333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG2333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333333fooEv,_ZThn28_N3aaa9GG23333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG23333333barEv,_ZThn28_N3aaa9GG23333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG2333333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG2333333E[];
Class_Descriptor cd__ZN3aaa9GG2333333E = {  "_ZN3aaa9GG2333333E", // class name
  bases__ZN3aaa9GG2333333E, 6,
  &(vtc__ZN3aaa9GG2333333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG2333333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG2333333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111111  : ::aaa::EE311 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31111113fooEv
  ~GG3111111(); // tgen
  GG3111111(); // tgen
};
//SIG(1 _ZN3aaa9GG3111111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31111113fooEv");}
aaa::GG3111111 ::~GG3111111(){ note_dtor("_ZN3aaa9GG3111111E", this);} // tgen
aaa::GG3111111 ::GG3111111(){ note_ctor("_ZN3aaa9GG3111111E", this);} // tgen
}
static void Test__ZN3aaa9GG3111111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111111E, buf);
    ::aaa::GG3111111 *dp, &lv = *(dp=new (buf) ::aaa::GG3111111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111111E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3111111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3111111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3111111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111111E);
    dp->::aaa::GG3111111::~GG3111111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111111E(Test__ZN3aaa9GG3111111E, "_ZN3aaa9GG3111111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111111C1Ev();
extern void _ZN3aaa9GG3111111D1Ev();
Name_Map name_map__ZN3aaa9GG3111111E[] = {
  NSPAIR(_ZN3aaa9GG3111111C1Ev),
  NSPAIR(_ZN3aaa9GG3111111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3111111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111111E[];
extern void _ZN3aaa9GG31111113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31111113fooEv,_ZThn8_N3aaa9GG31111113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31111113fooEv,_ZThn20_N3aaa9GG31111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31111113fooEv,_ZThn28_N3aaa9GG31111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31111113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31111113fooEv,_ZThn8_N3aaa9GG31111113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111113fooEv,_ZThn20_N3aaa9GG31111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31111113fooEv,_ZThn28_N3aaa9GG31111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111111E[];
Class_Descriptor cd__ZN3aaa9GG3111111E = {  "_ZN3aaa9GG3111111E", // class name
  bases__ZN3aaa9GG3111111E, 6,
  &(vtc__ZN3aaa9GG3111111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111112  : ::aaa::EE311 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31111123barEv
  ~GG3111112(); // tgen
  GG3111112(); // tgen
};
//SIG(1 _ZN3aaa9GG3111112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31111123barEv");}
aaa::GG3111112 ::~GG3111112(){ note_dtor("_ZN3aaa9GG3111112E", this);} // tgen
aaa::GG3111112 ::GG3111112(){ note_ctor("_ZN3aaa9GG3111112E", this);} // tgen
}
static void Test__ZN3aaa9GG3111112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111112E, buf);
    ::aaa::GG3111112 *dp, &lv = *(dp=new (buf) ::aaa::GG3111112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111112E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3111112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3111112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3111112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111112E);
    dp->::aaa::GG3111112::~GG3111112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111112E(Test__ZN3aaa9GG3111112E, "_ZN3aaa9GG3111112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111112C1Ev();
extern void _ZN3aaa9GG3111112D1Ev();
Name_Map name_map__ZN3aaa9GG3111112E[] = {
  NSPAIR(_ZN3aaa9GG3111112C1Ev),
  NSPAIR(_ZN3aaa9GG3111112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3111112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111112E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31111123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31111123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111112E[];
Class_Descriptor cd__ZN3aaa9GG3111112E = {  "_ZN3aaa9GG3111112E", // class name
  bases__ZN3aaa9GG3111112E, 6,
  &(vtc__ZN3aaa9GG3111112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111113  : ::aaa::EE311 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31111133fooEv
  virtual void  bar(); // _ZN3aaa9GG31111133barEv
  ~GG3111113(); // tgen
  GG3111113(); // tgen
};
//SIG(1 _ZN3aaa9GG3111113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31111133fooEv");}
void  aaa::GG3111113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31111133barEv");}
aaa::GG3111113 ::~GG3111113(){ note_dtor("_ZN3aaa9GG3111113E", this);} // tgen
aaa::GG3111113 ::GG3111113(){ note_ctor("_ZN3aaa9GG3111113E", this);} // tgen
}
static void Test__ZN3aaa9GG3111113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111113E, buf);
    ::aaa::GG3111113 *dp, &lv = *(dp=new (buf) ::aaa::GG3111113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111113E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3111113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3111113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3111113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111113E);
    dp->::aaa::GG3111113::~GG3111113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111113E(Test__ZN3aaa9GG3111113E, "_ZN3aaa9GG3111113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111113C1Ev();
extern void _ZN3aaa9GG3111113D1Ev();
Name_Map name_map__ZN3aaa9GG3111113E[] = {
  NSPAIR(_ZN3aaa9GG3111113C1Ev),
  NSPAIR(_ZN3aaa9GG3111113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3111113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111113E[];
extern void _ZN3aaa9GG31111133fooEv();
extern void _ZN3aaa9GG31111133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31111133fooEv,_ZThn8_N3aaa9GG31111133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31111133fooEv,_ZThn20_N3aaa9GG31111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31111133fooEv,_ZThn28_N3aaa9GG31111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31111133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31111133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31111133fooEv,_ZThn8_N3aaa9GG31111133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111133fooEv,_ZThn20_N3aaa9GG31111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31111133fooEv,_ZThn28_N3aaa9GG31111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111113E[];
Class_Descriptor cd__ZN3aaa9GG3111113E = {  "_ZN3aaa9GG3111113E", // class name
  bases__ZN3aaa9GG3111113E, 6,
  &(vtc__ZN3aaa9GG3111113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111121  : ::aaa::EE311 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31111213fooEv
  ~GG3111121(); // tgen
  GG3111121(); // tgen
};
//SIG(1 _ZN3aaa9GG3111121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31111213fooEv");}
aaa::GG3111121 ::~GG3111121(){ note_dtor("_ZN3aaa9GG3111121E", this);} // tgen
aaa::GG3111121 ::GG3111121(){ note_ctor("_ZN3aaa9GG3111121E", this);} // tgen
}
static void Test__ZN3aaa9GG3111121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111121E, buf);
    ::aaa::GG3111121 *dp, &lv = *(dp=new (buf) ::aaa::GG3111121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111121E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3111121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3111121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3111121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111121E);
    dp->::aaa::GG3111121::~GG3111121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111121E(Test__ZN3aaa9GG3111121E, "_ZN3aaa9GG3111121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111121C1Ev();
extern void _ZN3aaa9GG3111121D1Ev();
Name_Map name_map__ZN3aaa9GG3111121E[] = {
  NSPAIR(_ZN3aaa9GG3111121C1Ev),
  NSPAIR(_ZN3aaa9GG3111121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3111121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111121E[];
extern void _ZN3aaa9GG31111213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31111213fooEv,_ZThn8_N3aaa9GG31111213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31111213fooEv,_ZThn20_N3aaa9GG31111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31111213fooEv,_ZThn28_N3aaa9GG31111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31111213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31111213fooEv,_ZThn8_N3aaa9GG31111213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111213fooEv,_ZThn20_N3aaa9GG31111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31111213fooEv,_ZThn28_N3aaa9GG31111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111121E[];
Class_Descriptor cd__ZN3aaa9GG3111121E = {  "_ZN3aaa9GG3111121E", // class name
  bases__ZN3aaa9GG3111121E, 6,
  &(vtc__ZN3aaa9GG3111121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111122  : ::aaa::EE311 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31111223barEv
  ~GG3111122(); // tgen
  GG3111122(); // tgen
};
//SIG(1 _ZN3aaa9GG3111122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31111223barEv");}
aaa::GG3111122 ::~GG3111122(){ note_dtor("_ZN3aaa9GG3111122E", this);} // tgen
aaa::GG3111122 ::GG3111122(){ note_ctor("_ZN3aaa9GG3111122E", this);} // tgen
}
static void Test__ZN3aaa9GG3111122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111122E, buf);
    ::aaa::GG3111122 *dp, &lv = *(dp=new (buf) ::aaa::GG3111122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111122E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3111122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3111122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3111122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111122E);
    dp->::aaa::GG3111122::~GG3111122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111122E(Test__ZN3aaa9GG3111122E, "_ZN3aaa9GG3111122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111122C1Ev();
extern void _ZN3aaa9GG3111122D1Ev();
Name_Map name_map__ZN3aaa9GG3111122E[] = {
  NSPAIR(_ZN3aaa9GG3111122C1Ev),
  NSPAIR(_ZN3aaa9GG3111122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3111122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111122E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31111223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31111223barEv,_ZThn20_N3aaa9GG31111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31111223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111223barEv,_ZThn20_N3aaa9GG31111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111122E[];
Class_Descriptor cd__ZN3aaa9GG3111122E = {  "_ZN3aaa9GG3111122E", // class name
  bases__ZN3aaa9GG3111122E, 6,
  &(vtc__ZN3aaa9GG3111122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111123  : ::aaa::EE311 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31111233fooEv
  virtual void  bar(); // _ZN3aaa9GG31111233barEv
  ~GG3111123(); // tgen
  GG3111123(); // tgen
};
//SIG(1 _ZN3aaa9GG3111123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31111233fooEv");}
void  aaa::GG3111123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31111233barEv");}
aaa::GG3111123 ::~GG3111123(){ note_dtor("_ZN3aaa9GG3111123E", this);} // tgen
aaa::GG3111123 ::GG3111123(){ note_ctor("_ZN3aaa9GG3111123E", this);} // tgen
}
static void Test__ZN3aaa9GG3111123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111123E, buf);
    ::aaa::GG3111123 *dp, &lv = *(dp=new (buf) ::aaa::GG3111123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111123E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3111123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3111123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3111123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111123E);
    dp->::aaa::GG3111123::~GG3111123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111123E(Test__ZN3aaa9GG3111123E, "_ZN3aaa9GG3111123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111123C1Ev();
extern void _ZN3aaa9GG3111123D1Ev();
Name_Map name_map__ZN3aaa9GG3111123E[] = {
  NSPAIR(_ZN3aaa9GG3111123C1Ev),
  NSPAIR(_ZN3aaa9GG3111123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3111123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111123E[];
extern void _ZN3aaa9GG31111233fooEv();
extern void _ZN3aaa9GG31111233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31111233fooEv,_ZThn8_N3aaa9GG31111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31111233fooEv,_ZThn20_N3aaa9GG31111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31111233barEv,_ZThn20_N3aaa9GG31111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31111233fooEv,_ZThn28_N3aaa9GG31111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31111233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31111233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31111233fooEv,_ZThn8_N3aaa9GG31111233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111233fooEv,_ZThn20_N3aaa9GG31111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111233barEv,_ZThn20_N3aaa9GG31111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31111233fooEv,_ZThn28_N3aaa9GG31111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111123E[];
Class_Descriptor cd__ZN3aaa9GG3111123E = {  "_ZN3aaa9GG3111123E", // class name
  bases__ZN3aaa9GG3111123E, 6,
  &(vtc__ZN3aaa9GG3111123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111131  : ::aaa::EE311 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31111313fooEv
  ~GG3111131(); // tgen
  GG3111131(); // tgen
};
//SIG(1 _ZN3aaa9GG3111131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31111313fooEv");}
aaa::GG3111131 ::~GG3111131(){ note_dtor("_ZN3aaa9GG3111131E", this);} // tgen
aaa::GG3111131 ::GG3111131(){ note_ctor("_ZN3aaa9GG3111131E", this);} // tgen
}
static void Test__ZN3aaa9GG3111131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111131E, buf);
    ::aaa::GG3111131 *dp, &lv = *(dp=new (buf) ::aaa::GG3111131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111131E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3111131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3111131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3111131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111131E);
    dp->::aaa::GG3111131::~GG3111131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111131E(Test__ZN3aaa9GG3111131E, "_ZN3aaa9GG3111131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111131C1Ev();
extern void _ZN3aaa9GG3111131D1Ev();
Name_Map name_map__ZN3aaa9GG3111131E[] = {
  NSPAIR(_ZN3aaa9GG3111131C1Ev),
  NSPAIR(_ZN3aaa9GG3111131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3111131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111131E[];
extern void _ZN3aaa9GG31111313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31111313fooEv,_ZThn8_N3aaa9GG31111313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31111313fooEv,_ZThn20_N3aaa9GG31111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31111313fooEv,_ZThn28_N3aaa9GG31111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31111313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31111313fooEv,_ZThn8_N3aaa9GG31111313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111313fooEv,_ZThn20_N3aaa9GG31111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31111313fooEv,_ZThn28_N3aaa9GG31111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111131E[];
Class_Descriptor cd__ZN3aaa9GG3111131E = {  "_ZN3aaa9GG3111131E", // class name
  bases__ZN3aaa9GG3111131E, 6,
  &(vtc__ZN3aaa9GG3111131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111132  : ::aaa::EE311 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31111323barEv
  ~GG3111132(); // tgen
  GG3111132(); // tgen
};
//SIG(1 _ZN3aaa9GG3111132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31111323barEv");}
aaa::GG3111132 ::~GG3111132(){ note_dtor("_ZN3aaa9GG3111132E", this);} // tgen
aaa::GG3111132 ::GG3111132(){ note_ctor("_ZN3aaa9GG3111132E", this);} // tgen
}
static void Test__ZN3aaa9GG3111132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111132E, buf);
    ::aaa::GG3111132 *dp, &lv = *(dp=new (buf) ::aaa::GG3111132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111132E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3111132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3111132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3111132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111132E);
    dp->::aaa::GG3111132::~GG3111132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111132E(Test__ZN3aaa9GG3111132E, "_ZN3aaa9GG3111132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111132C1Ev();
extern void _ZN3aaa9GG3111132D1Ev();
Name_Map name_map__ZN3aaa9GG3111132E[] = {
  NSPAIR(_ZN3aaa9GG3111132C1Ev),
  NSPAIR(_ZN3aaa9GG3111132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3111132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111132E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31111323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31111323barEv,_ZThn20_N3aaa9GG31111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31111323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111323barEv,_ZThn20_N3aaa9GG31111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111132E[];
Class_Descriptor cd__ZN3aaa9GG3111132E = {  "_ZN3aaa9GG3111132E", // class name
  bases__ZN3aaa9GG3111132E, 6,
  &(vtc__ZN3aaa9GG3111132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111133  : ::aaa::EE311 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31111333fooEv
  virtual void  bar(); // _ZN3aaa9GG31111333barEv
  ~GG3111133(); // tgen
  GG3111133(); // tgen
};
//SIG(1 _ZN3aaa9GG3111133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31111333fooEv");}
void  aaa::GG3111133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31111333barEv");}
aaa::GG3111133 ::~GG3111133(){ note_dtor("_ZN3aaa9GG3111133E", this);} // tgen
aaa::GG3111133 ::GG3111133(){ note_ctor("_ZN3aaa9GG3111133E", this);} // tgen
}
static void Test__ZN3aaa9GG3111133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111133E, buf);
    ::aaa::GG3111133 *dp, &lv = *(dp=new (buf) ::aaa::GG3111133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111133E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3111133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3111133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3111133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111133E);
    dp->::aaa::GG3111133::~GG3111133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111133E(Test__ZN3aaa9GG3111133E, "_ZN3aaa9GG3111133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111133C1Ev();
extern void _ZN3aaa9GG3111133D1Ev();
Name_Map name_map__ZN3aaa9GG3111133E[] = {
  NSPAIR(_ZN3aaa9GG3111133C1Ev),
  NSPAIR(_ZN3aaa9GG3111133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3111133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111133E[];
extern void _ZN3aaa9GG31111333fooEv();
extern void _ZN3aaa9GG31111333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31111333fooEv,_ZThn8_N3aaa9GG31111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31111333fooEv,_ZThn20_N3aaa9GG31111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31111333barEv,_ZThn20_N3aaa9GG31111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31111333fooEv,_ZThn28_N3aaa9GG31111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31111333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31111333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31111333fooEv,_ZThn8_N3aaa9GG31111333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111333fooEv,_ZThn20_N3aaa9GG31111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31111333barEv,_ZThn20_N3aaa9GG31111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31111333fooEv,_ZThn28_N3aaa9GG31111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111133E[];
Class_Descriptor cd__ZN3aaa9GG3111133E = {  "_ZN3aaa9GG3111133E", // class name
  bases__ZN3aaa9GG3111133E, 6,
  &(vtc__ZN3aaa9GG3111133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111211  : ::aaa::EE311 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31112113fooEv
  ~GG3111211(); // tgen
  GG3111211(); // tgen
};
//SIG(1 _ZN3aaa9GG3111211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31112113fooEv");}
aaa::GG3111211 ::~GG3111211(){ note_dtor("_ZN3aaa9GG3111211E", this);} // tgen
aaa::GG3111211 ::GG3111211(){ note_ctor("_ZN3aaa9GG3111211E", this);} // tgen
}
static void Test__ZN3aaa9GG3111211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111211E, buf);
    ::aaa::GG3111211 *dp, &lv = *(dp=new (buf) ::aaa::GG3111211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111211E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3111211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3111211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3111211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111211E);
    dp->::aaa::GG3111211::~GG3111211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111211E(Test__ZN3aaa9GG3111211E, "_ZN3aaa9GG3111211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111211C1Ev();
extern void _ZN3aaa9GG3111211D1Ev();
Name_Map name_map__ZN3aaa9GG3111211E[] = {
  NSPAIR(_ZN3aaa9GG3111211C1Ev),
  NSPAIR(_ZN3aaa9GG3111211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3111211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111211E[];
extern void _ZN3aaa9GG31112113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31112113fooEv,_ZThn8_N3aaa9GG31112113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31112113fooEv,_ZThn20_N3aaa9GG31112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31112113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31112113fooEv,_ZThn8_N3aaa9GG31112113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112113fooEv,_ZThn20_N3aaa9GG31112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111211E[];
Class_Descriptor cd__ZN3aaa9GG3111211E = {  "_ZN3aaa9GG3111211E", // class name
  bases__ZN3aaa9GG3111211E, 6,
  &(vtc__ZN3aaa9GG3111211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111212  : ::aaa::EE311 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31112123barEv
  ~GG3111212(); // tgen
  GG3111212(); // tgen
};
//SIG(1 _ZN3aaa9GG3111212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31112123barEv");}
aaa::GG3111212 ::~GG3111212(){ note_dtor("_ZN3aaa9GG3111212E", this);} // tgen
aaa::GG3111212 ::GG3111212(){ note_ctor("_ZN3aaa9GG3111212E", this);} // tgen
}
static void Test__ZN3aaa9GG3111212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111212E, buf);
    ::aaa::GG3111212 *dp, &lv = *(dp=new (buf) ::aaa::GG3111212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111212E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3111212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3111212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3111212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111212E);
    dp->::aaa::GG3111212::~GG3111212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111212E(Test__ZN3aaa9GG3111212E, "_ZN3aaa9GG3111212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111212C1Ev();
extern void _ZN3aaa9GG3111212D1Ev();
Name_Map name_map__ZN3aaa9GG3111212E[] = {
  NSPAIR(_ZN3aaa9GG3111212C1Ev),
  NSPAIR(_ZN3aaa9GG3111212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3111212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111212E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31112123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31112123barEv,_ZThn28_N3aaa9GG31112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31112123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31112123barEv,_ZThn28_N3aaa9GG31112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111212E[];
Class_Descriptor cd__ZN3aaa9GG3111212E = {  "_ZN3aaa9GG3111212E", // class name
  bases__ZN3aaa9GG3111212E, 6,
  &(vtc__ZN3aaa9GG3111212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111213  : ::aaa::EE311 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31112133fooEv
  virtual void  bar(); // _ZN3aaa9GG31112133barEv
  ~GG3111213(); // tgen
  GG3111213(); // tgen
};
//SIG(1 _ZN3aaa9GG3111213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31112133fooEv");}
void  aaa::GG3111213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31112133barEv");}
aaa::GG3111213 ::~GG3111213(){ note_dtor("_ZN3aaa9GG3111213E", this);} // tgen
aaa::GG3111213 ::GG3111213(){ note_ctor("_ZN3aaa9GG3111213E", this);} // tgen
}
static void Test__ZN3aaa9GG3111213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111213E, buf);
    ::aaa::GG3111213 *dp, &lv = *(dp=new (buf) ::aaa::GG3111213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111213E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3111213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3111213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3111213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111213E);
    dp->::aaa::GG3111213::~GG3111213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111213E(Test__ZN3aaa9GG3111213E, "_ZN3aaa9GG3111213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111213C1Ev();
extern void _ZN3aaa9GG3111213D1Ev();
Name_Map name_map__ZN3aaa9GG3111213E[] = {
  NSPAIR(_ZN3aaa9GG3111213C1Ev),
  NSPAIR(_ZN3aaa9GG3111213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3111213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111213E[];
extern void _ZN3aaa9GG31112133fooEv();
extern void _ZN3aaa9GG31112133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31112133fooEv,_ZThn8_N3aaa9GG31112133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31112133fooEv,_ZThn20_N3aaa9GG31112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31112133barEv,_ZThn28_N3aaa9GG31112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31112133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31112133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31112133fooEv,_ZThn8_N3aaa9GG31112133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112133fooEv,_ZThn20_N3aaa9GG31112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31112133barEv,_ZThn28_N3aaa9GG31112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111213E[];
Class_Descriptor cd__ZN3aaa9GG3111213E = {  "_ZN3aaa9GG3111213E", // class name
  bases__ZN3aaa9GG3111213E, 6,
  &(vtc__ZN3aaa9GG3111213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111221  : ::aaa::EE311 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31112213fooEv
  ~GG3111221(); // tgen
  GG3111221(); // tgen
};
//SIG(1 _ZN3aaa9GG3111221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31112213fooEv");}
aaa::GG3111221 ::~GG3111221(){ note_dtor("_ZN3aaa9GG3111221E", this);} // tgen
aaa::GG3111221 ::GG3111221(){ note_ctor("_ZN3aaa9GG3111221E", this);} // tgen
}
static void Test__ZN3aaa9GG3111221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111221E, buf);
    ::aaa::GG3111221 *dp, &lv = *(dp=new (buf) ::aaa::GG3111221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111221E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3111221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3111221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3111221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111221E);
    dp->::aaa::GG3111221::~GG3111221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111221E(Test__ZN3aaa9GG3111221E, "_ZN3aaa9GG3111221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111221C1Ev();
extern void _ZN3aaa9GG3111221D1Ev();
Name_Map name_map__ZN3aaa9GG3111221E[] = {
  NSPAIR(_ZN3aaa9GG3111221C1Ev),
  NSPAIR(_ZN3aaa9GG3111221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3111221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111221E[];
extern void _ZN3aaa9GG31112213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31112213fooEv,_ZThn8_N3aaa9GG31112213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31112213fooEv,_ZThn20_N3aaa9GG31112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31112213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31112213fooEv,_ZThn8_N3aaa9GG31112213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112213fooEv,_ZThn20_N3aaa9GG31112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111221E[];
Class_Descriptor cd__ZN3aaa9GG3111221E = {  "_ZN3aaa9GG3111221E", // class name
  bases__ZN3aaa9GG3111221E, 6,
  &(vtc__ZN3aaa9GG3111221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111222  : ::aaa::EE311 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31112223barEv
  ~GG3111222(); // tgen
  GG3111222(); // tgen
};
//SIG(1 _ZN3aaa9GG3111222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31112223barEv");}
aaa::GG3111222 ::~GG3111222(){ note_dtor("_ZN3aaa9GG3111222E", this);} // tgen
aaa::GG3111222 ::GG3111222(){ note_ctor("_ZN3aaa9GG3111222E", this);} // tgen
}
static void Test__ZN3aaa9GG3111222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111222E, buf);
    ::aaa::GG3111222 *dp, &lv = *(dp=new (buf) ::aaa::GG3111222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111222E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3111222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3111222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3111222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111222E);
    dp->::aaa::GG3111222::~GG3111222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111222E(Test__ZN3aaa9GG3111222E, "_ZN3aaa9GG3111222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111222C1Ev();
extern void _ZN3aaa9GG3111222D1Ev();
Name_Map name_map__ZN3aaa9GG3111222E[] = {
  NSPAIR(_ZN3aaa9GG3111222C1Ev),
  NSPAIR(_ZN3aaa9GG3111222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3111222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111222E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31112223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31112223barEv,_ZThn20_N3aaa9GG31112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31112223barEv,_ZThn28_N3aaa9GG31112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31112223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112223barEv,_ZThn20_N3aaa9GG31112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31112223barEv,_ZThn28_N3aaa9GG31112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111222E[];
Class_Descriptor cd__ZN3aaa9GG3111222E = {  "_ZN3aaa9GG3111222E", // class name
  bases__ZN3aaa9GG3111222E, 6,
  &(vtc__ZN3aaa9GG3111222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111223  : ::aaa::EE311 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31112233fooEv
  virtual void  bar(); // _ZN3aaa9GG31112233barEv
  ~GG3111223(); // tgen
  GG3111223(); // tgen
};
//SIG(1 _ZN3aaa9GG3111223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31112233fooEv");}
void  aaa::GG3111223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31112233barEv");}
aaa::GG3111223 ::~GG3111223(){ note_dtor("_ZN3aaa9GG3111223E", this);} // tgen
aaa::GG3111223 ::GG3111223(){ note_ctor("_ZN3aaa9GG3111223E", this);} // tgen
}
static void Test__ZN3aaa9GG3111223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111223E, buf);
    ::aaa::GG3111223 *dp, &lv = *(dp=new (buf) ::aaa::GG3111223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111223E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3111223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3111223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3111223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111223E);
    dp->::aaa::GG3111223::~GG3111223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111223E(Test__ZN3aaa9GG3111223E, "_ZN3aaa9GG3111223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111223C1Ev();
extern void _ZN3aaa9GG3111223D1Ev();
Name_Map name_map__ZN3aaa9GG3111223E[] = {
  NSPAIR(_ZN3aaa9GG3111223C1Ev),
  NSPAIR(_ZN3aaa9GG3111223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3111223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111223E[];
extern void _ZN3aaa9GG31112233fooEv();
extern void _ZN3aaa9GG31112233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31112233fooEv,_ZThn8_N3aaa9GG31112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31112233fooEv,_ZThn20_N3aaa9GG31112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31112233barEv,_ZThn20_N3aaa9GG31112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31112233barEv,_ZThn28_N3aaa9GG31112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31112233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31112233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31112233fooEv,_ZThn8_N3aaa9GG31112233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112233fooEv,_ZThn20_N3aaa9GG31112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112233barEv,_ZThn20_N3aaa9GG31112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31112233barEv,_ZThn28_N3aaa9GG31112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111223E[];
Class_Descriptor cd__ZN3aaa9GG3111223E = {  "_ZN3aaa9GG3111223E", // class name
  bases__ZN3aaa9GG3111223E, 6,
  &(vtc__ZN3aaa9GG3111223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111231  : ::aaa::EE311 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31112313fooEv
  ~GG3111231(); // tgen
  GG3111231(); // tgen
};
//SIG(1 _ZN3aaa9GG3111231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31112313fooEv");}
aaa::GG3111231 ::~GG3111231(){ note_dtor("_ZN3aaa9GG3111231E", this);} // tgen
aaa::GG3111231 ::GG3111231(){ note_ctor("_ZN3aaa9GG3111231E", this);} // tgen
}
static void Test__ZN3aaa9GG3111231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111231E, buf);
    ::aaa::GG3111231 *dp, &lv = *(dp=new (buf) ::aaa::GG3111231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111231E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3111231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3111231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3111231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111231E);
    dp->::aaa::GG3111231::~GG3111231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111231E(Test__ZN3aaa9GG3111231E, "_ZN3aaa9GG3111231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111231C1Ev();
extern void _ZN3aaa9GG3111231D1Ev();
Name_Map name_map__ZN3aaa9GG3111231E[] = {
  NSPAIR(_ZN3aaa9GG3111231C1Ev),
  NSPAIR(_ZN3aaa9GG3111231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3111231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111231E[];
extern void _ZN3aaa9GG31112313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31112313fooEv,_ZThn8_N3aaa9GG31112313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31112313fooEv,_ZThn20_N3aaa9GG31112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31112313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31112313fooEv,_ZThn8_N3aaa9GG31112313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112313fooEv,_ZThn20_N3aaa9GG31112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111231E[];
Class_Descriptor cd__ZN3aaa9GG3111231E = {  "_ZN3aaa9GG3111231E", // class name
  bases__ZN3aaa9GG3111231E, 6,
  &(vtc__ZN3aaa9GG3111231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111232  : ::aaa::EE311 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31112323barEv
  ~GG3111232(); // tgen
  GG3111232(); // tgen
};
//SIG(1 _ZN3aaa9GG3111232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31112323barEv");}
aaa::GG3111232 ::~GG3111232(){ note_dtor("_ZN3aaa9GG3111232E", this);} // tgen
aaa::GG3111232 ::GG3111232(){ note_ctor("_ZN3aaa9GG3111232E", this);} // tgen
}
static void Test__ZN3aaa9GG3111232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111232E, buf);
    ::aaa::GG3111232 *dp, &lv = *(dp=new (buf) ::aaa::GG3111232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111232E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3111232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3111232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3111232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111232E);
    dp->::aaa::GG3111232::~GG3111232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111232E(Test__ZN3aaa9GG3111232E, "_ZN3aaa9GG3111232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111232C1Ev();
extern void _ZN3aaa9GG3111232D1Ev();
Name_Map name_map__ZN3aaa9GG3111232E[] = {
  NSPAIR(_ZN3aaa9GG3111232C1Ev),
  NSPAIR(_ZN3aaa9GG3111232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3111232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111232E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31112323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31112323barEv,_ZThn20_N3aaa9GG31112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31112323barEv,_ZThn28_N3aaa9GG31112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31112323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112323barEv,_ZThn20_N3aaa9GG31112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31112323barEv,_ZThn28_N3aaa9GG31112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111232E[];
Class_Descriptor cd__ZN3aaa9GG3111232E = {  "_ZN3aaa9GG3111232E", // class name
  bases__ZN3aaa9GG3111232E, 6,
  &(vtc__ZN3aaa9GG3111232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111233  : ::aaa::EE311 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31112333fooEv
  virtual void  bar(); // _ZN3aaa9GG31112333barEv
  ~GG3111233(); // tgen
  GG3111233(); // tgen
};
//SIG(1 _ZN3aaa9GG3111233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31112333fooEv");}
void  aaa::GG3111233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31112333barEv");}
aaa::GG3111233 ::~GG3111233(){ note_dtor("_ZN3aaa9GG3111233E", this);} // tgen
aaa::GG3111233 ::GG3111233(){ note_ctor("_ZN3aaa9GG3111233E", this);} // tgen
}
static void Test__ZN3aaa9GG3111233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111233E, buf);
    ::aaa::GG3111233 *dp, &lv = *(dp=new (buf) ::aaa::GG3111233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111233E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3111233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3111233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3111233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111233E);
    dp->::aaa::GG3111233::~GG3111233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111233E(Test__ZN3aaa9GG3111233E, "_ZN3aaa9GG3111233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111233C1Ev();
extern void _ZN3aaa9GG3111233D1Ev();
Name_Map name_map__ZN3aaa9GG3111233E[] = {
  NSPAIR(_ZN3aaa9GG3111233C1Ev),
  NSPAIR(_ZN3aaa9GG3111233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3111233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111233E[];
extern void _ZN3aaa9GG31112333fooEv();
extern void _ZN3aaa9GG31112333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31112333fooEv,_ZThn8_N3aaa9GG31112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31112333fooEv,_ZThn20_N3aaa9GG31112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31112333barEv,_ZThn20_N3aaa9GG31112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31112333barEv,_ZThn28_N3aaa9GG31112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31112333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31112333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31112333fooEv,_ZThn8_N3aaa9GG31112333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112333fooEv,_ZThn20_N3aaa9GG31112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31112333barEv,_ZThn20_N3aaa9GG31112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31112333barEv,_ZThn28_N3aaa9GG31112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111233E[];
Class_Descriptor cd__ZN3aaa9GG3111233E = {  "_ZN3aaa9GG3111233E", // class name
  bases__ZN3aaa9GG3111233E, 6,
  &(vtc__ZN3aaa9GG3111233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111311  : ::aaa::EE311 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31113113fooEv
  ~GG3111311(); // tgen
  GG3111311(); // tgen
};
//SIG(1 _ZN3aaa9GG3111311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31113113fooEv");}
aaa::GG3111311 ::~GG3111311(){ note_dtor("_ZN3aaa9GG3111311E", this);} // tgen
aaa::GG3111311 ::GG3111311(){ note_ctor("_ZN3aaa9GG3111311E", this);} // tgen
}
static void Test__ZN3aaa9GG3111311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111311E, buf);
    ::aaa::GG3111311 *dp, &lv = *(dp=new (buf) ::aaa::GG3111311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111311E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3111311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3111311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3111311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111311E);
    dp->::aaa::GG3111311::~GG3111311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111311E(Test__ZN3aaa9GG3111311E, "_ZN3aaa9GG3111311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111311C1Ev();
extern void _ZN3aaa9GG3111311D1Ev();
Name_Map name_map__ZN3aaa9GG3111311E[] = {
  NSPAIR(_ZN3aaa9GG3111311C1Ev),
  NSPAIR(_ZN3aaa9GG3111311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3111311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111311E[];
extern void _ZN3aaa9GG31113113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31113113fooEv,_ZThn8_N3aaa9GG31113113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31113113fooEv,_ZThn20_N3aaa9GG31113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113113fooEv,_ZThn28_N3aaa9GG31113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31113113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31113113fooEv,_ZThn8_N3aaa9GG31113113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113113fooEv,_ZThn20_N3aaa9GG31113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113113fooEv,_ZThn28_N3aaa9GG31113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111311E[];
Class_Descriptor cd__ZN3aaa9GG3111311E = {  "_ZN3aaa9GG3111311E", // class name
  bases__ZN3aaa9GG3111311E, 6,
  &(vtc__ZN3aaa9GG3111311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111312  : ::aaa::EE311 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31113123barEv
  ~GG3111312(); // tgen
  GG3111312(); // tgen
};
//SIG(1 _ZN3aaa9GG3111312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31113123barEv");}
aaa::GG3111312 ::~GG3111312(){ note_dtor("_ZN3aaa9GG3111312E", this);} // tgen
aaa::GG3111312 ::GG3111312(){ note_ctor("_ZN3aaa9GG3111312E", this);} // tgen
}
static void Test__ZN3aaa9GG3111312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111312E, buf);
    ::aaa::GG3111312 *dp, &lv = *(dp=new (buf) ::aaa::GG3111312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111312E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3111312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3111312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3111312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111312E);
    dp->::aaa::GG3111312::~GG3111312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111312E(Test__ZN3aaa9GG3111312E, "_ZN3aaa9GG3111312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111312C1Ev();
extern void _ZN3aaa9GG3111312D1Ev();
Name_Map name_map__ZN3aaa9GG3111312E[] = {
  NSPAIR(_ZN3aaa9GG3111312C1Ev),
  NSPAIR(_ZN3aaa9GG3111312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3111312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111312E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31113123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113123barEv,_ZThn28_N3aaa9GG31113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31113123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113123barEv,_ZThn28_N3aaa9GG31113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111312E[];
Class_Descriptor cd__ZN3aaa9GG3111312E = {  "_ZN3aaa9GG3111312E", // class name
  bases__ZN3aaa9GG3111312E, 6,
  &(vtc__ZN3aaa9GG3111312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111313  : ::aaa::EE311 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31113133fooEv
  virtual void  bar(); // _ZN3aaa9GG31113133barEv
  ~GG3111313(); // tgen
  GG3111313(); // tgen
};
//SIG(1 _ZN3aaa9GG3111313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31113133fooEv");}
void  aaa::GG3111313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31113133barEv");}
aaa::GG3111313 ::~GG3111313(){ note_dtor("_ZN3aaa9GG3111313E", this);} // tgen
aaa::GG3111313 ::GG3111313(){ note_ctor("_ZN3aaa9GG3111313E", this);} // tgen
}
static void Test__ZN3aaa9GG3111313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111313E, buf);
    ::aaa::GG3111313 *dp, &lv = *(dp=new (buf) ::aaa::GG3111313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111313E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3111313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3111313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3111313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111313E);
    dp->::aaa::GG3111313::~GG3111313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111313E(Test__ZN3aaa9GG3111313E, "_ZN3aaa9GG3111313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111313C1Ev();
extern void _ZN3aaa9GG3111313D1Ev();
Name_Map name_map__ZN3aaa9GG3111313E[] = {
  NSPAIR(_ZN3aaa9GG3111313C1Ev),
  NSPAIR(_ZN3aaa9GG3111313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3111313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111313E[];
extern void _ZN3aaa9GG31113133fooEv();
extern void _ZN3aaa9GG31113133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31113133fooEv,_ZThn8_N3aaa9GG31113133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31113133fooEv,_ZThn20_N3aaa9GG31113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113133fooEv,_ZThn28_N3aaa9GG31113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113133barEv,_ZThn28_N3aaa9GG31113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31113133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31113133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31113133fooEv,_ZThn8_N3aaa9GG31113133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113133fooEv,_ZThn20_N3aaa9GG31113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113133fooEv,_ZThn28_N3aaa9GG31113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113133barEv,_ZThn28_N3aaa9GG31113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111313E[];
Class_Descriptor cd__ZN3aaa9GG3111313E = {  "_ZN3aaa9GG3111313E", // class name
  bases__ZN3aaa9GG3111313E, 6,
  &(vtc__ZN3aaa9GG3111313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111321  : ::aaa::EE311 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31113213fooEv
  ~GG3111321(); // tgen
  GG3111321(); // tgen
};
//SIG(1 _ZN3aaa9GG3111321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31113213fooEv");}
aaa::GG3111321 ::~GG3111321(){ note_dtor("_ZN3aaa9GG3111321E", this);} // tgen
aaa::GG3111321 ::GG3111321(){ note_ctor("_ZN3aaa9GG3111321E", this);} // tgen
}
static void Test__ZN3aaa9GG3111321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111321E, buf);
    ::aaa::GG3111321 *dp, &lv = *(dp=new (buf) ::aaa::GG3111321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111321E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3111321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3111321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3111321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111321E);
    dp->::aaa::GG3111321::~GG3111321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111321E(Test__ZN3aaa9GG3111321E, "_ZN3aaa9GG3111321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111321C1Ev();
extern void _ZN3aaa9GG3111321D1Ev();
Name_Map name_map__ZN3aaa9GG3111321E[] = {
  NSPAIR(_ZN3aaa9GG3111321C1Ev),
  NSPAIR(_ZN3aaa9GG3111321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3111321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111321E[];
extern void _ZN3aaa9GG31113213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31113213fooEv,_ZThn8_N3aaa9GG31113213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31113213fooEv,_ZThn20_N3aaa9GG31113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31113213fooEv,_ZThn28_N3aaa9GG31113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31113213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31113213fooEv,_ZThn8_N3aaa9GG31113213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113213fooEv,_ZThn20_N3aaa9GG31113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113213fooEv,_ZThn28_N3aaa9GG31113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111321E[];
Class_Descriptor cd__ZN3aaa9GG3111321E = {  "_ZN3aaa9GG3111321E", // class name
  bases__ZN3aaa9GG3111321E, 6,
  &(vtc__ZN3aaa9GG3111321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111322  : ::aaa::EE311 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31113223barEv
  ~GG3111322(); // tgen
  GG3111322(); // tgen
};
//SIG(1 _ZN3aaa9GG3111322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31113223barEv");}
aaa::GG3111322 ::~GG3111322(){ note_dtor("_ZN3aaa9GG3111322E", this);} // tgen
aaa::GG3111322 ::GG3111322(){ note_ctor("_ZN3aaa9GG3111322E", this);} // tgen
}
static void Test__ZN3aaa9GG3111322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111322E, buf);
    ::aaa::GG3111322 *dp, &lv = *(dp=new (buf) ::aaa::GG3111322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111322E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3111322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3111322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3111322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111322E);
    dp->::aaa::GG3111322::~GG3111322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111322E(Test__ZN3aaa9GG3111322E, "_ZN3aaa9GG3111322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111322C1Ev();
extern void _ZN3aaa9GG3111322D1Ev();
Name_Map name_map__ZN3aaa9GG3111322E[] = {
  NSPAIR(_ZN3aaa9GG3111322C1Ev),
  NSPAIR(_ZN3aaa9GG3111322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3111322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111322E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31113223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31113223barEv,_ZThn20_N3aaa9GG31113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31113223barEv,_ZThn28_N3aaa9GG31113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31113223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113223barEv,_ZThn20_N3aaa9GG31113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113223barEv,_ZThn28_N3aaa9GG31113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111322E[];
Class_Descriptor cd__ZN3aaa9GG3111322E = {  "_ZN3aaa9GG3111322E", // class name
  bases__ZN3aaa9GG3111322E, 6,
  &(vtc__ZN3aaa9GG3111322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111323  : ::aaa::EE311 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31113233fooEv
  virtual void  bar(); // _ZN3aaa9GG31113233barEv
  ~GG3111323(); // tgen
  GG3111323(); // tgen
};
//SIG(1 _ZN3aaa9GG3111323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31113233fooEv");}
void  aaa::GG3111323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31113233barEv");}
aaa::GG3111323 ::~GG3111323(){ note_dtor("_ZN3aaa9GG3111323E", this);} // tgen
aaa::GG3111323 ::GG3111323(){ note_ctor("_ZN3aaa9GG3111323E", this);} // tgen
}
static void Test__ZN3aaa9GG3111323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111323E, buf);
    ::aaa::GG3111323 *dp, &lv = *(dp=new (buf) ::aaa::GG3111323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111323E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3111323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3111323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3111323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111323E);
    dp->::aaa::GG3111323::~GG3111323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111323E(Test__ZN3aaa9GG3111323E, "_ZN3aaa9GG3111323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111323C1Ev();
extern void _ZN3aaa9GG3111323D1Ev();
Name_Map name_map__ZN3aaa9GG3111323E[] = {
  NSPAIR(_ZN3aaa9GG3111323C1Ev),
  NSPAIR(_ZN3aaa9GG3111323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3111323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111323E[];
extern void _ZN3aaa9GG31113233fooEv();
extern void _ZN3aaa9GG31113233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31113233fooEv,_ZThn8_N3aaa9GG31113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31113233fooEv,_ZThn20_N3aaa9GG31113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31113233barEv,_ZThn20_N3aaa9GG31113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113233fooEv,_ZThn28_N3aaa9GG31113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113233barEv,_ZThn28_N3aaa9GG31113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31113233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31113233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31113233fooEv,_ZThn8_N3aaa9GG31113233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113233fooEv,_ZThn20_N3aaa9GG31113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113233barEv,_ZThn20_N3aaa9GG31113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113233fooEv,_ZThn28_N3aaa9GG31113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113233barEv,_ZThn28_N3aaa9GG31113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111323E[];
Class_Descriptor cd__ZN3aaa9GG3111323E = {  "_ZN3aaa9GG3111323E", // class name
  bases__ZN3aaa9GG3111323E, 6,
  &(vtc__ZN3aaa9GG3111323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111331  : ::aaa::EE311 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31113313fooEv
  ~GG3111331(); // tgen
  GG3111331(); // tgen
};
//SIG(1 _ZN3aaa9GG3111331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31113313fooEv");}
aaa::GG3111331 ::~GG3111331(){ note_dtor("_ZN3aaa9GG3111331E", this);} // tgen
aaa::GG3111331 ::GG3111331(){ note_ctor("_ZN3aaa9GG3111331E", this);} // tgen
}
static void Test__ZN3aaa9GG3111331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111331E, buf);
    ::aaa::GG3111331 *dp, &lv = *(dp=new (buf) ::aaa::GG3111331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111331E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3111331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3111331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3111331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111331E);
    dp->::aaa::GG3111331::~GG3111331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111331E(Test__ZN3aaa9GG3111331E, "_ZN3aaa9GG3111331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111331C1Ev();
extern void _ZN3aaa9GG3111331D1Ev();
Name_Map name_map__ZN3aaa9GG3111331E[] = {
  NSPAIR(_ZN3aaa9GG3111331C1Ev),
  NSPAIR(_ZN3aaa9GG3111331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3111331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111331E[];
extern void _ZN3aaa9GG31113313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31113313fooEv,_ZThn8_N3aaa9GG31113313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31113313fooEv,_ZThn20_N3aaa9GG31113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31113313fooEv,_ZThn28_N3aaa9GG31113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31113313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31113313fooEv,_ZThn8_N3aaa9GG31113313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113313fooEv,_ZThn20_N3aaa9GG31113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113313fooEv,_ZThn28_N3aaa9GG31113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111331E[];
Class_Descriptor cd__ZN3aaa9GG3111331E = {  "_ZN3aaa9GG3111331E", // class name
  bases__ZN3aaa9GG3111331E, 6,
  &(vtc__ZN3aaa9GG3111331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111332  : ::aaa::EE311 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31113323barEv
  ~GG3111332(); // tgen
  GG3111332(); // tgen
};
//SIG(1 _ZN3aaa9GG3111332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3111332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31113323barEv");}
aaa::GG3111332 ::~GG3111332(){ note_dtor("_ZN3aaa9GG3111332E", this);} // tgen
aaa::GG3111332 ::GG3111332(){ note_ctor("_ZN3aaa9GG3111332E", this);} // tgen
}
static void Test__ZN3aaa9GG3111332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111332E, buf);
    ::aaa::GG3111332 *dp, &lv = *(dp=new (buf) ::aaa::GG3111332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111332E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3111332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3111332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3111332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111332E);
    dp->::aaa::GG3111332::~GG3111332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111332E(Test__ZN3aaa9GG3111332E, "_ZN3aaa9GG3111332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111332C1Ev();
extern void _ZN3aaa9GG3111332D1Ev();
Name_Map name_map__ZN3aaa9GG3111332E[] = {
  NSPAIR(_ZN3aaa9GG3111332C1Ev),
  NSPAIR(_ZN3aaa9GG3111332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3111332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111332E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31113323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31113323barEv,_ZThn20_N3aaa9GG31113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113323barEv,_ZThn28_N3aaa9GG31113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31113323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113323barEv,_ZThn20_N3aaa9GG31113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113323barEv,_ZThn28_N3aaa9GG31113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111332E[];
Class_Descriptor cd__ZN3aaa9GG3111332E = {  "_ZN3aaa9GG3111332E", // class name
  bases__ZN3aaa9GG3111332E, 6,
  &(vtc__ZN3aaa9GG3111332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3111333  : ::aaa::EE311 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31113333fooEv
  virtual void  bar(); // _ZN3aaa9GG31113333barEv
  ~GG3111333(); // tgen
  GG3111333(); // tgen
};
//SIG(1 _ZN3aaa9GG3111333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3111333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31113333fooEv");}
void  aaa::GG3111333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31113333barEv");}
aaa::GG3111333 ::~GG3111333(){ note_dtor("_ZN3aaa9GG3111333E", this);} // tgen
aaa::GG3111333 ::GG3111333(){ note_ctor("_ZN3aaa9GG3111333E", this);} // tgen
}
static void Test__ZN3aaa9GG3111333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3111333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3111333E, buf);
    ::aaa::GG3111333 *dp, &lv = *(dp=new (buf) ::aaa::GG3111333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3111333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3111333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3111333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3111333E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3111333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3111333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3111333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3111333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3111333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3111333E);
    dp->::aaa::GG3111333::~GG3111333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3111333E(Test__ZN3aaa9GG3111333E, "_ZN3aaa9GG3111333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3111333C1Ev();
extern void _ZN3aaa9GG3111333D1Ev();
Name_Map name_map__ZN3aaa9GG3111333E[] = {
  NSPAIR(_ZN3aaa9GG3111333C1Ev),
  NSPAIR(_ZN3aaa9GG3111333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3111333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3111333E[];
extern void _ZN3aaa9GG31113333fooEv();
extern void _ZN3aaa9GG31113333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31113333fooEv,_ZThn8_N3aaa9GG31113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31113333fooEv,_ZThn20_N3aaa9GG31113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31113333barEv,_ZThn20_N3aaa9GG31113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113333fooEv,_ZThn28_N3aaa9GG31113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31113333barEv,_ZThn28_N3aaa9GG31113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3111333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31113333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31113333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31113333fooEv,_ZThn8_N3aaa9GG31113333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113333fooEv,_ZThn20_N3aaa9GG31113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31113333barEv,_ZThn20_N3aaa9GG31113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3111333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113333fooEv,_ZThn28_N3aaa9GG31113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31113333barEv,_ZThn28_N3aaa9GG31113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3111333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3111333E[];
Class_Descriptor cd__ZN3aaa9GG3111333E = {  "_ZN3aaa9GG3111333E", // class name
  bases__ZN3aaa9GG3111333E, 6,
  &(vtc__ZN3aaa9GG3111333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3111333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3111333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112111  : ::aaa::EE311 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31121113fooEv
  ~GG3112111(); // tgen
  GG3112111(); // tgen
};
//SIG(1 _ZN3aaa9GG3112111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31121113fooEv");}
aaa::GG3112111 ::~GG3112111(){ note_dtor("_ZN3aaa9GG3112111E", this);} // tgen
aaa::GG3112111 ::GG3112111(){ note_ctor("_ZN3aaa9GG3112111E", this);} // tgen
}
static void Test__ZN3aaa9GG3112111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112111E, buf);
    ::aaa::GG3112111 *dp, &lv = *(dp=new (buf) ::aaa::GG3112111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112111E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3112111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3112111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3112111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112111E);
    dp->::aaa::GG3112111::~GG3112111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112111E(Test__ZN3aaa9GG3112111E, "_ZN3aaa9GG3112111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112111C1Ev();
extern void _ZN3aaa9GG3112111D1Ev();
Name_Map name_map__ZN3aaa9GG3112111E[] = {
  NSPAIR(_ZN3aaa9GG3112111C1Ev),
  NSPAIR(_ZN3aaa9GG3112111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3112111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112111E[];
extern void _ZN3aaa9GG31121113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31121113fooEv,_ZThn8_N3aaa9GG31121113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31121113fooEv,_ZThn20_N3aaa9GG31121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31121113fooEv,_ZThn28_N3aaa9GG31121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31121113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31121113fooEv,_ZThn8_N3aaa9GG31121113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121113fooEv,_ZThn20_N3aaa9GG31121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31121113fooEv,_ZThn28_N3aaa9GG31121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112111E[];
Class_Descriptor cd__ZN3aaa9GG3112111E = {  "_ZN3aaa9GG3112111E", // class name
  bases__ZN3aaa9GG3112111E, 6,
  &(vtc__ZN3aaa9GG3112111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112112  : ::aaa::EE311 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31121123barEv
  ~GG3112112(); // tgen
  GG3112112(); // tgen
};
//SIG(1 _ZN3aaa9GG3112112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31121123barEv");}
aaa::GG3112112 ::~GG3112112(){ note_dtor("_ZN3aaa9GG3112112E", this);} // tgen
aaa::GG3112112 ::GG3112112(){ note_ctor("_ZN3aaa9GG3112112E", this);} // tgen
}
static void Test__ZN3aaa9GG3112112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112112E, buf);
    ::aaa::GG3112112 *dp, &lv = *(dp=new (buf) ::aaa::GG3112112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112112E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3112112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3112112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3112112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112112E);
    dp->::aaa::GG3112112::~GG3112112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112112E(Test__ZN3aaa9GG3112112E, "_ZN3aaa9GG3112112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112112C1Ev();
extern void _ZN3aaa9GG3112112D1Ev();
Name_Map name_map__ZN3aaa9GG3112112E[] = {
  NSPAIR(_ZN3aaa9GG3112112C1Ev),
  NSPAIR(_ZN3aaa9GG3112112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3112112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112112E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31121123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31121123barEv,_ZThn20_N3aaa9GG31121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31121123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121123barEv,_ZThn20_N3aaa9GG31121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112112E[];
Class_Descriptor cd__ZN3aaa9GG3112112E = {  "_ZN3aaa9GG3112112E", // class name
  bases__ZN3aaa9GG3112112E, 6,
  &(vtc__ZN3aaa9GG3112112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112113  : ::aaa::EE311 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31121133fooEv
  virtual void  bar(); // _ZN3aaa9GG31121133barEv
  ~GG3112113(); // tgen
  GG3112113(); // tgen
};
//SIG(1 _ZN3aaa9GG3112113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31121133fooEv");}
void  aaa::GG3112113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31121133barEv");}
aaa::GG3112113 ::~GG3112113(){ note_dtor("_ZN3aaa9GG3112113E", this);} // tgen
aaa::GG3112113 ::GG3112113(){ note_ctor("_ZN3aaa9GG3112113E", this);} // tgen
}
static void Test__ZN3aaa9GG3112113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112113E, buf);
    ::aaa::GG3112113 *dp, &lv = *(dp=new (buf) ::aaa::GG3112113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112113E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3112113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3112113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3112113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112113E);
    dp->::aaa::GG3112113::~GG3112113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112113E(Test__ZN3aaa9GG3112113E, "_ZN3aaa9GG3112113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112113C1Ev();
extern void _ZN3aaa9GG3112113D1Ev();
Name_Map name_map__ZN3aaa9GG3112113E[] = {
  NSPAIR(_ZN3aaa9GG3112113C1Ev),
  NSPAIR(_ZN3aaa9GG3112113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3112113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112113E[];
extern void _ZN3aaa9GG31121133fooEv();
extern void _ZN3aaa9GG31121133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31121133fooEv,_ZThn8_N3aaa9GG31121133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31121133barEv,_ZThn20_N3aaa9GG31121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31121133fooEv,_ZThn20_N3aaa9GG31121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31121133fooEv,_ZThn28_N3aaa9GG31121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31121133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31121133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31121133fooEv,_ZThn8_N3aaa9GG31121133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121133barEv,_ZThn20_N3aaa9GG31121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121133fooEv,_ZThn20_N3aaa9GG31121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31121133fooEv,_ZThn28_N3aaa9GG31121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112113E[];
Class_Descriptor cd__ZN3aaa9GG3112113E = {  "_ZN3aaa9GG3112113E", // class name
  bases__ZN3aaa9GG3112113E, 6,
  &(vtc__ZN3aaa9GG3112113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112121  : ::aaa::EE311 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31121213fooEv
  ~GG3112121(); // tgen
  GG3112121(); // tgen
};
//SIG(1 _ZN3aaa9GG3112121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31121213fooEv");}
aaa::GG3112121 ::~GG3112121(){ note_dtor("_ZN3aaa9GG3112121E", this);} // tgen
aaa::GG3112121 ::GG3112121(){ note_ctor("_ZN3aaa9GG3112121E", this);} // tgen
}
static void Test__ZN3aaa9GG3112121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112121E, buf);
    ::aaa::GG3112121 *dp, &lv = *(dp=new (buf) ::aaa::GG3112121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112121E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3112121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3112121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3112121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112121E);
    dp->::aaa::GG3112121::~GG3112121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112121E(Test__ZN3aaa9GG3112121E, "_ZN3aaa9GG3112121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112121C1Ev();
extern void _ZN3aaa9GG3112121D1Ev();
Name_Map name_map__ZN3aaa9GG3112121E[] = {
  NSPAIR(_ZN3aaa9GG3112121C1Ev),
  NSPAIR(_ZN3aaa9GG3112121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3112121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112121E[];
extern void _ZN3aaa9GG31121213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31121213fooEv,_ZThn8_N3aaa9GG31121213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31121213fooEv,_ZThn28_N3aaa9GG31121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31121213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31121213fooEv,_ZThn8_N3aaa9GG31121213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31121213fooEv,_ZThn28_N3aaa9GG31121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112121E[];
Class_Descriptor cd__ZN3aaa9GG3112121E = {  "_ZN3aaa9GG3112121E", // class name
  bases__ZN3aaa9GG3112121E, 6,
  &(vtc__ZN3aaa9GG3112121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112122  : ::aaa::EE311 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31121223barEv
  ~GG3112122(); // tgen
  GG3112122(); // tgen
};
//SIG(1 _ZN3aaa9GG3112122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31121223barEv");}
aaa::GG3112122 ::~GG3112122(){ note_dtor("_ZN3aaa9GG3112122E", this);} // tgen
aaa::GG3112122 ::GG3112122(){ note_ctor("_ZN3aaa9GG3112122E", this);} // tgen
}
static void Test__ZN3aaa9GG3112122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112122E, buf);
    ::aaa::GG3112122 *dp, &lv = *(dp=new (buf) ::aaa::GG3112122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112122E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3112122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3112122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3112122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112122E);
    dp->::aaa::GG3112122::~GG3112122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112122E(Test__ZN3aaa9GG3112122E, "_ZN3aaa9GG3112122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112122C1Ev();
extern void _ZN3aaa9GG3112122D1Ev();
Name_Map name_map__ZN3aaa9GG3112122E[] = {
  NSPAIR(_ZN3aaa9GG3112122C1Ev),
  NSPAIR(_ZN3aaa9GG3112122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3112122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112122E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31121223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31121223barEv,_ZThn20_N3aaa9GG31121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31121223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121223barEv,_ZThn20_N3aaa9GG31121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112122E[];
Class_Descriptor cd__ZN3aaa9GG3112122E = {  "_ZN3aaa9GG3112122E", // class name
  bases__ZN3aaa9GG3112122E, 6,
  &(vtc__ZN3aaa9GG3112122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112123  : ::aaa::EE311 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31121233fooEv
  virtual void  bar(); // _ZN3aaa9GG31121233barEv
  ~GG3112123(); // tgen
  GG3112123(); // tgen
};
//SIG(1 _ZN3aaa9GG3112123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31121233fooEv");}
void  aaa::GG3112123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31121233barEv");}
aaa::GG3112123 ::~GG3112123(){ note_dtor("_ZN3aaa9GG3112123E", this);} // tgen
aaa::GG3112123 ::GG3112123(){ note_ctor("_ZN3aaa9GG3112123E", this);} // tgen
}
static void Test__ZN3aaa9GG3112123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112123E, buf);
    ::aaa::GG3112123 *dp, &lv = *(dp=new (buf) ::aaa::GG3112123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112123E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3112123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3112123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3112123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112123E);
    dp->::aaa::GG3112123::~GG3112123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112123E(Test__ZN3aaa9GG3112123E, "_ZN3aaa9GG3112123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112123C1Ev();
extern void _ZN3aaa9GG3112123D1Ev();
Name_Map name_map__ZN3aaa9GG3112123E[] = {
  NSPAIR(_ZN3aaa9GG3112123C1Ev),
  NSPAIR(_ZN3aaa9GG3112123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3112123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112123E[];
extern void _ZN3aaa9GG31121233fooEv();
extern void _ZN3aaa9GG31121233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31121233fooEv,_ZThn8_N3aaa9GG31121233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31121233barEv,_ZThn20_N3aaa9GG31121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31121233fooEv,_ZThn28_N3aaa9GG31121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31121233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31121233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31121233fooEv,_ZThn8_N3aaa9GG31121233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121233barEv,_ZThn20_N3aaa9GG31121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31121233fooEv,_ZThn28_N3aaa9GG31121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112123E[];
Class_Descriptor cd__ZN3aaa9GG3112123E = {  "_ZN3aaa9GG3112123E", // class name
  bases__ZN3aaa9GG3112123E, 6,
  &(vtc__ZN3aaa9GG3112123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112131  : ::aaa::EE311 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31121313fooEv
  ~GG3112131(); // tgen
  GG3112131(); // tgen
};
//SIG(1 _ZN3aaa9GG3112131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31121313fooEv");}
aaa::GG3112131 ::~GG3112131(){ note_dtor("_ZN3aaa9GG3112131E", this);} // tgen
aaa::GG3112131 ::GG3112131(){ note_ctor("_ZN3aaa9GG3112131E", this);} // tgen
}
static void Test__ZN3aaa9GG3112131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112131E, buf);
    ::aaa::GG3112131 *dp, &lv = *(dp=new (buf) ::aaa::GG3112131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112131E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3112131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3112131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3112131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112131E);
    dp->::aaa::GG3112131::~GG3112131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112131E(Test__ZN3aaa9GG3112131E, "_ZN3aaa9GG3112131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112131C1Ev();
extern void _ZN3aaa9GG3112131D1Ev();
Name_Map name_map__ZN3aaa9GG3112131E[] = {
  NSPAIR(_ZN3aaa9GG3112131C1Ev),
  NSPAIR(_ZN3aaa9GG3112131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3112131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112131E[];
extern void _ZN3aaa9GG31121313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31121313fooEv,_ZThn8_N3aaa9GG31121313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31121313fooEv,_ZThn20_N3aaa9GG31121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31121313fooEv,_ZThn28_N3aaa9GG31121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31121313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31121313fooEv,_ZThn8_N3aaa9GG31121313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121313fooEv,_ZThn20_N3aaa9GG31121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31121313fooEv,_ZThn28_N3aaa9GG31121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112131E[];
Class_Descriptor cd__ZN3aaa9GG3112131E = {  "_ZN3aaa9GG3112131E", // class name
  bases__ZN3aaa9GG3112131E, 6,
  &(vtc__ZN3aaa9GG3112131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112132  : ::aaa::EE311 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31121323barEv
  ~GG3112132(); // tgen
  GG3112132(); // tgen
};
//SIG(1 _ZN3aaa9GG3112132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31121323barEv");}
aaa::GG3112132 ::~GG3112132(){ note_dtor("_ZN3aaa9GG3112132E", this);} // tgen
aaa::GG3112132 ::GG3112132(){ note_ctor("_ZN3aaa9GG3112132E", this);} // tgen
}
static void Test__ZN3aaa9GG3112132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112132E, buf);
    ::aaa::GG3112132 *dp, &lv = *(dp=new (buf) ::aaa::GG3112132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112132E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3112132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3112132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3112132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112132E);
    dp->::aaa::GG3112132::~GG3112132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112132E(Test__ZN3aaa9GG3112132E, "_ZN3aaa9GG3112132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112132C1Ev();
extern void _ZN3aaa9GG3112132D1Ev();
Name_Map name_map__ZN3aaa9GG3112132E[] = {
  NSPAIR(_ZN3aaa9GG3112132C1Ev),
  NSPAIR(_ZN3aaa9GG3112132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3112132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112132E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31121323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31121323barEv,_ZThn20_N3aaa9GG31121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31121323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121323barEv,_ZThn20_N3aaa9GG31121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112132E[];
Class_Descriptor cd__ZN3aaa9GG3112132E = {  "_ZN3aaa9GG3112132E", // class name
  bases__ZN3aaa9GG3112132E, 6,
  &(vtc__ZN3aaa9GG3112132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112133  : ::aaa::EE311 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31121333fooEv
  virtual void  bar(); // _ZN3aaa9GG31121333barEv
  ~GG3112133(); // tgen
  GG3112133(); // tgen
};
//SIG(1 _ZN3aaa9GG3112133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31121333fooEv");}
void  aaa::GG3112133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31121333barEv");}
aaa::GG3112133 ::~GG3112133(){ note_dtor("_ZN3aaa9GG3112133E", this);} // tgen
aaa::GG3112133 ::GG3112133(){ note_ctor("_ZN3aaa9GG3112133E", this);} // tgen
}
static void Test__ZN3aaa9GG3112133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112133E, buf);
    ::aaa::GG3112133 *dp, &lv = *(dp=new (buf) ::aaa::GG3112133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112133E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3112133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3112133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3112133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112133E);
    dp->::aaa::GG3112133::~GG3112133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112133E(Test__ZN3aaa9GG3112133E, "_ZN3aaa9GG3112133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112133C1Ev();
extern void _ZN3aaa9GG3112133D1Ev();
Name_Map name_map__ZN3aaa9GG3112133E[] = {
  NSPAIR(_ZN3aaa9GG3112133C1Ev),
  NSPAIR(_ZN3aaa9GG3112133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3112133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112133E[];
extern void _ZN3aaa9GG31121333fooEv();
extern void _ZN3aaa9GG31121333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31121333fooEv,_ZThn8_N3aaa9GG31121333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31121333barEv,_ZThn20_N3aaa9GG31121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31121333fooEv,_ZThn20_N3aaa9GG31121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31121333fooEv,_ZThn28_N3aaa9GG31121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31121333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31121333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31121333fooEv,_ZThn8_N3aaa9GG31121333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121333barEv,_ZThn20_N3aaa9GG31121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31121333fooEv,_ZThn20_N3aaa9GG31121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31121333fooEv,_ZThn28_N3aaa9GG31121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112133E[];
Class_Descriptor cd__ZN3aaa9GG3112133E = {  "_ZN3aaa9GG3112133E", // class name
  bases__ZN3aaa9GG3112133E, 6,
  &(vtc__ZN3aaa9GG3112133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112211  : ::aaa::EE311 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31122113fooEv
  ~GG3112211(); // tgen
  GG3112211(); // tgen
};
//SIG(1 _ZN3aaa9GG3112211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31122113fooEv");}
aaa::GG3112211 ::~GG3112211(){ note_dtor("_ZN3aaa9GG3112211E", this);} // tgen
aaa::GG3112211 ::GG3112211(){ note_ctor("_ZN3aaa9GG3112211E", this);} // tgen
}
static void Test__ZN3aaa9GG3112211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112211E, buf);
    ::aaa::GG3112211 *dp, &lv = *(dp=new (buf) ::aaa::GG3112211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112211E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3112211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3112211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3112211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112211E);
    dp->::aaa::GG3112211::~GG3112211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112211E(Test__ZN3aaa9GG3112211E, "_ZN3aaa9GG3112211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112211C1Ev();
extern void _ZN3aaa9GG3112211D1Ev();
Name_Map name_map__ZN3aaa9GG3112211E[] = {
  NSPAIR(_ZN3aaa9GG3112211C1Ev),
  NSPAIR(_ZN3aaa9GG3112211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3112211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112211E[];
extern void _ZN3aaa9GG31122113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31122113fooEv,_ZThn8_N3aaa9GG31122113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31122113fooEv,_ZThn20_N3aaa9GG31122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31122113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31122113fooEv,_ZThn8_N3aaa9GG31122113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122113fooEv,_ZThn20_N3aaa9GG31122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112211E[];
Class_Descriptor cd__ZN3aaa9GG3112211E = {  "_ZN3aaa9GG3112211E", // class name
  bases__ZN3aaa9GG3112211E, 6,
  &(vtc__ZN3aaa9GG3112211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112212  : ::aaa::EE311 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31122123barEv
  ~GG3112212(); // tgen
  GG3112212(); // tgen
};
//SIG(1 _ZN3aaa9GG3112212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31122123barEv");}
aaa::GG3112212 ::~GG3112212(){ note_dtor("_ZN3aaa9GG3112212E", this);} // tgen
aaa::GG3112212 ::GG3112212(){ note_ctor("_ZN3aaa9GG3112212E", this);} // tgen
}
static void Test__ZN3aaa9GG3112212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112212E, buf);
    ::aaa::GG3112212 *dp, &lv = *(dp=new (buf) ::aaa::GG3112212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112212E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3112212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3112212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3112212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112212E);
    dp->::aaa::GG3112212::~GG3112212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112212E(Test__ZN3aaa9GG3112212E, "_ZN3aaa9GG3112212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112212C1Ev();
extern void _ZN3aaa9GG3112212D1Ev();
Name_Map name_map__ZN3aaa9GG3112212E[] = {
  NSPAIR(_ZN3aaa9GG3112212C1Ev),
  NSPAIR(_ZN3aaa9GG3112212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3112212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112212E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31122123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31122123barEv,_ZThn20_N3aaa9GG31122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31122123barEv,_ZThn28_N3aaa9GG31122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31122123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122123barEv,_ZThn20_N3aaa9GG31122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31122123barEv,_ZThn28_N3aaa9GG31122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112212E[];
Class_Descriptor cd__ZN3aaa9GG3112212E = {  "_ZN3aaa9GG3112212E", // class name
  bases__ZN3aaa9GG3112212E, 6,
  &(vtc__ZN3aaa9GG3112212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112213  : ::aaa::EE311 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31122133fooEv
  virtual void  bar(); // _ZN3aaa9GG31122133barEv
  ~GG3112213(); // tgen
  GG3112213(); // tgen
};
//SIG(1 _ZN3aaa9GG3112213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31122133fooEv");}
void  aaa::GG3112213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31122133barEv");}
aaa::GG3112213 ::~GG3112213(){ note_dtor("_ZN3aaa9GG3112213E", this);} // tgen
aaa::GG3112213 ::GG3112213(){ note_ctor("_ZN3aaa9GG3112213E", this);} // tgen
}
static void Test__ZN3aaa9GG3112213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112213E, buf);
    ::aaa::GG3112213 *dp, &lv = *(dp=new (buf) ::aaa::GG3112213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112213E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3112213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3112213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3112213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112213E);
    dp->::aaa::GG3112213::~GG3112213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112213E(Test__ZN3aaa9GG3112213E, "_ZN3aaa9GG3112213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112213C1Ev();
extern void _ZN3aaa9GG3112213D1Ev();
Name_Map name_map__ZN3aaa9GG3112213E[] = {
  NSPAIR(_ZN3aaa9GG3112213C1Ev),
  NSPAIR(_ZN3aaa9GG3112213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3112213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112213E[];
extern void _ZN3aaa9GG31122133fooEv();
extern void _ZN3aaa9GG31122133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31122133fooEv,_ZThn8_N3aaa9GG31122133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31122133barEv,_ZThn20_N3aaa9GG31122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31122133fooEv,_ZThn20_N3aaa9GG31122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31122133barEv,_ZThn28_N3aaa9GG31122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31122133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31122133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31122133fooEv,_ZThn8_N3aaa9GG31122133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122133barEv,_ZThn20_N3aaa9GG31122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122133fooEv,_ZThn20_N3aaa9GG31122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31122133barEv,_ZThn28_N3aaa9GG31122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112213E[];
Class_Descriptor cd__ZN3aaa9GG3112213E = {  "_ZN3aaa9GG3112213E", // class name
  bases__ZN3aaa9GG3112213E, 6,
  &(vtc__ZN3aaa9GG3112213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112221  : ::aaa::EE311 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31122213fooEv
  ~GG3112221(); // tgen
  GG3112221(); // tgen
};
//SIG(1 _ZN3aaa9GG3112221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31122213fooEv");}
aaa::GG3112221 ::~GG3112221(){ note_dtor("_ZN3aaa9GG3112221E", this);} // tgen
aaa::GG3112221 ::GG3112221(){ note_ctor("_ZN3aaa9GG3112221E", this);} // tgen
}
static void Test__ZN3aaa9GG3112221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112221E, buf);
    ::aaa::GG3112221 *dp, &lv = *(dp=new (buf) ::aaa::GG3112221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112221E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3112221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3112221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3112221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112221E);
    dp->::aaa::GG3112221::~GG3112221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112221E(Test__ZN3aaa9GG3112221E, "_ZN3aaa9GG3112221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112221C1Ev();
extern void _ZN3aaa9GG3112221D1Ev();
Name_Map name_map__ZN3aaa9GG3112221E[] = {
  NSPAIR(_ZN3aaa9GG3112221C1Ev),
  NSPAIR(_ZN3aaa9GG3112221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3112221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112221E[];
extern void _ZN3aaa9GG31122213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31122213fooEv,_ZThn8_N3aaa9GG31122213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31122213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31122213fooEv,_ZThn8_N3aaa9GG31122213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112221E[];
Class_Descriptor cd__ZN3aaa9GG3112221E = {  "_ZN3aaa9GG3112221E", // class name
  bases__ZN3aaa9GG3112221E, 6,
  &(vtc__ZN3aaa9GG3112221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112222  : ::aaa::EE311 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31122223barEv
  ~GG3112222(); // tgen
  GG3112222(); // tgen
};
//SIG(1 _ZN3aaa9GG3112222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31122223barEv");}
aaa::GG3112222 ::~GG3112222(){ note_dtor("_ZN3aaa9GG3112222E", this);} // tgen
aaa::GG3112222 ::GG3112222(){ note_ctor("_ZN3aaa9GG3112222E", this);} // tgen
}
static void Test__ZN3aaa9GG3112222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112222E, buf);
    ::aaa::GG3112222 *dp, &lv = *(dp=new (buf) ::aaa::GG3112222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112222E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3112222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3112222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3112222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112222E);
    dp->::aaa::GG3112222::~GG3112222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112222E(Test__ZN3aaa9GG3112222E, "_ZN3aaa9GG3112222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112222C1Ev();
extern void _ZN3aaa9GG3112222D1Ev();
Name_Map name_map__ZN3aaa9GG3112222E[] = {
  NSPAIR(_ZN3aaa9GG3112222C1Ev),
  NSPAIR(_ZN3aaa9GG3112222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3112222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112222E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31122223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31122223barEv,_ZThn20_N3aaa9GG31122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31122223barEv,_ZThn28_N3aaa9GG31122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31122223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122223barEv,_ZThn20_N3aaa9GG31122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31122223barEv,_ZThn28_N3aaa9GG31122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112222E[];
Class_Descriptor cd__ZN3aaa9GG3112222E = {  "_ZN3aaa9GG3112222E", // class name
  bases__ZN3aaa9GG3112222E, 6,
  &(vtc__ZN3aaa9GG3112222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112223  : ::aaa::EE311 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31122233fooEv
  virtual void  bar(); // _ZN3aaa9GG31122233barEv
  ~GG3112223(); // tgen
  GG3112223(); // tgen
};
//SIG(1 _ZN3aaa9GG3112223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31122233fooEv");}
void  aaa::GG3112223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31122233barEv");}
aaa::GG3112223 ::~GG3112223(){ note_dtor("_ZN3aaa9GG3112223E", this);} // tgen
aaa::GG3112223 ::GG3112223(){ note_ctor("_ZN3aaa9GG3112223E", this);} // tgen
}
static void Test__ZN3aaa9GG3112223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112223E, buf);
    ::aaa::GG3112223 *dp, &lv = *(dp=new (buf) ::aaa::GG3112223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112223E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3112223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3112223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3112223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112223E);
    dp->::aaa::GG3112223::~GG3112223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112223E(Test__ZN3aaa9GG3112223E, "_ZN3aaa9GG3112223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112223C1Ev();
extern void _ZN3aaa9GG3112223D1Ev();
Name_Map name_map__ZN3aaa9GG3112223E[] = {
  NSPAIR(_ZN3aaa9GG3112223C1Ev),
  NSPAIR(_ZN3aaa9GG3112223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3112223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112223E[];
extern void _ZN3aaa9GG31122233fooEv();
extern void _ZN3aaa9GG31122233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31122233fooEv,_ZThn8_N3aaa9GG31122233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31122233barEv,_ZThn20_N3aaa9GG31122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31122233barEv,_ZThn28_N3aaa9GG31122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31122233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31122233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31122233fooEv,_ZThn8_N3aaa9GG31122233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122233barEv,_ZThn20_N3aaa9GG31122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31122233barEv,_ZThn28_N3aaa9GG31122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112223E[];
Class_Descriptor cd__ZN3aaa9GG3112223E = {  "_ZN3aaa9GG3112223E", // class name
  bases__ZN3aaa9GG3112223E, 6,
  &(vtc__ZN3aaa9GG3112223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112231  : ::aaa::EE311 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31122313fooEv
  ~GG3112231(); // tgen
  GG3112231(); // tgen
};
//SIG(1 _ZN3aaa9GG3112231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31122313fooEv");}
aaa::GG3112231 ::~GG3112231(){ note_dtor("_ZN3aaa9GG3112231E", this);} // tgen
aaa::GG3112231 ::GG3112231(){ note_ctor("_ZN3aaa9GG3112231E", this);} // tgen
}
static void Test__ZN3aaa9GG3112231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112231E, buf);
    ::aaa::GG3112231 *dp, &lv = *(dp=new (buf) ::aaa::GG3112231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112231E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3112231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3112231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3112231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112231E);
    dp->::aaa::GG3112231::~GG3112231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112231E(Test__ZN3aaa9GG3112231E, "_ZN3aaa9GG3112231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112231C1Ev();
extern void _ZN3aaa9GG3112231D1Ev();
Name_Map name_map__ZN3aaa9GG3112231E[] = {
  NSPAIR(_ZN3aaa9GG3112231C1Ev),
  NSPAIR(_ZN3aaa9GG3112231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3112231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112231E[];
extern void _ZN3aaa9GG31122313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31122313fooEv,_ZThn8_N3aaa9GG31122313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31122313fooEv,_ZThn20_N3aaa9GG31122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31122313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31122313fooEv,_ZThn8_N3aaa9GG31122313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122313fooEv,_ZThn20_N3aaa9GG31122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112231E[];
Class_Descriptor cd__ZN3aaa9GG3112231E = {  "_ZN3aaa9GG3112231E", // class name
  bases__ZN3aaa9GG3112231E, 6,
  &(vtc__ZN3aaa9GG3112231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112232  : ::aaa::EE311 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31122323barEv
  ~GG3112232(); // tgen
  GG3112232(); // tgen
};
//SIG(1 _ZN3aaa9GG3112232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31122323barEv");}
aaa::GG3112232 ::~GG3112232(){ note_dtor("_ZN3aaa9GG3112232E", this);} // tgen
aaa::GG3112232 ::GG3112232(){ note_ctor("_ZN3aaa9GG3112232E", this);} // tgen
}
static void Test__ZN3aaa9GG3112232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112232E, buf);
    ::aaa::GG3112232 *dp, &lv = *(dp=new (buf) ::aaa::GG3112232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112232E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3112232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3112232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3112232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112232E);
    dp->::aaa::GG3112232::~GG3112232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112232E(Test__ZN3aaa9GG3112232E, "_ZN3aaa9GG3112232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112232C1Ev();
extern void _ZN3aaa9GG3112232D1Ev();
Name_Map name_map__ZN3aaa9GG3112232E[] = {
  NSPAIR(_ZN3aaa9GG3112232C1Ev),
  NSPAIR(_ZN3aaa9GG3112232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3112232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112232E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31122323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31122323barEv,_ZThn20_N3aaa9GG31122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31122323barEv,_ZThn28_N3aaa9GG31122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31122323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122323barEv,_ZThn20_N3aaa9GG31122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31122323barEv,_ZThn28_N3aaa9GG31122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112232E[];
Class_Descriptor cd__ZN3aaa9GG3112232E = {  "_ZN3aaa9GG3112232E", // class name
  bases__ZN3aaa9GG3112232E, 6,
  &(vtc__ZN3aaa9GG3112232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112233  : ::aaa::EE311 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31122333fooEv
  virtual void  bar(); // _ZN3aaa9GG31122333barEv
  ~GG3112233(); // tgen
  GG3112233(); // tgen
};
//SIG(1 _ZN3aaa9GG3112233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31122333fooEv");}
void  aaa::GG3112233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31122333barEv");}
aaa::GG3112233 ::~GG3112233(){ note_dtor("_ZN3aaa9GG3112233E", this);} // tgen
aaa::GG3112233 ::GG3112233(){ note_ctor("_ZN3aaa9GG3112233E", this);} // tgen
}
static void Test__ZN3aaa9GG3112233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112233E, buf);
    ::aaa::GG3112233 *dp, &lv = *(dp=new (buf) ::aaa::GG3112233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112233E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3112233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3112233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3112233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112233E);
    dp->::aaa::GG3112233::~GG3112233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112233E(Test__ZN3aaa9GG3112233E, "_ZN3aaa9GG3112233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112233C1Ev();
extern void _ZN3aaa9GG3112233D1Ev();
Name_Map name_map__ZN3aaa9GG3112233E[] = {
  NSPAIR(_ZN3aaa9GG3112233C1Ev),
  NSPAIR(_ZN3aaa9GG3112233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3112233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112233E[];
extern void _ZN3aaa9GG31122333fooEv();
extern void _ZN3aaa9GG31122333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31122333fooEv,_ZThn8_N3aaa9GG31122333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31122333barEv,_ZThn20_N3aaa9GG31122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31122333fooEv,_ZThn20_N3aaa9GG31122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31122333barEv,_ZThn28_N3aaa9GG31122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31122333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31122333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31122333fooEv,_ZThn8_N3aaa9GG31122333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122333barEv,_ZThn20_N3aaa9GG31122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31122333fooEv,_ZThn20_N3aaa9GG31122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31122333barEv,_ZThn28_N3aaa9GG31122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112233E[];
Class_Descriptor cd__ZN3aaa9GG3112233E = {  "_ZN3aaa9GG3112233E", // class name
  bases__ZN3aaa9GG3112233E, 6,
  &(vtc__ZN3aaa9GG3112233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112311  : ::aaa::EE311 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31123113fooEv
  ~GG3112311(); // tgen
  GG3112311(); // tgen
};
//SIG(1 _ZN3aaa9GG3112311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31123113fooEv");}
aaa::GG3112311 ::~GG3112311(){ note_dtor("_ZN3aaa9GG3112311E", this);} // tgen
aaa::GG3112311 ::GG3112311(){ note_ctor("_ZN3aaa9GG3112311E", this);} // tgen
}
static void Test__ZN3aaa9GG3112311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112311E, buf);
    ::aaa::GG3112311 *dp, &lv = *(dp=new (buf) ::aaa::GG3112311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112311E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3112311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3112311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3112311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112311E);
    dp->::aaa::GG3112311::~GG3112311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112311E(Test__ZN3aaa9GG3112311E, "_ZN3aaa9GG3112311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112311C1Ev();
extern void _ZN3aaa9GG3112311D1Ev();
Name_Map name_map__ZN3aaa9GG3112311E[] = {
  NSPAIR(_ZN3aaa9GG3112311C1Ev),
  NSPAIR(_ZN3aaa9GG3112311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3112311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112311E[];
extern void _ZN3aaa9GG31123113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31123113fooEv,_ZThn8_N3aaa9GG31123113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31123113fooEv,_ZThn20_N3aaa9GG31123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123113fooEv,_ZThn28_N3aaa9GG31123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31123113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31123113fooEv,_ZThn8_N3aaa9GG31123113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123113fooEv,_ZThn20_N3aaa9GG31123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123113fooEv,_ZThn28_N3aaa9GG31123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112311E[];
Class_Descriptor cd__ZN3aaa9GG3112311E = {  "_ZN3aaa9GG3112311E", // class name
  bases__ZN3aaa9GG3112311E, 6,
  &(vtc__ZN3aaa9GG3112311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112312  : ::aaa::EE311 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31123123barEv
  ~GG3112312(); // tgen
  GG3112312(); // tgen
};
//SIG(1 _ZN3aaa9GG3112312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31123123barEv");}
aaa::GG3112312 ::~GG3112312(){ note_dtor("_ZN3aaa9GG3112312E", this);} // tgen
aaa::GG3112312 ::GG3112312(){ note_ctor("_ZN3aaa9GG3112312E", this);} // tgen
}
static void Test__ZN3aaa9GG3112312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112312E, buf);
    ::aaa::GG3112312 *dp, &lv = *(dp=new (buf) ::aaa::GG3112312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112312E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3112312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3112312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3112312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112312E);
    dp->::aaa::GG3112312::~GG3112312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112312E(Test__ZN3aaa9GG3112312E, "_ZN3aaa9GG3112312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112312C1Ev();
extern void _ZN3aaa9GG3112312D1Ev();
Name_Map name_map__ZN3aaa9GG3112312E[] = {
  NSPAIR(_ZN3aaa9GG3112312C1Ev),
  NSPAIR(_ZN3aaa9GG3112312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3112312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112312E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31123123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31123123barEv,_ZThn20_N3aaa9GG31123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123123barEv,_ZThn28_N3aaa9GG31123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31123123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123123barEv,_ZThn20_N3aaa9GG31123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123123barEv,_ZThn28_N3aaa9GG31123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112312E[];
Class_Descriptor cd__ZN3aaa9GG3112312E = {  "_ZN3aaa9GG3112312E", // class name
  bases__ZN3aaa9GG3112312E, 6,
  &(vtc__ZN3aaa9GG3112312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112313  : ::aaa::EE311 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31123133fooEv
  virtual void  bar(); // _ZN3aaa9GG31123133barEv
  ~GG3112313(); // tgen
  GG3112313(); // tgen
};
//SIG(1 _ZN3aaa9GG3112313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31123133fooEv");}
void  aaa::GG3112313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31123133barEv");}
aaa::GG3112313 ::~GG3112313(){ note_dtor("_ZN3aaa9GG3112313E", this);} // tgen
aaa::GG3112313 ::GG3112313(){ note_ctor("_ZN3aaa9GG3112313E", this);} // tgen
}
static void Test__ZN3aaa9GG3112313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112313E, buf);
    ::aaa::GG3112313 *dp, &lv = *(dp=new (buf) ::aaa::GG3112313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112313E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3112313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3112313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3112313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112313E);
    dp->::aaa::GG3112313::~GG3112313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112313E(Test__ZN3aaa9GG3112313E, "_ZN3aaa9GG3112313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112313C1Ev();
extern void _ZN3aaa9GG3112313D1Ev();
Name_Map name_map__ZN3aaa9GG3112313E[] = {
  NSPAIR(_ZN3aaa9GG3112313C1Ev),
  NSPAIR(_ZN3aaa9GG3112313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3112313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112313E[];
extern void _ZN3aaa9GG31123133fooEv();
extern void _ZN3aaa9GG31123133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31123133fooEv,_ZThn8_N3aaa9GG31123133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31123133barEv,_ZThn20_N3aaa9GG31123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31123133fooEv,_ZThn20_N3aaa9GG31123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123133fooEv,_ZThn28_N3aaa9GG31123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123133barEv,_ZThn28_N3aaa9GG31123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31123133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31123133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31123133fooEv,_ZThn8_N3aaa9GG31123133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123133barEv,_ZThn20_N3aaa9GG31123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123133fooEv,_ZThn20_N3aaa9GG31123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123133fooEv,_ZThn28_N3aaa9GG31123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123133barEv,_ZThn28_N3aaa9GG31123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112313E[];
Class_Descriptor cd__ZN3aaa9GG3112313E = {  "_ZN3aaa9GG3112313E", // class name
  bases__ZN3aaa9GG3112313E, 6,
  &(vtc__ZN3aaa9GG3112313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112321  : ::aaa::EE311 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31123213fooEv
  ~GG3112321(); // tgen
  GG3112321(); // tgen
};
//SIG(1 _ZN3aaa9GG3112321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31123213fooEv");}
aaa::GG3112321 ::~GG3112321(){ note_dtor("_ZN3aaa9GG3112321E", this);} // tgen
aaa::GG3112321 ::GG3112321(){ note_ctor("_ZN3aaa9GG3112321E", this);} // tgen
}
static void Test__ZN3aaa9GG3112321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112321E, buf);
    ::aaa::GG3112321 *dp, &lv = *(dp=new (buf) ::aaa::GG3112321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112321E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3112321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3112321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3112321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112321E);
    dp->::aaa::GG3112321::~GG3112321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112321E(Test__ZN3aaa9GG3112321E, "_ZN3aaa9GG3112321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112321C1Ev();
extern void _ZN3aaa9GG3112321D1Ev();
Name_Map name_map__ZN3aaa9GG3112321E[] = {
  NSPAIR(_ZN3aaa9GG3112321C1Ev),
  NSPAIR(_ZN3aaa9GG3112321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3112321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112321E[];
extern void _ZN3aaa9GG31123213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31123213fooEv,_ZThn8_N3aaa9GG31123213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31123213fooEv,_ZThn28_N3aaa9GG31123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31123213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31123213fooEv,_ZThn8_N3aaa9GG31123213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123213fooEv,_ZThn28_N3aaa9GG31123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112321E[];
Class_Descriptor cd__ZN3aaa9GG3112321E = {  "_ZN3aaa9GG3112321E", // class name
  bases__ZN3aaa9GG3112321E, 6,
  &(vtc__ZN3aaa9GG3112321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112322  : ::aaa::EE311 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31123223barEv
  ~GG3112322(); // tgen
  GG3112322(); // tgen
};
//SIG(1 _ZN3aaa9GG3112322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31123223barEv");}
aaa::GG3112322 ::~GG3112322(){ note_dtor("_ZN3aaa9GG3112322E", this);} // tgen
aaa::GG3112322 ::GG3112322(){ note_ctor("_ZN3aaa9GG3112322E", this);} // tgen
}
static void Test__ZN3aaa9GG3112322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112322E, buf);
    ::aaa::GG3112322 *dp, &lv = *(dp=new (buf) ::aaa::GG3112322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112322E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3112322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3112322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3112322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112322E);
    dp->::aaa::GG3112322::~GG3112322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112322E(Test__ZN3aaa9GG3112322E, "_ZN3aaa9GG3112322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112322C1Ev();
extern void _ZN3aaa9GG3112322D1Ev();
Name_Map name_map__ZN3aaa9GG3112322E[] = {
  NSPAIR(_ZN3aaa9GG3112322C1Ev),
  NSPAIR(_ZN3aaa9GG3112322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3112322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112322E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31123223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31123223barEv,_ZThn20_N3aaa9GG31123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31123223barEv,_ZThn28_N3aaa9GG31123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31123223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123223barEv,_ZThn20_N3aaa9GG31123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123223barEv,_ZThn28_N3aaa9GG31123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112322E[];
Class_Descriptor cd__ZN3aaa9GG3112322E = {  "_ZN3aaa9GG3112322E", // class name
  bases__ZN3aaa9GG3112322E, 6,
  &(vtc__ZN3aaa9GG3112322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112323  : ::aaa::EE311 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31123233fooEv
  virtual void  bar(); // _ZN3aaa9GG31123233barEv
  ~GG3112323(); // tgen
  GG3112323(); // tgen
};
//SIG(1 _ZN3aaa9GG3112323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31123233fooEv");}
void  aaa::GG3112323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31123233barEv");}
aaa::GG3112323 ::~GG3112323(){ note_dtor("_ZN3aaa9GG3112323E", this);} // tgen
aaa::GG3112323 ::GG3112323(){ note_ctor("_ZN3aaa9GG3112323E", this);} // tgen
}
static void Test__ZN3aaa9GG3112323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112323E, buf);
    ::aaa::GG3112323 *dp, &lv = *(dp=new (buf) ::aaa::GG3112323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112323E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3112323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3112323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3112323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112323E);
    dp->::aaa::GG3112323::~GG3112323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112323E(Test__ZN3aaa9GG3112323E, "_ZN3aaa9GG3112323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112323C1Ev();
extern void _ZN3aaa9GG3112323D1Ev();
Name_Map name_map__ZN3aaa9GG3112323E[] = {
  NSPAIR(_ZN3aaa9GG3112323C1Ev),
  NSPAIR(_ZN3aaa9GG3112323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3112323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112323E[];
extern void _ZN3aaa9GG31123233fooEv();
extern void _ZN3aaa9GG31123233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31123233fooEv,_ZThn8_N3aaa9GG31123233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31123233barEv,_ZThn20_N3aaa9GG31123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123233fooEv,_ZThn28_N3aaa9GG31123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123233barEv,_ZThn28_N3aaa9GG31123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31123233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31123233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31123233fooEv,_ZThn8_N3aaa9GG31123233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123233barEv,_ZThn20_N3aaa9GG31123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123233fooEv,_ZThn28_N3aaa9GG31123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123233barEv,_ZThn28_N3aaa9GG31123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112323E[];
Class_Descriptor cd__ZN3aaa9GG3112323E = {  "_ZN3aaa9GG3112323E", // class name
  bases__ZN3aaa9GG3112323E, 6,
  &(vtc__ZN3aaa9GG3112323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112331  : ::aaa::EE311 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31123313fooEv
  ~GG3112331(); // tgen
  GG3112331(); // tgen
};
//SIG(1 _ZN3aaa9GG3112331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31123313fooEv");}
aaa::GG3112331 ::~GG3112331(){ note_dtor("_ZN3aaa9GG3112331E", this);} // tgen
aaa::GG3112331 ::GG3112331(){ note_ctor("_ZN3aaa9GG3112331E", this);} // tgen
}
static void Test__ZN3aaa9GG3112331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112331E, buf);
    ::aaa::GG3112331 *dp, &lv = *(dp=new (buf) ::aaa::GG3112331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112331E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3112331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3112331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3112331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112331E);
    dp->::aaa::GG3112331::~GG3112331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112331E(Test__ZN3aaa9GG3112331E, "_ZN3aaa9GG3112331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112331C1Ev();
extern void _ZN3aaa9GG3112331D1Ev();
Name_Map name_map__ZN3aaa9GG3112331E[] = {
  NSPAIR(_ZN3aaa9GG3112331C1Ev),
  NSPAIR(_ZN3aaa9GG3112331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3112331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112331E[];
extern void _ZN3aaa9GG31123313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31123313fooEv,_ZThn8_N3aaa9GG31123313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31123313fooEv,_ZThn20_N3aaa9GG31123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123313fooEv,_ZThn28_N3aaa9GG31123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31123313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31123313fooEv,_ZThn8_N3aaa9GG31123313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123313fooEv,_ZThn20_N3aaa9GG31123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123313fooEv,_ZThn28_N3aaa9GG31123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112331E[];
Class_Descriptor cd__ZN3aaa9GG3112331E = {  "_ZN3aaa9GG3112331E", // class name
  bases__ZN3aaa9GG3112331E, 6,
  &(vtc__ZN3aaa9GG3112331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112332  : ::aaa::EE311 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31123323barEv
  ~GG3112332(); // tgen
  GG3112332(); // tgen
};
//SIG(1 _ZN3aaa9GG3112332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3112332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31123323barEv");}
aaa::GG3112332 ::~GG3112332(){ note_dtor("_ZN3aaa9GG3112332E", this);} // tgen
aaa::GG3112332 ::GG3112332(){ note_ctor("_ZN3aaa9GG3112332E", this);} // tgen
}
static void Test__ZN3aaa9GG3112332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112332E, buf);
    ::aaa::GG3112332 *dp, &lv = *(dp=new (buf) ::aaa::GG3112332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112332E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3112332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3112332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3112332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112332E);
    dp->::aaa::GG3112332::~GG3112332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112332E(Test__ZN3aaa9GG3112332E, "_ZN3aaa9GG3112332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112332C1Ev();
extern void _ZN3aaa9GG3112332D1Ev();
Name_Map name_map__ZN3aaa9GG3112332E[] = {
  NSPAIR(_ZN3aaa9GG3112332C1Ev),
  NSPAIR(_ZN3aaa9GG3112332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3112332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112332E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31123323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31123323barEv,_ZThn20_N3aaa9GG31123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123323barEv,_ZThn28_N3aaa9GG31123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31123323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123323barEv,_ZThn20_N3aaa9GG31123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123323barEv,_ZThn28_N3aaa9GG31123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112332E[];
Class_Descriptor cd__ZN3aaa9GG3112332E = {  "_ZN3aaa9GG3112332E", // class name
  bases__ZN3aaa9GG3112332E, 6,
  &(vtc__ZN3aaa9GG3112332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3112333  : ::aaa::EE311 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31123333fooEv
  virtual void  bar(); // _ZN3aaa9GG31123333barEv
  ~GG3112333(); // tgen
  GG3112333(); // tgen
};
//SIG(1 _ZN3aaa9GG3112333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3112333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31123333fooEv");}
void  aaa::GG3112333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31123333barEv");}
aaa::GG3112333 ::~GG3112333(){ note_dtor("_ZN3aaa9GG3112333E", this);} // tgen
aaa::GG3112333 ::GG3112333(){ note_ctor("_ZN3aaa9GG3112333E", this);} // tgen
}
static void Test__ZN3aaa9GG3112333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3112333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3112333E, buf);
    ::aaa::GG3112333 *dp, &lv = *(dp=new (buf) ::aaa::GG3112333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3112333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3112333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3112333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3112333E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3112333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3112333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3112333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3112333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3112333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3112333E);
    dp->::aaa::GG3112333::~GG3112333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3112333E(Test__ZN3aaa9GG3112333E, "_ZN3aaa9GG3112333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3112333C1Ev();
extern void _ZN3aaa9GG3112333D1Ev();
Name_Map name_map__ZN3aaa9GG3112333E[] = {
  NSPAIR(_ZN3aaa9GG3112333C1Ev),
  NSPAIR(_ZN3aaa9GG3112333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3112333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3112333E[];
extern void _ZN3aaa9GG31123333fooEv();
extern void _ZN3aaa9GG31123333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31123333fooEv,_ZThn8_N3aaa9GG31123333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31123333barEv,_ZThn20_N3aaa9GG31123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31123333fooEv,_ZThn20_N3aaa9GG31123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123333fooEv,_ZThn28_N3aaa9GG31123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31123333barEv,_ZThn28_N3aaa9GG31123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3112333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31123333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31123333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31123333fooEv,_ZThn8_N3aaa9GG31123333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123333barEv,_ZThn20_N3aaa9GG31123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31123333fooEv,_ZThn20_N3aaa9GG31123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3112333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123333fooEv,_ZThn28_N3aaa9GG31123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31123333barEv,_ZThn28_N3aaa9GG31123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3112333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3112333E[];
Class_Descriptor cd__ZN3aaa9GG3112333E = {  "_ZN3aaa9GG3112333E", // class name
  bases__ZN3aaa9GG3112333E, 6,
  &(vtc__ZN3aaa9GG3112333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3112333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3112333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113111  : ::aaa::EE311 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31131113fooEv
  ~GG3113111(); // tgen
  GG3113111(); // tgen
};
//SIG(1 _ZN3aaa9GG3113111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31131113fooEv");}
aaa::GG3113111 ::~GG3113111(){ note_dtor("_ZN3aaa9GG3113111E", this);} // tgen
aaa::GG3113111 ::GG3113111(){ note_ctor("_ZN3aaa9GG3113111E", this);} // tgen
}
static void Test__ZN3aaa9GG3113111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113111E, buf);
    ::aaa::GG3113111 *dp, &lv = *(dp=new (buf) ::aaa::GG3113111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113111E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3113111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3113111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3113111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113111E);
    dp->::aaa::GG3113111::~GG3113111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113111E(Test__ZN3aaa9GG3113111E, "_ZN3aaa9GG3113111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113111C1Ev();
extern void _ZN3aaa9GG3113111D1Ev();
Name_Map name_map__ZN3aaa9GG3113111E[] = {
  NSPAIR(_ZN3aaa9GG3113111C1Ev),
  NSPAIR(_ZN3aaa9GG3113111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3113111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113111E[];
extern void _ZN3aaa9GG31131113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31131113fooEv,_ZThn8_N3aaa9GG31131113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131113fooEv,_ZThn20_N3aaa9GG31131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31131113fooEv,_ZThn28_N3aaa9GG31131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31131113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31131113fooEv,_ZThn8_N3aaa9GG31131113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131113fooEv,_ZThn20_N3aaa9GG31131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31131113fooEv,_ZThn28_N3aaa9GG31131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113111E[];
Class_Descriptor cd__ZN3aaa9GG3113111E = {  "_ZN3aaa9GG3113111E", // class name
  bases__ZN3aaa9GG3113111E, 6,
  &(vtc__ZN3aaa9GG3113111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113112  : ::aaa::EE311 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31131123barEv
  ~GG3113112(); // tgen
  GG3113112(); // tgen
};
//SIG(1 _ZN3aaa9GG3113112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31131123barEv");}
aaa::GG3113112 ::~GG3113112(){ note_dtor("_ZN3aaa9GG3113112E", this);} // tgen
aaa::GG3113112 ::GG3113112(){ note_ctor("_ZN3aaa9GG3113112E", this);} // tgen
}
static void Test__ZN3aaa9GG3113112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113112E, buf);
    ::aaa::GG3113112 *dp, &lv = *(dp=new (buf) ::aaa::GG3113112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113112E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3113112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3113112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3113112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113112E);
    dp->::aaa::GG3113112::~GG3113112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113112E(Test__ZN3aaa9GG3113112E, "_ZN3aaa9GG3113112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113112C1Ev();
extern void _ZN3aaa9GG3113112D1Ev();
Name_Map name_map__ZN3aaa9GG3113112E[] = {
  NSPAIR(_ZN3aaa9GG3113112C1Ev),
  NSPAIR(_ZN3aaa9GG3113112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3113112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113112E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31131123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31131123barEv,_ZThn20_N3aaa9GG31131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31131123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131123barEv,_ZThn20_N3aaa9GG31131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113112E[];
Class_Descriptor cd__ZN3aaa9GG3113112E = {  "_ZN3aaa9GG3113112E", // class name
  bases__ZN3aaa9GG3113112E, 6,
  &(vtc__ZN3aaa9GG3113112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113113  : ::aaa::EE311 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31131133fooEv
  virtual void  bar(); // _ZN3aaa9GG31131133barEv
  ~GG3113113(); // tgen
  GG3113113(); // tgen
};
//SIG(1 _ZN3aaa9GG3113113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31131133fooEv");}
void  aaa::GG3113113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31131133barEv");}
aaa::GG3113113 ::~GG3113113(){ note_dtor("_ZN3aaa9GG3113113E", this);} // tgen
aaa::GG3113113 ::GG3113113(){ note_ctor("_ZN3aaa9GG3113113E", this);} // tgen
}
static void Test__ZN3aaa9GG3113113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113113E, buf);
    ::aaa::GG3113113 *dp, &lv = *(dp=new (buf) ::aaa::GG3113113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113113E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3113113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3113113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3113113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113113E);
    dp->::aaa::GG3113113::~GG3113113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113113E(Test__ZN3aaa9GG3113113E, "_ZN3aaa9GG3113113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113113C1Ev();
extern void _ZN3aaa9GG3113113D1Ev();
Name_Map name_map__ZN3aaa9GG3113113E[] = {
  NSPAIR(_ZN3aaa9GG3113113C1Ev),
  NSPAIR(_ZN3aaa9GG3113113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3113113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113113E[];
extern void _ZN3aaa9GG31131133fooEv();
extern void _ZN3aaa9GG31131133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31131133fooEv,_ZThn8_N3aaa9GG31131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131133fooEv,_ZThn20_N3aaa9GG31131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131133barEv,_ZThn20_N3aaa9GG31131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31131133fooEv,_ZThn28_N3aaa9GG31131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31131133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31131133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31131133fooEv,_ZThn8_N3aaa9GG31131133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131133fooEv,_ZThn20_N3aaa9GG31131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131133barEv,_ZThn20_N3aaa9GG31131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31131133fooEv,_ZThn28_N3aaa9GG31131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113113E[];
Class_Descriptor cd__ZN3aaa9GG3113113E = {  "_ZN3aaa9GG3113113E", // class name
  bases__ZN3aaa9GG3113113E, 6,
  &(vtc__ZN3aaa9GG3113113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113121  : ::aaa::EE311 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31131213fooEv
  ~GG3113121(); // tgen
  GG3113121(); // tgen
};
//SIG(1 _ZN3aaa9GG3113121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31131213fooEv");}
aaa::GG3113121 ::~GG3113121(){ note_dtor("_ZN3aaa9GG3113121E", this);} // tgen
aaa::GG3113121 ::GG3113121(){ note_ctor("_ZN3aaa9GG3113121E", this);} // tgen
}
static void Test__ZN3aaa9GG3113121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113121E, buf);
    ::aaa::GG3113121 *dp, &lv = *(dp=new (buf) ::aaa::GG3113121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113121E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3113121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3113121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3113121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113121E);
    dp->::aaa::GG3113121::~GG3113121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113121E(Test__ZN3aaa9GG3113121E, "_ZN3aaa9GG3113121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113121C1Ev();
extern void _ZN3aaa9GG3113121D1Ev();
Name_Map name_map__ZN3aaa9GG3113121E[] = {
  NSPAIR(_ZN3aaa9GG3113121C1Ev),
  NSPAIR(_ZN3aaa9GG3113121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3113121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113121E[];
extern void _ZN3aaa9GG31131213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31131213fooEv,_ZThn8_N3aaa9GG31131213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131213fooEv,_ZThn20_N3aaa9GG31131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31131213fooEv,_ZThn28_N3aaa9GG31131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31131213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31131213fooEv,_ZThn8_N3aaa9GG31131213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131213fooEv,_ZThn20_N3aaa9GG31131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31131213fooEv,_ZThn28_N3aaa9GG31131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113121E[];
Class_Descriptor cd__ZN3aaa9GG3113121E = {  "_ZN3aaa9GG3113121E", // class name
  bases__ZN3aaa9GG3113121E, 6,
  &(vtc__ZN3aaa9GG3113121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113122  : ::aaa::EE311 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31131223barEv
  ~GG3113122(); // tgen
  GG3113122(); // tgen
};
//SIG(1 _ZN3aaa9GG3113122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31131223barEv");}
aaa::GG3113122 ::~GG3113122(){ note_dtor("_ZN3aaa9GG3113122E", this);} // tgen
aaa::GG3113122 ::GG3113122(){ note_ctor("_ZN3aaa9GG3113122E", this);} // tgen
}
static void Test__ZN3aaa9GG3113122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113122E, buf);
    ::aaa::GG3113122 *dp, &lv = *(dp=new (buf) ::aaa::GG3113122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113122E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3113122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3113122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3113122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113122E);
    dp->::aaa::GG3113122::~GG3113122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113122E(Test__ZN3aaa9GG3113122E, "_ZN3aaa9GG3113122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113122C1Ev();
extern void _ZN3aaa9GG3113122D1Ev();
Name_Map name_map__ZN3aaa9GG3113122E[] = {
  NSPAIR(_ZN3aaa9GG3113122C1Ev),
  NSPAIR(_ZN3aaa9GG3113122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3113122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113122E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31131223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31131223barEv,_ZThn20_N3aaa9GG31131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31131223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131223barEv,_ZThn20_N3aaa9GG31131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113122E[];
Class_Descriptor cd__ZN3aaa9GG3113122E = {  "_ZN3aaa9GG3113122E", // class name
  bases__ZN3aaa9GG3113122E, 6,
  &(vtc__ZN3aaa9GG3113122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113123  : ::aaa::EE311 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31131233fooEv
  virtual void  bar(); // _ZN3aaa9GG31131233barEv
  ~GG3113123(); // tgen
  GG3113123(); // tgen
};
//SIG(1 _ZN3aaa9GG3113123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31131233fooEv");}
void  aaa::GG3113123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31131233barEv");}
aaa::GG3113123 ::~GG3113123(){ note_dtor("_ZN3aaa9GG3113123E", this);} // tgen
aaa::GG3113123 ::GG3113123(){ note_ctor("_ZN3aaa9GG3113123E", this);} // tgen
}
static void Test__ZN3aaa9GG3113123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113123E, buf);
    ::aaa::GG3113123 *dp, &lv = *(dp=new (buf) ::aaa::GG3113123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113123E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3113123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3113123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3113123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113123E);
    dp->::aaa::GG3113123::~GG3113123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113123E(Test__ZN3aaa9GG3113123E, "_ZN3aaa9GG3113123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113123C1Ev();
extern void _ZN3aaa9GG3113123D1Ev();
Name_Map name_map__ZN3aaa9GG3113123E[] = {
  NSPAIR(_ZN3aaa9GG3113123C1Ev),
  NSPAIR(_ZN3aaa9GG3113123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3113123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113123E[];
extern void _ZN3aaa9GG31131233fooEv();
extern void _ZN3aaa9GG31131233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31131233fooEv,_ZThn8_N3aaa9GG31131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131233fooEv,_ZThn20_N3aaa9GG31131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131233barEv,_ZThn20_N3aaa9GG31131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31131233fooEv,_ZThn28_N3aaa9GG31131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31131233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31131233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31131233fooEv,_ZThn8_N3aaa9GG31131233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131233fooEv,_ZThn20_N3aaa9GG31131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131233barEv,_ZThn20_N3aaa9GG31131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31131233fooEv,_ZThn28_N3aaa9GG31131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113123E[];
Class_Descriptor cd__ZN3aaa9GG3113123E = {  "_ZN3aaa9GG3113123E", // class name
  bases__ZN3aaa9GG3113123E, 6,
  &(vtc__ZN3aaa9GG3113123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113131  : ::aaa::EE311 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31131313fooEv
  ~GG3113131(); // tgen
  GG3113131(); // tgen
};
//SIG(1 _ZN3aaa9GG3113131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31131313fooEv");}
aaa::GG3113131 ::~GG3113131(){ note_dtor("_ZN3aaa9GG3113131E", this);} // tgen
aaa::GG3113131 ::GG3113131(){ note_ctor("_ZN3aaa9GG3113131E", this);} // tgen
}
static void Test__ZN3aaa9GG3113131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113131E, buf);
    ::aaa::GG3113131 *dp, &lv = *(dp=new (buf) ::aaa::GG3113131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113131E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3113131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3113131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3113131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113131E);
    dp->::aaa::GG3113131::~GG3113131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113131E(Test__ZN3aaa9GG3113131E, "_ZN3aaa9GG3113131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113131C1Ev();
extern void _ZN3aaa9GG3113131D1Ev();
Name_Map name_map__ZN3aaa9GG3113131E[] = {
  NSPAIR(_ZN3aaa9GG3113131C1Ev),
  NSPAIR(_ZN3aaa9GG3113131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3113131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113131E[];
extern void _ZN3aaa9GG31131313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31131313fooEv,_ZThn8_N3aaa9GG31131313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131313fooEv,_ZThn20_N3aaa9GG31131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31131313fooEv,_ZThn28_N3aaa9GG31131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31131313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31131313fooEv,_ZThn8_N3aaa9GG31131313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131313fooEv,_ZThn20_N3aaa9GG31131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31131313fooEv,_ZThn28_N3aaa9GG31131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113131E[];
Class_Descriptor cd__ZN3aaa9GG3113131E = {  "_ZN3aaa9GG3113131E", // class name
  bases__ZN3aaa9GG3113131E, 6,
  &(vtc__ZN3aaa9GG3113131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113132  : ::aaa::EE311 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31131323barEv
  ~GG3113132(); // tgen
  GG3113132(); // tgen
};
//SIG(1 _ZN3aaa9GG3113132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31131323barEv");}
aaa::GG3113132 ::~GG3113132(){ note_dtor("_ZN3aaa9GG3113132E", this);} // tgen
aaa::GG3113132 ::GG3113132(){ note_ctor("_ZN3aaa9GG3113132E", this);} // tgen
}
static void Test__ZN3aaa9GG3113132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113132E, buf);
    ::aaa::GG3113132 *dp, &lv = *(dp=new (buf) ::aaa::GG3113132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113132E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3113132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3113132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3113132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113132E);
    dp->::aaa::GG3113132::~GG3113132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113132E(Test__ZN3aaa9GG3113132E, "_ZN3aaa9GG3113132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113132C1Ev();
extern void _ZN3aaa9GG3113132D1Ev();
Name_Map name_map__ZN3aaa9GG3113132E[] = {
  NSPAIR(_ZN3aaa9GG3113132C1Ev),
  NSPAIR(_ZN3aaa9GG3113132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3113132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113132E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31131323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31131323barEv,_ZThn20_N3aaa9GG31131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31131323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131323barEv,_ZThn20_N3aaa9GG31131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113132E[];
Class_Descriptor cd__ZN3aaa9GG3113132E = {  "_ZN3aaa9GG3113132E", // class name
  bases__ZN3aaa9GG3113132E, 6,
  &(vtc__ZN3aaa9GG3113132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113133  : ::aaa::EE311 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31131333fooEv
  virtual void  bar(); // _ZN3aaa9GG31131333barEv
  ~GG3113133(); // tgen
  GG3113133(); // tgen
};
//SIG(1 _ZN3aaa9GG3113133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31131333fooEv");}
void  aaa::GG3113133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31131333barEv");}
aaa::GG3113133 ::~GG3113133(){ note_dtor("_ZN3aaa9GG3113133E", this);} // tgen
aaa::GG3113133 ::GG3113133(){ note_ctor("_ZN3aaa9GG3113133E", this);} // tgen
}
static void Test__ZN3aaa9GG3113133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113133E, buf);
    ::aaa::GG3113133 *dp, &lv = *(dp=new (buf) ::aaa::GG3113133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113133E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3113133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3113133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3113133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113133E);
    dp->::aaa::GG3113133::~GG3113133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113133E(Test__ZN3aaa9GG3113133E, "_ZN3aaa9GG3113133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113133C1Ev();
extern void _ZN3aaa9GG3113133D1Ev();
Name_Map name_map__ZN3aaa9GG3113133E[] = {
  NSPAIR(_ZN3aaa9GG3113133C1Ev),
  NSPAIR(_ZN3aaa9GG3113133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3113133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113133E[];
extern void _ZN3aaa9GG31131333fooEv();
extern void _ZN3aaa9GG31131333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31131333fooEv,_ZThn8_N3aaa9GG31131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131333fooEv,_ZThn20_N3aaa9GG31131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31131333barEv,_ZThn20_N3aaa9GG31131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31131333fooEv,_ZThn28_N3aaa9GG31131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31131333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31131333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31131333fooEv,_ZThn8_N3aaa9GG31131333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131333fooEv,_ZThn20_N3aaa9GG31131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31131333barEv,_ZThn20_N3aaa9GG31131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31131333fooEv,_ZThn28_N3aaa9GG31131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113133E[];
Class_Descriptor cd__ZN3aaa9GG3113133E = {  "_ZN3aaa9GG3113133E", // class name
  bases__ZN3aaa9GG3113133E, 6,
  &(vtc__ZN3aaa9GG3113133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113211  : ::aaa::EE311 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31132113fooEv
  ~GG3113211(); // tgen
  GG3113211(); // tgen
};
//SIG(1 _ZN3aaa9GG3113211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31132113fooEv");}
aaa::GG3113211 ::~GG3113211(){ note_dtor("_ZN3aaa9GG3113211E", this);} // tgen
aaa::GG3113211 ::GG3113211(){ note_ctor("_ZN3aaa9GG3113211E", this);} // tgen
}
static void Test__ZN3aaa9GG3113211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113211E, buf);
    ::aaa::GG3113211 *dp, &lv = *(dp=new (buf) ::aaa::GG3113211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113211E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3113211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3113211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3113211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113211E);
    dp->::aaa::GG3113211::~GG3113211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113211E(Test__ZN3aaa9GG3113211E, "_ZN3aaa9GG3113211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113211C1Ev();
extern void _ZN3aaa9GG3113211D1Ev();
Name_Map name_map__ZN3aaa9GG3113211E[] = {
  NSPAIR(_ZN3aaa9GG3113211C1Ev),
  NSPAIR(_ZN3aaa9GG3113211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3113211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113211E[];
extern void _ZN3aaa9GG31132113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31132113fooEv,_ZThn8_N3aaa9GG31132113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132113fooEv,_ZThn20_N3aaa9GG31132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31132113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31132113fooEv,_ZThn8_N3aaa9GG31132113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132113fooEv,_ZThn20_N3aaa9GG31132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113211E[];
Class_Descriptor cd__ZN3aaa9GG3113211E = {  "_ZN3aaa9GG3113211E", // class name
  bases__ZN3aaa9GG3113211E, 6,
  &(vtc__ZN3aaa9GG3113211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113212  : ::aaa::EE311 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31132123barEv
  ~GG3113212(); // tgen
  GG3113212(); // tgen
};
//SIG(1 _ZN3aaa9GG3113212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31132123barEv");}
aaa::GG3113212 ::~GG3113212(){ note_dtor("_ZN3aaa9GG3113212E", this);} // tgen
aaa::GG3113212 ::GG3113212(){ note_ctor("_ZN3aaa9GG3113212E", this);} // tgen
}
static void Test__ZN3aaa9GG3113212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113212E, buf);
    ::aaa::GG3113212 *dp, &lv = *(dp=new (buf) ::aaa::GG3113212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113212E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3113212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3113212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3113212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113212E);
    dp->::aaa::GG3113212::~GG3113212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113212E(Test__ZN3aaa9GG3113212E, "_ZN3aaa9GG3113212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113212C1Ev();
extern void _ZN3aaa9GG3113212D1Ev();
Name_Map name_map__ZN3aaa9GG3113212E[] = {
  NSPAIR(_ZN3aaa9GG3113212C1Ev),
  NSPAIR(_ZN3aaa9GG3113212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3113212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113212E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31132123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31132123barEv,_ZThn20_N3aaa9GG31132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31132123barEv,_ZThn28_N3aaa9GG31132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31132123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132123barEv,_ZThn20_N3aaa9GG31132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31132123barEv,_ZThn28_N3aaa9GG31132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113212E[];
Class_Descriptor cd__ZN3aaa9GG3113212E = {  "_ZN3aaa9GG3113212E", // class name
  bases__ZN3aaa9GG3113212E, 6,
  &(vtc__ZN3aaa9GG3113212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113213  : ::aaa::EE311 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31132133fooEv
  virtual void  bar(); // _ZN3aaa9GG31132133barEv
  ~GG3113213(); // tgen
  GG3113213(); // tgen
};
//SIG(1 _ZN3aaa9GG3113213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31132133fooEv");}
void  aaa::GG3113213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31132133barEv");}
aaa::GG3113213 ::~GG3113213(){ note_dtor("_ZN3aaa9GG3113213E", this);} // tgen
aaa::GG3113213 ::GG3113213(){ note_ctor("_ZN3aaa9GG3113213E", this);} // tgen
}
static void Test__ZN3aaa9GG3113213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113213E, buf);
    ::aaa::GG3113213 *dp, &lv = *(dp=new (buf) ::aaa::GG3113213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113213E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3113213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3113213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3113213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113213E);
    dp->::aaa::GG3113213::~GG3113213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113213E(Test__ZN3aaa9GG3113213E, "_ZN3aaa9GG3113213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113213C1Ev();
extern void _ZN3aaa9GG3113213D1Ev();
Name_Map name_map__ZN3aaa9GG3113213E[] = {
  NSPAIR(_ZN3aaa9GG3113213C1Ev),
  NSPAIR(_ZN3aaa9GG3113213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3113213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113213E[];
extern void _ZN3aaa9GG31132133fooEv();
extern void _ZN3aaa9GG31132133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31132133fooEv,_ZThn8_N3aaa9GG31132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132133fooEv,_ZThn20_N3aaa9GG31132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132133barEv,_ZThn20_N3aaa9GG31132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31132133barEv,_ZThn28_N3aaa9GG31132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31132133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31132133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31132133fooEv,_ZThn8_N3aaa9GG31132133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132133fooEv,_ZThn20_N3aaa9GG31132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132133barEv,_ZThn20_N3aaa9GG31132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31132133barEv,_ZThn28_N3aaa9GG31132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113213E[];
Class_Descriptor cd__ZN3aaa9GG3113213E = {  "_ZN3aaa9GG3113213E", // class name
  bases__ZN3aaa9GG3113213E, 6,
  &(vtc__ZN3aaa9GG3113213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113221  : ::aaa::EE311 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31132213fooEv
  ~GG3113221(); // tgen
  GG3113221(); // tgen
};
//SIG(1 _ZN3aaa9GG3113221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31132213fooEv");}
aaa::GG3113221 ::~GG3113221(){ note_dtor("_ZN3aaa9GG3113221E", this);} // tgen
aaa::GG3113221 ::GG3113221(){ note_ctor("_ZN3aaa9GG3113221E", this);} // tgen
}
static void Test__ZN3aaa9GG3113221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113221E, buf);
    ::aaa::GG3113221 *dp, &lv = *(dp=new (buf) ::aaa::GG3113221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113221E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3113221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3113221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3113221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113221E);
    dp->::aaa::GG3113221::~GG3113221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113221E(Test__ZN3aaa9GG3113221E, "_ZN3aaa9GG3113221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113221C1Ev();
extern void _ZN3aaa9GG3113221D1Ev();
Name_Map name_map__ZN3aaa9GG3113221E[] = {
  NSPAIR(_ZN3aaa9GG3113221C1Ev),
  NSPAIR(_ZN3aaa9GG3113221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3113221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113221E[];
extern void _ZN3aaa9GG31132213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31132213fooEv,_ZThn8_N3aaa9GG31132213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132213fooEv,_ZThn20_N3aaa9GG31132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31132213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31132213fooEv,_ZThn8_N3aaa9GG31132213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132213fooEv,_ZThn20_N3aaa9GG31132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113221E[];
Class_Descriptor cd__ZN3aaa9GG3113221E = {  "_ZN3aaa9GG3113221E", // class name
  bases__ZN3aaa9GG3113221E, 6,
  &(vtc__ZN3aaa9GG3113221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113222  : ::aaa::EE311 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31132223barEv
  ~GG3113222(); // tgen
  GG3113222(); // tgen
};
//SIG(1 _ZN3aaa9GG3113222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31132223barEv");}
aaa::GG3113222 ::~GG3113222(){ note_dtor("_ZN3aaa9GG3113222E", this);} // tgen
aaa::GG3113222 ::GG3113222(){ note_ctor("_ZN3aaa9GG3113222E", this);} // tgen
}
static void Test__ZN3aaa9GG3113222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113222E, buf);
    ::aaa::GG3113222 *dp, &lv = *(dp=new (buf) ::aaa::GG3113222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113222E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3113222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3113222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3113222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113222E);
    dp->::aaa::GG3113222::~GG3113222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113222E(Test__ZN3aaa9GG3113222E, "_ZN3aaa9GG3113222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113222C1Ev();
extern void _ZN3aaa9GG3113222D1Ev();
Name_Map name_map__ZN3aaa9GG3113222E[] = {
  NSPAIR(_ZN3aaa9GG3113222C1Ev),
  NSPAIR(_ZN3aaa9GG3113222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3113222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113222E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31132223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31132223barEv,_ZThn20_N3aaa9GG31132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31132223barEv,_ZThn28_N3aaa9GG31132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31132223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132223barEv,_ZThn20_N3aaa9GG31132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31132223barEv,_ZThn28_N3aaa9GG31132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113222E[];
Class_Descriptor cd__ZN3aaa9GG3113222E = {  "_ZN3aaa9GG3113222E", // class name
  bases__ZN3aaa9GG3113222E, 6,
  &(vtc__ZN3aaa9GG3113222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113223  : ::aaa::EE311 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31132233fooEv
  virtual void  bar(); // _ZN3aaa9GG31132233barEv
  ~GG3113223(); // tgen
  GG3113223(); // tgen
};
//SIG(1 _ZN3aaa9GG3113223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31132233fooEv");}
void  aaa::GG3113223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31132233barEv");}
aaa::GG3113223 ::~GG3113223(){ note_dtor("_ZN3aaa9GG3113223E", this);} // tgen
aaa::GG3113223 ::GG3113223(){ note_ctor("_ZN3aaa9GG3113223E", this);} // tgen
}
static void Test__ZN3aaa9GG3113223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113223E, buf);
    ::aaa::GG3113223 *dp, &lv = *(dp=new (buf) ::aaa::GG3113223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113223E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3113223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3113223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3113223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113223E);
    dp->::aaa::GG3113223::~GG3113223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113223E(Test__ZN3aaa9GG3113223E, "_ZN3aaa9GG3113223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113223C1Ev();
extern void _ZN3aaa9GG3113223D1Ev();
Name_Map name_map__ZN3aaa9GG3113223E[] = {
  NSPAIR(_ZN3aaa9GG3113223C1Ev),
  NSPAIR(_ZN3aaa9GG3113223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3113223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113223E[];
extern void _ZN3aaa9GG31132233fooEv();
extern void _ZN3aaa9GG31132233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31132233fooEv,_ZThn8_N3aaa9GG31132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132233fooEv,_ZThn20_N3aaa9GG31132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132233barEv,_ZThn20_N3aaa9GG31132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31132233barEv,_ZThn28_N3aaa9GG31132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31132233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31132233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31132233fooEv,_ZThn8_N3aaa9GG31132233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132233fooEv,_ZThn20_N3aaa9GG31132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132233barEv,_ZThn20_N3aaa9GG31132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31132233barEv,_ZThn28_N3aaa9GG31132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113223E[];
Class_Descriptor cd__ZN3aaa9GG3113223E = {  "_ZN3aaa9GG3113223E", // class name
  bases__ZN3aaa9GG3113223E, 6,
  &(vtc__ZN3aaa9GG3113223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113231  : ::aaa::EE311 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31132313fooEv
  ~GG3113231(); // tgen
  GG3113231(); // tgen
};
//SIG(1 _ZN3aaa9GG3113231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31132313fooEv");}
aaa::GG3113231 ::~GG3113231(){ note_dtor("_ZN3aaa9GG3113231E", this);} // tgen
aaa::GG3113231 ::GG3113231(){ note_ctor("_ZN3aaa9GG3113231E", this);} // tgen
}
static void Test__ZN3aaa9GG3113231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113231E, buf);
    ::aaa::GG3113231 *dp, &lv = *(dp=new (buf) ::aaa::GG3113231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113231E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3113231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3113231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3113231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113231E);
    dp->::aaa::GG3113231::~GG3113231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113231E(Test__ZN3aaa9GG3113231E, "_ZN3aaa9GG3113231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113231C1Ev();
extern void _ZN3aaa9GG3113231D1Ev();
Name_Map name_map__ZN3aaa9GG3113231E[] = {
  NSPAIR(_ZN3aaa9GG3113231C1Ev),
  NSPAIR(_ZN3aaa9GG3113231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3113231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113231E[];
extern void _ZN3aaa9GG31132313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31132313fooEv,_ZThn8_N3aaa9GG31132313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132313fooEv,_ZThn20_N3aaa9GG31132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31132313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31132313fooEv,_ZThn8_N3aaa9GG31132313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132313fooEv,_ZThn20_N3aaa9GG31132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113231E[];
Class_Descriptor cd__ZN3aaa9GG3113231E = {  "_ZN3aaa9GG3113231E", // class name
  bases__ZN3aaa9GG3113231E, 6,
  &(vtc__ZN3aaa9GG3113231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113232  : ::aaa::EE311 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31132323barEv
  ~GG3113232(); // tgen
  GG3113232(); // tgen
};
//SIG(1 _ZN3aaa9GG3113232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31132323barEv");}
aaa::GG3113232 ::~GG3113232(){ note_dtor("_ZN3aaa9GG3113232E", this);} // tgen
aaa::GG3113232 ::GG3113232(){ note_ctor("_ZN3aaa9GG3113232E", this);} // tgen
}
static void Test__ZN3aaa9GG3113232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113232E, buf);
    ::aaa::GG3113232 *dp, &lv = *(dp=new (buf) ::aaa::GG3113232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113232E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3113232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3113232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3113232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113232E);
    dp->::aaa::GG3113232::~GG3113232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113232E(Test__ZN3aaa9GG3113232E, "_ZN3aaa9GG3113232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113232C1Ev();
extern void _ZN3aaa9GG3113232D1Ev();
Name_Map name_map__ZN3aaa9GG3113232E[] = {
  NSPAIR(_ZN3aaa9GG3113232C1Ev),
  NSPAIR(_ZN3aaa9GG3113232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3113232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113232E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31132323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31132323barEv,_ZThn20_N3aaa9GG31132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31132323barEv,_ZThn28_N3aaa9GG31132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31132323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132323barEv,_ZThn20_N3aaa9GG31132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31132323barEv,_ZThn28_N3aaa9GG31132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113232E[];
Class_Descriptor cd__ZN3aaa9GG3113232E = {  "_ZN3aaa9GG3113232E", // class name
  bases__ZN3aaa9GG3113232E, 6,
  &(vtc__ZN3aaa9GG3113232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113233  : ::aaa::EE311 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31132333fooEv
  virtual void  bar(); // _ZN3aaa9GG31132333barEv
  ~GG3113233(); // tgen
  GG3113233(); // tgen
};
//SIG(1 _ZN3aaa9GG3113233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31132333fooEv");}
void  aaa::GG3113233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31132333barEv");}
aaa::GG3113233 ::~GG3113233(){ note_dtor("_ZN3aaa9GG3113233E", this);} // tgen
aaa::GG3113233 ::GG3113233(){ note_ctor("_ZN3aaa9GG3113233E", this);} // tgen
}
static void Test__ZN3aaa9GG3113233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113233E, buf);
    ::aaa::GG3113233 *dp, &lv = *(dp=new (buf) ::aaa::GG3113233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113233E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3113233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3113233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3113233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113233E);
    dp->::aaa::GG3113233::~GG3113233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113233E(Test__ZN3aaa9GG3113233E, "_ZN3aaa9GG3113233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113233C1Ev();
extern void _ZN3aaa9GG3113233D1Ev();
Name_Map name_map__ZN3aaa9GG3113233E[] = {
  NSPAIR(_ZN3aaa9GG3113233C1Ev),
  NSPAIR(_ZN3aaa9GG3113233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3113233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113233E[];
extern void _ZN3aaa9GG31132333fooEv();
extern void _ZN3aaa9GG31132333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31132333fooEv,_ZThn8_N3aaa9GG31132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132333fooEv,_ZThn20_N3aaa9GG31132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31132333barEv,_ZThn20_N3aaa9GG31132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31132333barEv,_ZThn28_N3aaa9GG31132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31132333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31132333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31132333fooEv,_ZThn8_N3aaa9GG31132333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132333fooEv,_ZThn20_N3aaa9GG31132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31132333barEv,_ZThn20_N3aaa9GG31132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31132333barEv,_ZThn28_N3aaa9GG31132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113233E[];
Class_Descriptor cd__ZN3aaa9GG3113233E = {  "_ZN3aaa9GG3113233E", // class name
  bases__ZN3aaa9GG3113233E, 6,
  &(vtc__ZN3aaa9GG3113233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113311  : ::aaa::EE311 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31133113fooEv
  ~GG3113311(); // tgen
  GG3113311(); // tgen
};
//SIG(1 _ZN3aaa9GG3113311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31133113fooEv");}
aaa::GG3113311 ::~GG3113311(){ note_dtor("_ZN3aaa9GG3113311E", this);} // tgen
aaa::GG3113311 ::GG3113311(){ note_ctor("_ZN3aaa9GG3113311E", this);} // tgen
}
static void Test__ZN3aaa9GG3113311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113311E, buf);
    ::aaa::GG3113311 *dp, &lv = *(dp=new (buf) ::aaa::GG3113311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113311E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3113311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3113311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3113311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113311E);
    dp->::aaa::GG3113311::~GG3113311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113311E(Test__ZN3aaa9GG3113311E, "_ZN3aaa9GG3113311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113311C1Ev();
extern void _ZN3aaa9GG3113311D1Ev();
Name_Map name_map__ZN3aaa9GG3113311E[] = {
  NSPAIR(_ZN3aaa9GG3113311C1Ev),
  NSPAIR(_ZN3aaa9GG3113311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3113311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113311E[];
extern void _ZN3aaa9GG31133113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31133113fooEv,_ZThn8_N3aaa9GG31133113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133113fooEv,_ZThn20_N3aaa9GG31133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31133113fooEv,_ZThn28_N3aaa9GG31133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31133113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31133113fooEv,_ZThn8_N3aaa9GG31133113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133113fooEv,_ZThn20_N3aaa9GG31133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133113fooEv,_ZThn28_N3aaa9GG31133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113311E[];
Class_Descriptor cd__ZN3aaa9GG3113311E = {  "_ZN3aaa9GG3113311E", // class name
  bases__ZN3aaa9GG3113311E, 6,
  &(vtc__ZN3aaa9GG3113311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113312  : ::aaa::EE311 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31133123barEv
  ~GG3113312(); // tgen
  GG3113312(); // tgen
};
//SIG(1 _ZN3aaa9GG3113312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31133123barEv");}
aaa::GG3113312 ::~GG3113312(){ note_dtor("_ZN3aaa9GG3113312E", this);} // tgen
aaa::GG3113312 ::GG3113312(){ note_ctor("_ZN3aaa9GG3113312E", this);} // tgen
}
static void Test__ZN3aaa9GG3113312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113312E, buf);
    ::aaa::GG3113312 *dp, &lv = *(dp=new (buf) ::aaa::GG3113312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113312E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3113312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3113312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3113312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113312E);
    dp->::aaa::GG3113312::~GG3113312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113312E(Test__ZN3aaa9GG3113312E, "_ZN3aaa9GG3113312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113312C1Ev();
extern void _ZN3aaa9GG3113312D1Ev();
Name_Map name_map__ZN3aaa9GG3113312E[] = {
  NSPAIR(_ZN3aaa9GG3113312C1Ev),
  NSPAIR(_ZN3aaa9GG3113312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3113312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113312E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31133123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31133123barEv,_ZThn20_N3aaa9GG31133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31133123barEv,_ZThn28_N3aaa9GG31133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31133123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133123barEv,_ZThn20_N3aaa9GG31133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133123barEv,_ZThn28_N3aaa9GG31133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113312E[];
Class_Descriptor cd__ZN3aaa9GG3113312E = {  "_ZN3aaa9GG3113312E", // class name
  bases__ZN3aaa9GG3113312E, 6,
  &(vtc__ZN3aaa9GG3113312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113313  : ::aaa::EE311 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31133133fooEv
  virtual void  bar(); // _ZN3aaa9GG31133133barEv
  ~GG3113313(); // tgen
  GG3113313(); // tgen
};
//SIG(1 _ZN3aaa9GG3113313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31133133fooEv");}
void  aaa::GG3113313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31133133barEv");}
aaa::GG3113313 ::~GG3113313(){ note_dtor("_ZN3aaa9GG3113313E", this);} // tgen
aaa::GG3113313 ::GG3113313(){ note_ctor("_ZN3aaa9GG3113313E", this);} // tgen
}
static void Test__ZN3aaa9GG3113313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113313E, buf);
    ::aaa::GG3113313 *dp, &lv = *(dp=new (buf) ::aaa::GG3113313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113313E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3113313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3113313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3113313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113313E);
    dp->::aaa::GG3113313::~GG3113313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113313E(Test__ZN3aaa9GG3113313E, "_ZN3aaa9GG3113313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113313C1Ev();
extern void _ZN3aaa9GG3113313D1Ev();
Name_Map name_map__ZN3aaa9GG3113313E[] = {
  NSPAIR(_ZN3aaa9GG3113313C1Ev),
  NSPAIR(_ZN3aaa9GG3113313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3113313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113313E[];
extern void _ZN3aaa9GG31133133fooEv();
extern void _ZN3aaa9GG31133133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31133133fooEv,_ZThn8_N3aaa9GG31133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133133fooEv,_ZThn20_N3aaa9GG31133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133133barEv,_ZThn20_N3aaa9GG31133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31133133fooEv,_ZThn28_N3aaa9GG31133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31133133barEv,_ZThn28_N3aaa9GG31133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31133133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31133133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31133133fooEv,_ZThn8_N3aaa9GG31133133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133133fooEv,_ZThn20_N3aaa9GG31133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133133barEv,_ZThn20_N3aaa9GG31133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133133fooEv,_ZThn28_N3aaa9GG31133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133133barEv,_ZThn28_N3aaa9GG31133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113313E[];
Class_Descriptor cd__ZN3aaa9GG3113313E = {  "_ZN3aaa9GG3113313E", // class name
  bases__ZN3aaa9GG3113313E, 6,
  &(vtc__ZN3aaa9GG3113313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113321  : ::aaa::EE311 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31133213fooEv
  ~GG3113321(); // tgen
  GG3113321(); // tgen
};
//SIG(1 _ZN3aaa9GG3113321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31133213fooEv");}
aaa::GG3113321 ::~GG3113321(){ note_dtor("_ZN3aaa9GG3113321E", this);} // tgen
aaa::GG3113321 ::GG3113321(){ note_ctor("_ZN3aaa9GG3113321E", this);} // tgen
}
static void Test__ZN3aaa9GG3113321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113321E, buf);
    ::aaa::GG3113321 *dp, &lv = *(dp=new (buf) ::aaa::GG3113321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113321E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3113321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3113321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3113321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113321E);
    dp->::aaa::GG3113321::~GG3113321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113321E(Test__ZN3aaa9GG3113321E, "_ZN3aaa9GG3113321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113321C1Ev();
extern void _ZN3aaa9GG3113321D1Ev();
Name_Map name_map__ZN3aaa9GG3113321E[] = {
  NSPAIR(_ZN3aaa9GG3113321C1Ev),
  NSPAIR(_ZN3aaa9GG3113321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3113321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113321E[];
extern void _ZN3aaa9GG31133213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31133213fooEv,_ZThn8_N3aaa9GG31133213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133213fooEv,_ZThn20_N3aaa9GG31133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31133213fooEv,_ZThn28_N3aaa9GG31133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31133213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31133213fooEv,_ZThn8_N3aaa9GG31133213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133213fooEv,_ZThn20_N3aaa9GG31133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133213fooEv,_ZThn28_N3aaa9GG31133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113321E[];
Class_Descriptor cd__ZN3aaa9GG3113321E = {  "_ZN3aaa9GG3113321E", // class name
  bases__ZN3aaa9GG3113321E, 6,
  &(vtc__ZN3aaa9GG3113321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113322  : ::aaa::EE311 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31133223barEv
  ~GG3113322(); // tgen
  GG3113322(); // tgen
};
//SIG(1 _ZN3aaa9GG3113322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31133223barEv");}
aaa::GG3113322 ::~GG3113322(){ note_dtor("_ZN3aaa9GG3113322E", this);} // tgen
aaa::GG3113322 ::GG3113322(){ note_ctor("_ZN3aaa9GG3113322E", this);} // tgen
}
static void Test__ZN3aaa9GG3113322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113322E, buf);
    ::aaa::GG3113322 *dp, &lv = *(dp=new (buf) ::aaa::GG3113322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113322E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3113322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3113322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3113322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113322E);
    dp->::aaa::GG3113322::~GG3113322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113322E(Test__ZN3aaa9GG3113322E, "_ZN3aaa9GG3113322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113322C1Ev();
extern void _ZN3aaa9GG3113322D1Ev();
Name_Map name_map__ZN3aaa9GG3113322E[] = {
  NSPAIR(_ZN3aaa9GG3113322C1Ev),
  NSPAIR(_ZN3aaa9GG3113322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3113322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113322E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31133223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31133223barEv,_ZThn20_N3aaa9GG31133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31133223barEv,_ZThn28_N3aaa9GG31133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31133223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133223barEv,_ZThn20_N3aaa9GG31133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133223barEv,_ZThn28_N3aaa9GG31133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113322E[];
Class_Descriptor cd__ZN3aaa9GG3113322E = {  "_ZN3aaa9GG3113322E", // class name
  bases__ZN3aaa9GG3113322E, 6,
  &(vtc__ZN3aaa9GG3113322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113323  : ::aaa::EE311 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31133233fooEv
  virtual void  bar(); // _ZN3aaa9GG31133233barEv
  ~GG3113323(); // tgen
  GG3113323(); // tgen
};
//SIG(1 _ZN3aaa9GG3113323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31133233fooEv");}
void  aaa::GG3113323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31133233barEv");}
aaa::GG3113323 ::~GG3113323(){ note_dtor("_ZN3aaa9GG3113323E", this);} // tgen
aaa::GG3113323 ::GG3113323(){ note_ctor("_ZN3aaa9GG3113323E", this);} // tgen
}
static void Test__ZN3aaa9GG3113323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113323E, buf);
    ::aaa::GG3113323 *dp, &lv = *(dp=new (buf) ::aaa::GG3113323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113323E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3113323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3113323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3113323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113323E);
    dp->::aaa::GG3113323::~GG3113323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113323E(Test__ZN3aaa9GG3113323E, "_ZN3aaa9GG3113323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113323C1Ev();
extern void _ZN3aaa9GG3113323D1Ev();
Name_Map name_map__ZN3aaa9GG3113323E[] = {
  NSPAIR(_ZN3aaa9GG3113323C1Ev),
  NSPAIR(_ZN3aaa9GG3113323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3113323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113323E[];
extern void _ZN3aaa9GG31133233fooEv();
extern void _ZN3aaa9GG31133233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31133233fooEv,_ZThn8_N3aaa9GG31133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133233fooEv,_ZThn20_N3aaa9GG31133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133233barEv,_ZThn20_N3aaa9GG31133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31133233fooEv,_ZThn28_N3aaa9GG31133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31133233barEv,_ZThn28_N3aaa9GG31133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31133233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31133233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31133233fooEv,_ZThn8_N3aaa9GG31133233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133233fooEv,_ZThn20_N3aaa9GG31133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133233barEv,_ZThn20_N3aaa9GG31133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133233fooEv,_ZThn28_N3aaa9GG31133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133233barEv,_ZThn28_N3aaa9GG31133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113323E[];
Class_Descriptor cd__ZN3aaa9GG3113323E = {  "_ZN3aaa9GG3113323E", // class name
  bases__ZN3aaa9GG3113323E, 6,
  &(vtc__ZN3aaa9GG3113323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113331  : ::aaa::EE311 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31133313fooEv
  ~GG3113331(); // tgen
  GG3113331(); // tgen
};
//SIG(1 _ZN3aaa9GG3113331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31133313fooEv");}
aaa::GG3113331 ::~GG3113331(){ note_dtor("_ZN3aaa9GG3113331E", this);} // tgen
aaa::GG3113331 ::GG3113331(){ note_ctor("_ZN3aaa9GG3113331E", this);} // tgen
}
static void Test__ZN3aaa9GG3113331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113331E, buf);
    ::aaa::GG3113331 *dp, &lv = *(dp=new (buf) ::aaa::GG3113331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113331E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3113331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3113331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3113331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113331E);
    dp->::aaa::GG3113331::~GG3113331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113331E(Test__ZN3aaa9GG3113331E, "_ZN3aaa9GG3113331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113331C1Ev();
extern void _ZN3aaa9GG3113331D1Ev();
Name_Map name_map__ZN3aaa9GG3113331E[] = {
  NSPAIR(_ZN3aaa9GG3113331C1Ev),
  NSPAIR(_ZN3aaa9GG3113331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3113331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113331E[];
extern void _ZN3aaa9GG31133313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31133313fooEv,_ZThn8_N3aaa9GG31133313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133313fooEv,_ZThn20_N3aaa9GG31133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31133313fooEv,_ZThn28_N3aaa9GG31133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31133313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31133313fooEv,_ZThn8_N3aaa9GG31133313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133313fooEv,_ZThn20_N3aaa9GG31133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133313fooEv,_ZThn28_N3aaa9GG31133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113331E[];
Class_Descriptor cd__ZN3aaa9GG3113331E = {  "_ZN3aaa9GG3113331E", // class name
  bases__ZN3aaa9GG3113331E, 6,
  &(vtc__ZN3aaa9GG3113331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113332  : ::aaa::EE311 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31133323barEv
  ~GG3113332(); // tgen
  GG3113332(); // tgen
};
//SIG(1 _ZN3aaa9GG3113332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3113332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31133323barEv");}
aaa::GG3113332 ::~GG3113332(){ note_dtor("_ZN3aaa9GG3113332E", this);} // tgen
aaa::GG3113332 ::GG3113332(){ note_ctor("_ZN3aaa9GG3113332E", this);} // tgen
}
static void Test__ZN3aaa9GG3113332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113332E, buf);
    ::aaa::GG3113332 *dp, &lv = *(dp=new (buf) ::aaa::GG3113332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113332E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3113332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3113332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3113332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113332E);
    dp->::aaa::GG3113332::~GG3113332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113332E(Test__ZN3aaa9GG3113332E, "_ZN3aaa9GG3113332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113332C1Ev();
extern void _ZN3aaa9GG3113332D1Ev();
Name_Map name_map__ZN3aaa9GG3113332E[] = {
  NSPAIR(_ZN3aaa9GG3113332C1Ev),
  NSPAIR(_ZN3aaa9GG3113332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3113332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113332E[];
extern void _ZN3aaa5EE3113fooEv();
extern void _ZN3aaa9GG31133323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31133323barEv,_ZThn20_N3aaa9GG31133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31133323barEv,_ZThn28_N3aaa9GG31133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3113fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31133323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3113fooEv,_ZThn8_N3aaa5EE3113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133323barEv,_ZThn20_N3aaa9GG31133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133323barEv,_ZThn28_N3aaa9GG31133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113332E[];
Class_Descriptor cd__ZN3aaa9GG3113332E = {  "_ZN3aaa9GG3113332E", // class name
  bases__ZN3aaa9GG3113332E, 6,
  &(vtc__ZN3aaa9GG3113332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3113333  : ::aaa::EE311 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31133333fooEv
  virtual void  bar(); // _ZN3aaa9GG31133333barEv
  ~GG3113333(); // tgen
  GG3113333(); // tgen
};
//SIG(1 _ZN3aaa9GG3113333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3113333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31133333fooEv");}
void  aaa::GG3113333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31133333barEv");}
aaa::GG3113333 ::~GG3113333(){ note_dtor("_ZN3aaa9GG3113333E", this);} // tgen
aaa::GG3113333 ::GG3113333(){ note_ctor("_ZN3aaa9GG3113333E", this);} // tgen
}
static void Test__ZN3aaa9GG3113333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3113333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3113333E, buf);
    ::aaa::GG3113333 *dp, &lv = *(dp=new (buf) ::aaa::GG3113333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3113333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3113333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE311*), 0, "_ZN3aaa9GG3113333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE311*), ABISELECT(16,8), "_ZN3aaa9GG3113333E");
    check_base_class_offset(lv, (::aaa::EE311*), 0, "_ZN3aaa9GG3113333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3113333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3113333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3113333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3113333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3113333E);
    dp->::aaa::GG3113333::~GG3113333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3113333E(Test__ZN3aaa9GG3113333E, "_ZN3aaa9GG3113333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3113333C1Ev();
extern void _ZN3aaa9GG3113333D1Ev();
Name_Map name_map__ZN3aaa9GG3113333E[] = {
  NSPAIR(_ZN3aaa9GG3113333C1Ev),
  NSPAIR(_ZN3aaa9GG3113333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE311E;
extern VTBL_ENTRY _ZTIN3aaa5EE311E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE311E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3113333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE311E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3113333E[];
extern void _ZN3aaa9GG31133333fooEv();
extern void _ZN3aaa9GG31133333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31133333fooEv,_ZThn8_N3aaa9GG31133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133333fooEv,_ZThn20_N3aaa9GG31133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31133333barEv,_ZThn20_N3aaa9GG31133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31133333fooEv,_ZThn28_N3aaa9GG31133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31133333barEv,_ZThn28_N3aaa9GG31133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3113333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31133333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31133333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31133333fooEv,_ZThn8_N3aaa9GG31133333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133333fooEv,_ZThn20_N3aaa9GG31133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31133333barEv,_ZThn20_N3aaa9GG31133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3113333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133333fooEv,_ZThn28_N3aaa9GG31133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31133333barEv,_ZThn28_N3aaa9GG31133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3113333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3113333E[];
Class_Descriptor cd__ZN3aaa9GG3113333E = {  "_ZN3aaa9GG3113333E", // class name
  bases__ZN3aaa9GG3113333E, 6,
  &(vtc__ZN3aaa9GG3113333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3113333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3113333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121111  : ::aaa::EE312 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31211113fooEv
  ~GG3121111(); // tgen
  GG3121111(); // tgen
};
//SIG(1 _ZN3aaa9GG3121111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31211113fooEv");}
aaa::GG3121111 ::~GG3121111(){ note_dtor("_ZN3aaa9GG3121111E", this);} // tgen
aaa::GG3121111 ::GG3121111(){ note_ctor("_ZN3aaa9GG3121111E", this);} // tgen
}
static void Test__ZN3aaa9GG3121111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121111E, buf);
    ::aaa::GG3121111 *dp, &lv = *(dp=new (buf) ::aaa::GG3121111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121111E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3121111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3121111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3121111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121111E);
    dp->::aaa::GG3121111::~GG3121111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121111E(Test__ZN3aaa9GG3121111E, "_ZN3aaa9GG3121111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121111C1Ev();
extern void _ZN3aaa9GG3121111D1Ev();
Name_Map name_map__ZN3aaa9GG3121111E[] = {
  NSPAIR(_ZN3aaa9GG3121111C1Ev),
  NSPAIR(_ZN3aaa9GG3121111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3121111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121111E[];
extern void _ZN3aaa9GG31211113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31211113fooEv,_ZThn8_N3aaa9GG31211113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31211113fooEv,_ZThn20_N3aaa9GG31211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31211113fooEv,_ZThn28_N3aaa9GG31211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31211113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31211113fooEv,_ZThn8_N3aaa9GG31211113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211113fooEv,_ZThn20_N3aaa9GG31211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31211113fooEv,_ZThn28_N3aaa9GG31211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121111E[];
Class_Descriptor cd__ZN3aaa9GG3121111E = {  "_ZN3aaa9GG3121111E", // class name
  bases__ZN3aaa9GG3121111E, 6,
  &(vtc__ZN3aaa9GG3121111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121112  : ::aaa::EE312 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31211123barEv
  ~GG3121112(); // tgen
  GG3121112(); // tgen
};
//SIG(1 _ZN3aaa9GG3121112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31211123barEv");}
aaa::GG3121112 ::~GG3121112(){ note_dtor("_ZN3aaa9GG3121112E", this);} // tgen
aaa::GG3121112 ::GG3121112(){ note_ctor("_ZN3aaa9GG3121112E", this);} // tgen
}
static void Test__ZN3aaa9GG3121112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121112E, buf);
    ::aaa::GG3121112 *dp, &lv = *(dp=new (buf) ::aaa::GG3121112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121112E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3121112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3121112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3121112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121112E);
    dp->::aaa::GG3121112::~GG3121112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121112E(Test__ZN3aaa9GG3121112E, "_ZN3aaa9GG3121112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121112C1Ev();
extern void _ZN3aaa9GG3121112D1Ev();
Name_Map name_map__ZN3aaa9GG3121112E[] = {
  NSPAIR(_ZN3aaa9GG3121112C1Ev),
  NSPAIR(_ZN3aaa9GG3121112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3121112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31211123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121112E[];
Class_Descriptor cd__ZN3aaa9GG3121112E = {  "_ZN3aaa9GG3121112E", // class name
  bases__ZN3aaa9GG3121112E, 6,
  &(vtc__ZN3aaa9GG3121112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121113  : ::aaa::EE312 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31211133fooEv
  virtual void  bar(); // _ZN3aaa9GG31211133barEv
  ~GG3121113(); // tgen
  GG3121113(); // tgen
};
//SIG(1 _ZN3aaa9GG3121113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31211133fooEv");}
void  aaa::GG3121113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31211133barEv");}
aaa::GG3121113 ::~GG3121113(){ note_dtor("_ZN3aaa9GG3121113E", this);} // tgen
aaa::GG3121113 ::GG3121113(){ note_ctor("_ZN3aaa9GG3121113E", this);} // tgen
}
static void Test__ZN3aaa9GG3121113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121113E, buf);
    ::aaa::GG3121113 *dp, &lv = *(dp=new (buf) ::aaa::GG3121113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121113E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3121113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3121113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3121113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121113E);
    dp->::aaa::GG3121113::~GG3121113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121113E(Test__ZN3aaa9GG3121113E, "_ZN3aaa9GG3121113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121113C1Ev();
extern void _ZN3aaa9GG3121113D1Ev();
Name_Map name_map__ZN3aaa9GG3121113E[] = {
  NSPAIR(_ZN3aaa9GG3121113C1Ev),
  NSPAIR(_ZN3aaa9GG3121113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3121113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121113E[];
extern void _ZN3aaa9GG31211133fooEv();
extern void _ZN3aaa9GG31211133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31211133fooEv,_ZThn8_N3aaa9GG31211133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31211133fooEv,_ZThn20_N3aaa9GG31211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31211133fooEv,_ZThn28_N3aaa9GG31211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31211133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31211133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31211133fooEv,_ZThn8_N3aaa9GG31211133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211133fooEv,_ZThn20_N3aaa9GG31211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31211133fooEv,_ZThn28_N3aaa9GG31211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121113E[];
Class_Descriptor cd__ZN3aaa9GG3121113E = {  "_ZN3aaa9GG3121113E", // class name
  bases__ZN3aaa9GG3121113E, 6,
  &(vtc__ZN3aaa9GG3121113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121121  : ::aaa::EE312 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31211213fooEv
  ~GG3121121(); // tgen
  GG3121121(); // tgen
};
//SIG(1 _ZN3aaa9GG3121121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31211213fooEv");}
aaa::GG3121121 ::~GG3121121(){ note_dtor("_ZN3aaa9GG3121121E", this);} // tgen
aaa::GG3121121 ::GG3121121(){ note_ctor("_ZN3aaa9GG3121121E", this);} // tgen
}
static void Test__ZN3aaa9GG3121121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121121E, buf);
    ::aaa::GG3121121 *dp, &lv = *(dp=new (buf) ::aaa::GG3121121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121121E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3121121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3121121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3121121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121121E);
    dp->::aaa::GG3121121::~GG3121121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121121E(Test__ZN3aaa9GG3121121E, "_ZN3aaa9GG3121121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121121C1Ev();
extern void _ZN3aaa9GG3121121D1Ev();
Name_Map name_map__ZN3aaa9GG3121121E[] = {
  NSPAIR(_ZN3aaa9GG3121121C1Ev),
  NSPAIR(_ZN3aaa9GG3121121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3121121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121121E[];
extern void _ZN3aaa9GG31211213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31211213fooEv,_ZThn8_N3aaa9GG31211213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31211213fooEv,_ZThn20_N3aaa9GG31211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31211213fooEv,_ZThn28_N3aaa9GG31211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31211213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31211213fooEv,_ZThn8_N3aaa9GG31211213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211213fooEv,_ZThn20_N3aaa9GG31211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31211213fooEv,_ZThn28_N3aaa9GG31211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121121E[];
Class_Descriptor cd__ZN3aaa9GG3121121E = {  "_ZN3aaa9GG3121121E", // class name
  bases__ZN3aaa9GG3121121E, 6,
  &(vtc__ZN3aaa9GG3121121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121122  : ::aaa::EE312 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31211223barEv
  ~GG3121122(); // tgen
  GG3121122(); // tgen
};
//SIG(1 _ZN3aaa9GG3121122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31211223barEv");}
aaa::GG3121122 ::~GG3121122(){ note_dtor("_ZN3aaa9GG3121122E", this);} // tgen
aaa::GG3121122 ::GG3121122(){ note_ctor("_ZN3aaa9GG3121122E", this);} // tgen
}
static void Test__ZN3aaa9GG3121122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121122E, buf);
    ::aaa::GG3121122 *dp, &lv = *(dp=new (buf) ::aaa::GG3121122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121122E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3121122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3121122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3121122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121122E);
    dp->::aaa::GG3121122::~GG3121122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121122E(Test__ZN3aaa9GG3121122E, "_ZN3aaa9GG3121122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121122C1Ev();
extern void _ZN3aaa9GG3121122D1Ev();
Name_Map name_map__ZN3aaa9GG3121122E[] = {
  NSPAIR(_ZN3aaa9GG3121122C1Ev),
  NSPAIR(_ZN3aaa9GG3121122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3121122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31211223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31211223barEv,_ZThn20_N3aaa9GG31211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211223barEv,_ZThn20_N3aaa9GG31211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121122E[];
Class_Descriptor cd__ZN3aaa9GG3121122E = {  "_ZN3aaa9GG3121122E", // class name
  bases__ZN3aaa9GG3121122E, 6,
  &(vtc__ZN3aaa9GG3121122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121123  : ::aaa::EE312 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31211233fooEv
  virtual void  bar(); // _ZN3aaa9GG31211233barEv
  ~GG3121123(); // tgen
  GG3121123(); // tgen
};
//SIG(1 _ZN3aaa9GG3121123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31211233fooEv");}
void  aaa::GG3121123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31211233barEv");}
aaa::GG3121123 ::~GG3121123(){ note_dtor("_ZN3aaa9GG3121123E", this);} // tgen
aaa::GG3121123 ::GG3121123(){ note_ctor("_ZN3aaa9GG3121123E", this);} // tgen
}
static void Test__ZN3aaa9GG3121123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121123E, buf);
    ::aaa::GG3121123 *dp, &lv = *(dp=new (buf) ::aaa::GG3121123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121123E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3121123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3121123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3121123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121123E);
    dp->::aaa::GG3121123::~GG3121123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121123E(Test__ZN3aaa9GG3121123E, "_ZN3aaa9GG3121123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121123C1Ev();
extern void _ZN3aaa9GG3121123D1Ev();
Name_Map name_map__ZN3aaa9GG3121123E[] = {
  NSPAIR(_ZN3aaa9GG3121123C1Ev),
  NSPAIR(_ZN3aaa9GG3121123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3121123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121123E[];
extern void _ZN3aaa9GG31211233fooEv();
extern void _ZN3aaa9GG31211233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31211233fooEv,_ZThn8_N3aaa9GG31211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31211233fooEv,_ZThn20_N3aaa9GG31211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31211233barEv,_ZThn20_N3aaa9GG31211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31211233fooEv,_ZThn28_N3aaa9GG31211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31211233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31211233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31211233fooEv,_ZThn8_N3aaa9GG31211233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211233fooEv,_ZThn20_N3aaa9GG31211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211233barEv,_ZThn20_N3aaa9GG31211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31211233fooEv,_ZThn28_N3aaa9GG31211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121123E[];
Class_Descriptor cd__ZN3aaa9GG3121123E = {  "_ZN3aaa9GG3121123E", // class name
  bases__ZN3aaa9GG3121123E, 6,
  &(vtc__ZN3aaa9GG3121123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121131  : ::aaa::EE312 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31211313fooEv
  ~GG3121131(); // tgen
  GG3121131(); // tgen
};
//SIG(1 _ZN3aaa9GG3121131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31211313fooEv");}
aaa::GG3121131 ::~GG3121131(){ note_dtor("_ZN3aaa9GG3121131E", this);} // tgen
aaa::GG3121131 ::GG3121131(){ note_ctor("_ZN3aaa9GG3121131E", this);} // tgen
}
static void Test__ZN3aaa9GG3121131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121131E, buf);
    ::aaa::GG3121131 *dp, &lv = *(dp=new (buf) ::aaa::GG3121131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121131E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3121131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3121131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3121131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121131E);
    dp->::aaa::GG3121131::~GG3121131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121131E(Test__ZN3aaa9GG3121131E, "_ZN3aaa9GG3121131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121131C1Ev();
extern void _ZN3aaa9GG3121131D1Ev();
Name_Map name_map__ZN3aaa9GG3121131E[] = {
  NSPAIR(_ZN3aaa9GG3121131C1Ev),
  NSPAIR(_ZN3aaa9GG3121131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3121131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121131E[];
extern void _ZN3aaa9GG31211313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31211313fooEv,_ZThn8_N3aaa9GG31211313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31211313fooEv,_ZThn20_N3aaa9GG31211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31211313fooEv,_ZThn28_N3aaa9GG31211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31211313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31211313fooEv,_ZThn8_N3aaa9GG31211313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211313fooEv,_ZThn20_N3aaa9GG31211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31211313fooEv,_ZThn28_N3aaa9GG31211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121131E[];
Class_Descriptor cd__ZN3aaa9GG3121131E = {  "_ZN3aaa9GG3121131E", // class name
  bases__ZN3aaa9GG3121131E, 6,
  &(vtc__ZN3aaa9GG3121131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121132  : ::aaa::EE312 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31211323barEv
  ~GG3121132(); // tgen
  GG3121132(); // tgen
};
//SIG(1 _ZN3aaa9GG3121132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31211323barEv");}
aaa::GG3121132 ::~GG3121132(){ note_dtor("_ZN3aaa9GG3121132E", this);} // tgen
aaa::GG3121132 ::GG3121132(){ note_ctor("_ZN3aaa9GG3121132E", this);} // tgen
}
static void Test__ZN3aaa9GG3121132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121132E, buf);
    ::aaa::GG3121132 *dp, &lv = *(dp=new (buf) ::aaa::GG3121132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121132E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3121132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3121132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3121132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121132E);
    dp->::aaa::GG3121132::~GG3121132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121132E(Test__ZN3aaa9GG3121132E, "_ZN3aaa9GG3121132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121132C1Ev();
extern void _ZN3aaa9GG3121132D1Ev();
Name_Map name_map__ZN3aaa9GG3121132E[] = {
  NSPAIR(_ZN3aaa9GG3121132C1Ev),
  NSPAIR(_ZN3aaa9GG3121132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3121132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31211323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31211323barEv,_ZThn20_N3aaa9GG31211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211323barEv,_ZThn20_N3aaa9GG31211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121132E[];
Class_Descriptor cd__ZN3aaa9GG3121132E = {  "_ZN3aaa9GG3121132E", // class name
  bases__ZN3aaa9GG3121132E, 6,
  &(vtc__ZN3aaa9GG3121132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121133  : ::aaa::EE312 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31211333fooEv
  virtual void  bar(); // _ZN3aaa9GG31211333barEv
  ~GG3121133(); // tgen
  GG3121133(); // tgen
};
//SIG(1 _ZN3aaa9GG3121133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31211333fooEv");}
void  aaa::GG3121133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31211333barEv");}
aaa::GG3121133 ::~GG3121133(){ note_dtor("_ZN3aaa9GG3121133E", this);} // tgen
aaa::GG3121133 ::GG3121133(){ note_ctor("_ZN3aaa9GG3121133E", this);} // tgen
}
static void Test__ZN3aaa9GG3121133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121133E, buf);
    ::aaa::GG3121133 *dp, &lv = *(dp=new (buf) ::aaa::GG3121133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121133E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3121133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3121133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3121133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121133E);
    dp->::aaa::GG3121133::~GG3121133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121133E(Test__ZN3aaa9GG3121133E, "_ZN3aaa9GG3121133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121133C1Ev();
extern void _ZN3aaa9GG3121133D1Ev();
Name_Map name_map__ZN3aaa9GG3121133E[] = {
  NSPAIR(_ZN3aaa9GG3121133C1Ev),
  NSPAIR(_ZN3aaa9GG3121133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3121133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121133E[];
extern void _ZN3aaa9GG31211333fooEv();
extern void _ZN3aaa9GG31211333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31211333fooEv,_ZThn8_N3aaa9GG31211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31211333fooEv,_ZThn20_N3aaa9GG31211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31211333barEv,_ZThn20_N3aaa9GG31211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31211333fooEv,_ZThn28_N3aaa9GG31211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31211333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31211333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31211333fooEv,_ZThn8_N3aaa9GG31211333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211333fooEv,_ZThn20_N3aaa9GG31211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31211333barEv,_ZThn20_N3aaa9GG31211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31211333fooEv,_ZThn28_N3aaa9GG31211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121133E[];
Class_Descriptor cd__ZN3aaa9GG3121133E = {  "_ZN3aaa9GG3121133E", // class name
  bases__ZN3aaa9GG3121133E, 6,
  &(vtc__ZN3aaa9GG3121133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121211  : ::aaa::EE312 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31212113fooEv
  ~GG3121211(); // tgen
  GG3121211(); // tgen
};
//SIG(1 _ZN3aaa9GG3121211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31212113fooEv");}
aaa::GG3121211 ::~GG3121211(){ note_dtor("_ZN3aaa9GG3121211E", this);} // tgen
aaa::GG3121211 ::GG3121211(){ note_ctor("_ZN3aaa9GG3121211E", this);} // tgen
}
static void Test__ZN3aaa9GG3121211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121211E, buf);
    ::aaa::GG3121211 *dp, &lv = *(dp=new (buf) ::aaa::GG3121211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121211E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3121211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3121211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3121211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121211E);
    dp->::aaa::GG3121211::~GG3121211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121211E(Test__ZN3aaa9GG3121211E, "_ZN3aaa9GG3121211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121211C1Ev();
extern void _ZN3aaa9GG3121211D1Ev();
Name_Map name_map__ZN3aaa9GG3121211E[] = {
  NSPAIR(_ZN3aaa9GG3121211C1Ev),
  NSPAIR(_ZN3aaa9GG3121211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3121211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121211E[];
extern void _ZN3aaa9GG31212113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31212113fooEv,_ZThn8_N3aaa9GG31212113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31212113fooEv,_ZThn20_N3aaa9GG31212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31212113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31212113fooEv,_ZThn8_N3aaa9GG31212113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212113fooEv,_ZThn20_N3aaa9GG31212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121211E[];
Class_Descriptor cd__ZN3aaa9GG3121211E = {  "_ZN3aaa9GG3121211E", // class name
  bases__ZN3aaa9GG3121211E, 6,
  &(vtc__ZN3aaa9GG3121211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121212  : ::aaa::EE312 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31212123barEv
  ~GG3121212(); // tgen
  GG3121212(); // tgen
};
//SIG(1 _ZN3aaa9GG3121212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31212123barEv");}
aaa::GG3121212 ::~GG3121212(){ note_dtor("_ZN3aaa9GG3121212E", this);} // tgen
aaa::GG3121212 ::GG3121212(){ note_ctor("_ZN3aaa9GG3121212E", this);} // tgen
}
static void Test__ZN3aaa9GG3121212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121212E, buf);
    ::aaa::GG3121212 *dp, &lv = *(dp=new (buf) ::aaa::GG3121212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121212E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3121212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3121212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3121212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121212E);
    dp->::aaa::GG3121212::~GG3121212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121212E(Test__ZN3aaa9GG3121212E, "_ZN3aaa9GG3121212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121212C1Ev();
extern void _ZN3aaa9GG3121212D1Ev();
Name_Map name_map__ZN3aaa9GG3121212E[] = {
  NSPAIR(_ZN3aaa9GG3121212C1Ev),
  NSPAIR(_ZN3aaa9GG3121212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3121212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31212123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31212123barEv,_ZThn28_N3aaa9GG31212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31212123barEv,_ZThn28_N3aaa9GG31212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121212E[];
Class_Descriptor cd__ZN3aaa9GG3121212E = {  "_ZN3aaa9GG3121212E", // class name
  bases__ZN3aaa9GG3121212E, 6,
  &(vtc__ZN3aaa9GG3121212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121213  : ::aaa::EE312 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31212133fooEv
  virtual void  bar(); // _ZN3aaa9GG31212133barEv
  ~GG3121213(); // tgen
  GG3121213(); // tgen
};
//SIG(1 _ZN3aaa9GG3121213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31212133fooEv");}
void  aaa::GG3121213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31212133barEv");}
aaa::GG3121213 ::~GG3121213(){ note_dtor("_ZN3aaa9GG3121213E", this);} // tgen
aaa::GG3121213 ::GG3121213(){ note_ctor("_ZN3aaa9GG3121213E", this);} // tgen
}
static void Test__ZN3aaa9GG3121213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121213E, buf);
    ::aaa::GG3121213 *dp, &lv = *(dp=new (buf) ::aaa::GG3121213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121213E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3121213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3121213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3121213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121213E);
    dp->::aaa::GG3121213::~GG3121213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121213E(Test__ZN3aaa9GG3121213E, "_ZN3aaa9GG3121213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121213C1Ev();
extern void _ZN3aaa9GG3121213D1Ev();
Name_Map name_map__ZN3aaa9GG3121213E[] = {
  NSPAIR(_ZN3aaa9GG3121213C1Ev),
  NSPAIR(_ZN3aaa9GG3121213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3121213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121213E[];
extern void _ZN3aaa9GG31212133fooEv();
extern void _ZN3aaa9GG31212133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31212133fooEv,_ZThn8_N3aaa9GG31212133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31212133fooEv,_ZThn20_N3aaa9GG31212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31212133barEv,_ZThn28_N3aaa9GG31212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31212133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31212133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31212133fooEv,_ZThn8_N3aaa9GG31212133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212133fooEv,_ZThn20_N3aaa9GG31212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31212133barEv,_ZThn28_N3aaa9GG31212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121213E[];
Class_Descriptor cd__ZN3aaa9GG3121213E = {  "_ZN3aaa9GG3121213E", // class name
  bases__ZN3aaa9GG3121213E, 6,
  &(vtc__ZN3aaa9GG3121213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121221  : ::aaa::EE312 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31212213fooEv
  ~GG3121221(); // tgen
  GG3121221(); // tgen
};
//SIG(1 _ZN3aaa9GG3121221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31212213fooEv");}
aaa::GG3121221 ::~GG3121221(){ note_dtor("_ZN3aaa9GG3121221E", this);} // tgen
aaa::GG3121221 ::GG3121221(){ note_ctor("_ZN3aaa9GG3121221E", this);} // tgen
}
static void Test__ZN3aaa9GG3121221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121221E, buf);
    ::aaa::GG3121221 *dp, &lv = *(dp=new (buf) ::aaa::GG3121221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121221E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3121221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3121221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3121221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121221E);
    dp->::aaa::GG3121221::~GG3121221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121221E(Test__ZN3aaa9GG3121221E, "_ZN3aaa9GG3121221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121221C1Ev();
extern void _ZN3aaa9GG3121221D1Ev();
Name_Map name_map__ZN3aaa9GG3121221E[] = {
  NSPAIR(_ZN3aaa9GG3121221C1Ev),
  NSPAIR(_ZN3aaa9GG3121221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3121221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121221E[];
extern void _ZN3aaa9GG31212213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31212213fooEv,_ZThn8_N3aaa9GG31212213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31212213fooEv,_ZThn20_N3aaa9GG31212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31212213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31212213fooEv,_ZThn8_N3aaa9GG31212213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212213fooEv,_ZThn20_N3aaa9GG31212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121221E[];
Class_Descriptor cd__ZN3aaa9GG3121221E = {  "_ZN3aaa9GG3121221E", // class name
  bases__ZN3aaa9GG3121221E, 6,
  &(vtc__ZN3aaa9GG3121221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121222  : ::aaa::EE312 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31212223barEv
  ~GG3121222(); // tgen
  GG3121222(); // tgen
};
//SIG(1 _ZN3aaa9GG3121222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31212223barEv");}
aaa::GG3121222 ::~GG3121222(){ note_dtor("_ZN3aaa9GG3121222E", this);} // tgen
aaa::GG3121222 ::GG3121222(){ note_ctor("_ZN3aaa9GG3121222E", this);} // tgen
}
static void Test__ZN3aaa9GG3121222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121222E, buf);
    ::aaa::GG3121222 *dp, &lv = *(dp=new (buf) ::aaa::GG3121222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121222E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3121222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3121222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3121222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121222E);
    dp->::aaa::GG3121222::~GG3121222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121222E(Test__ZN3aaa9GG3121222E, "_ZN3aaa9GG3121222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121222C1Ev();
extern void _ZN3aaa9GG3121222D1Ev();
Name_Map name_map__ZN3aaa9GG3121222E[] = {
  NSPAIR(_ZN3aaa9GG3121222C1Ev),
  NSPAIR(_ZN3aaa9GG3121222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3121222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31212223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31212223barEv,_ZThn20_N3aaa9GG31212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31212223barEv,_ZThn28_N3aaa9GG31212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212223barEv,_ZThn20_N3aaa9GG31212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31212223barEv,_ZThn28_N3aaa9GG31212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121222E[];
Class_Descriptor cd__ZN3aaa9GG3121222E = {  "_ZN3aaa9GG3121222E", // class name
  bases__ZN3aaa9GG3121222E, 6,
  &(vtc__ZN3aaa9GG3121222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121223  : ::aaa::EE312 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31212233fooEv
  virtual void  bar(); // _ZN3aaa9GG31212233barEv
  ~GG3121223(); // tgen
  GG3121223(); // tgen
};
//SIG(1 _ZN3aaa9GG3121223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31212233fooEv");}
void  aaa::GG3121223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31212233barEv");}
aaa::GG3121223 ::~GG3121223(){ note_dtor("_ZN3aaa9GG3121223E", this);} // tgen
aaa::GG3121223 ::GG3121223(){ note_ctor("_ZN3aaa9GG3121223E", this);} // tgen
}
static void Test__ZN3aaa9GG3121223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121223E, buf);
    ::aaa::GG3121223 *dp, &lv = *(dp=new (buf) ::aaa::GG3121223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121223E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3121223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3121223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3121223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121223E);
    dp->::aaa::GG3121223::~GG3121223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121223E(Test__ZN3aaa9GG3121223E, "_ZN3aaa9GG3121223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121223C1Ev();
extern void _ZN3aaa9GG3121223D1Ev();
Name_Map name_map__ZN3aaa9GG3121223E[] = {
  NSPAIR(_ZN3aaa9GG3121223C1Ev),
  NSPAIR(_ZN3aaa9GG3121223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3121223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121223E[];
extern void _ZN3aaa9GG31212233fooEv();
extern void _ZN3aaa9GG31212233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31212233fooEv,_ZThn8_N3aaa9GG31212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31212233fooEv,_ZThn20_N3aaa9GG31212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31212233barEv,_ZThn20_N3aaa9GG31212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31212233barEv,_ZThn28_N3aaa9GG31212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31212233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31212233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31212233fooEv,_ZThn8_N3aaa9GG31212233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212233fooEv,_ZThn20_N3aaa9GG31212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212233barEv,_ZThn20_N3aaa9GG31212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31212233barEv,_ZThn28_N3aaa9GG31212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121223E[];
Class_Descriptor cd__ZN3aaa9GG3121223E = {  "_ZN3aaa9GG3121223E", // class name
  bases__ZN3aaa9GG3121223E, 6,
  &(vtc__ZN3aaa9GG3121223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121231  : ::aaa::EE312 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31212313fooEv
  ~GG3121231(); // tgen
  GG3121231(); // tgen
};
//SIG(1 _ZN3aaa9GG3121231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31212313fooEv");}
aaa::GG3121231 ::~GG3121231(){ note_dtor("_ZN3aaa9GG3121231E", this);} // tgen
aaa::GG3121231 ::GG3121231(){ note_ctor("_ZN3aaa9GG3121231E", this);} // tgen
}
static void Test__ZN3aaa9GG3121231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121231E, buf);
    ::aaa::GG3121231 *dp, &lv = *(dp=new (buf) ::aaa::GG3121231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121231E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3121231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3121231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3121231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121231E);
    dp->::aaa::GG3121231::~GG3121231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121231E(Test__ZN3aaa9GG3121231E, "_ZN3aaa9GG3121231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121231C1Ev();
extern void _ZN3aaa9GG3121231D1Ev();
Name_Map name_map__ZN3aaa9GG3121231E[] = {
  NSPAIR(_ZN3aaa9GG3121231C1Ev),
  NSPAIR(_ZN3aaa9GG3121231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3121231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121231E[];
extern void _ZN3aaa9GG31212313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31212313fooEv,_ZThn8_N3aaa9GG31212313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31212313fooEv,_ZThn20_N3aaa9GG31212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31212313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31212313fooEv,_ZThn8_N3aaa9GG31212313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212313fooEv,_ZThn20_N3aaa9GG31212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121231E[];
Class_Descriptor cd__ZN3aaa9GG3121231E = {  "_ZN3aaa9GG3121231E", // class name
  bases__ZN3aaa9GG3121231E, 6,
  &(vtc__ZN3aaa9GG3121231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121232  : ::aaa::EE312 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31212323barEv
  ~GG3121232(); // tgen
  GG3121232(); // tgen
};
//SIG(1 _ZN3aaa9GG3121232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31212323barEv");}
aaa::GG3121232 ::~GG3121232(){ note_dtor("_ZN3aaa9GG3121232E", this);} // tgen
aaa::GG3121232 ::GG3121232(){ note_ctor("_ZN3aaa9GG3121232E", this);} // tgen
}
static void Test__ZN3aaa9GG3121232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121232E, buf);
    ::aaa::GG3121232 *dp, &lv = *(dp=new (buf) ::aaa::GG3121232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121232E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3121232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3121232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3121232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121232E);
    dp->::aaa::GG3121232::~GG3121232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121232E(Test__ZN3aaa9GG3121232E, "_ZN3aaa9GG3121232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121232C1Ev();
extern void _ZN3aaa9GG3121232D1Ev();
Name_Map name_map__ZN3aaa9GG3121232E[] = {
  NSPAIR(_ZN3aaa9GG3121232C1Ev),
  NSPAIR(_ZN3aaa9GG3121232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3121232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31212323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31212323barEv,_ZThn20_N3aaa9GG31212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31212323barEv,_ZThn28_N3aaa9GG31212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212323barEv,_ZThn20_N3aaa9GG31212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31212323barEv,_ZThn28_N3aaa9GG31212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121232E[];
Class_Descriptor cd__ZN3aaa9GG3121232E = {  "_ZN3aaa9GG3121232E", // class name
  bases__ZN3aaa9GG3121232E, 6,
  &(vtc__ZN3aaa9GG3121232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121233  : ::aaa::EE312 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31212333fooEv
  virtual void  bar(); // _ZN3aaa9GG31212333barEv
  ~GG3121233(); // tgen
  GG3121233(); // tgen
};
//SIG(1 _ZN3aaa9GG3121233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31212333fooEv");}
void  aaa::GG3121233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31212333barEv");}
aaa::GG3121233 ::~GG3121233(){ note_dtor("_ZN3aaa9GG3121233E", this);} // tgen
aaa::GG3121233 ::GG3121233(){ note_ctor("_ZN3aaa9GG3121233E", this);} // tgen
}
static void Test__ZN3aaa9GG3121233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121233E, buf);
    ::aaa::GG3121233 *dp, &lv = *(dp=new (buf) ::aaa::GG3121233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121233E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3121233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3121233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3121233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121233E);
    dp->::aaa::GG3121233::~GG3121233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121233E(Test__ZN3aaa9GG3121233E, "_ZN3aaa9GG3121233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121233C1Ev();
extern void _ZN3aaa9GG3121233D1Ev();
Name_Map name_map__ZN3aaa9GG3121233E[] = {
  NSPAIR(_ZN3aaa9GG3121233C1Ev),
  NSPAIR(_ZN3aaa9GG3121233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3121233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121233E[];
extern void _ZN3aaa9GG31212333fooEv();
extern void _ZN3aaa9GG31212333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31212333fooEv,_ZThn8_N3aaa9GG31212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31212333fooEv,_ZThn20_N3aaa9GG31212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31212333barEv,_ZThn20_N3aaa9GG31212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31212333barEv,_ZThn28_N3aaa9GG31212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31212333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31212333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31212333fooEv,_ZThn8_N3aaa9GG31212333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212333fooEv,_ZThn20_N3aaa9GG31212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31212333barEv,_ZThn20_N3aaa9GG31212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31212333barEv,_ZThn28_N3aaa9GG31212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121233E[];
Class_Descriptor cd__ZN3aaa9GG3121233E = {  "_ZN3aaa9GG3121233E", // class name
  bases__ZN3aaa9GG3121233E, 6,
  &(vtc__ZN3aaa9GG3121233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121311  : ::aaa::EE312 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31213113fooEv
  ~GG3121311(); // tgen
  GG3121311(); // tgen
};
//SIG(1 _ZN3aaa9GG3121311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31213113fooEv");}
aaa::GG3121311 ::~GG3121311(){ note_dtor("_ZN3aaa9GG3121311E", this);} // tgen
aaa::GG3121311 ::GG3121311(){ note_ctor("_ZN3aaa9GG3121311E", this);} // tgen
}
static void Test__ZN3aaa9GG3121311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121311E, buf);
    ::aaa::GG3121311 *dp, &lv = *(dp=new (buf) ::aaa::GG3121311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121311E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3121311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3121311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3121311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121311E);
    dp->::aaa::GG3121311::~GG3121311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121311E(Test__ZN3aaa9GG3121311E, "_ZN3aaa9GG3121311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121311C1Ev();
extern void _ZN3aaa9GG3121311D1Ev();
Name_Map name_map__ZN3aaa9GG3121311E[] = {
  NSPAIR(_ZN3aaa9GG3121311C1Ev),
  NSPAIR(_ZN3aaa9GG3121311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3121311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121311E[];
extern void _ZN3aaa9GG31213113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31213113fooEv,_ZThn8_N3aaa9GG31213113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31213113fooEv,_ZThn20_N3aaa9GG31213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213113fooEv,_ZThn28_N3aaa9GG31213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31213113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31213113fooEv,_ZThn8_N3aaa9GG31213113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213113fooEv,_ZThn20_N3aaa9GG31213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213113fooEv,_ZThn28_N3aaa9GG31213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121311E[];
Class_Descriptor cd__ZN3aaa9GG3121311E = {  "_ZN3aaa9GG3121311E", // class name
  bases__ZN3aaa9GG3121311E, 6,
  &(vtc__ZN3aaa9GG3121311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121312  : ::aaa::EE312 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31213123barEv
  ~GG3121312(); // tgen
  GG3121312(); // tgen
};
//SIG(1 _ZN3aaa9GG3121312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v4 v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31213123barEv");}
aaa::GG3121312 ::~GG3121312(){ note_dtor("_ZN3aaa9GG3121312E", this);} // tgen
aaa::GG3121312 ::GG3121312(){ note_ctor("_ZN3aaa9GG3121312E", this);} // tgen
}
static void Test__ZN3aaa9GG3121312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121312E, buf);
    ::aaa::GG3121312 *dp, &lv = *(dp=new (buf) ::aaa::GG3121312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121312E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3121312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3121312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3121312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121312E);
    dp->::aaa::GG3121312::~GG3121312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121312E(Test__ZN3aaa9GG3121312E, "_ZN3aaa9GG3121312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121312C1Ev();
extern void _ZN3aaa9GG3121312D1Ev();
Name_Map name_map__ZN3aaa9GG3121312E[] = {
  NSPAIR(_ZN3aaa9GG3121312C1Ev),
  NSPAIR(_ZN3aaa9GG3121312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3121312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31213123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213123barEv,_ZThn28_N3aaa9GG31213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213123barEv,_ZThn28_N3aaa9GG31213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121312E[];
Class_Descriptor cd__ZN3aaa9GG3121312E = {  "_ZN3aaa9GG3121312E", // class name
  bases__ZN3aaa9GG3121312E, 6,
  &(vtc__ZN3aaa9GG3121312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121313  : ::aaa::EE312 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31213133fooEv
  virtual void  bar(); // _ZN3aaa9GG31213133barEv
  ~GG3121313(); // tgen
  GG3121313(); // tgen
};
//SIG(1 _ZN3aaa9GG3121313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31213133fooEv");}
void  aaa::GG3121313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31213133barEv");}
aaa::GG3121313 ::~GG3121313(){ note_dtor("_ZN3aaa9GG3121313E", this);} // tgen
aaa::GG3121313 ::GG3121313(){ note_ctor("_ZN3aaa9GG3121313E", this);} // tgen
}
static void Test__ZN3aaa9GG3121313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121313E, buf);
    ::aaa::GG3121313 *dp, &lv = *(dp=new (buf) ::aaa::GG3121313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121313E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3121313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3121313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3121313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121313E);
    dp->::aaa::GG3121313::~GG3121313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121313E(Test__ZN3aaa9GG3121313E, "_ZN3aaa9GG3121313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121313C1Ev();
extern void _ZN3aaa9GG3121313D1Ev();
Name_Map name_map__ZN3aaa9GG3121313E[] = {
  NSPAIR(_ZN3aaa9GG3121313C1Ev),
  NSPAIR(_ZN3aaa9GG3121313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3121313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121313E[];
extern void _ZN3aaa9GG31213133fooEv();
extern void _ZN3aaa9GG31213133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31213133fooEv,_ZThn8_N3aaa9GG31213133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31213133fooEv,_ZThn20_N3aaa9GG31213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213133fooEv,_ZThn28_N3aaa9GG31213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213133barEv,_ZThn28_N3aaa9GG31213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31213133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31213133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31213133fooEv,_ZThn8_N3aaa9GG31213133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213133fooEv,_ZThn20_N3aaa9GG31213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213133fooEv,_ZThn28_N3aaa9GG31213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213133barEv,_ZThn28_N3aaa9GG31213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121313E[];
Class_Descriptor cd__ZN3aaa9GG3121313E = {  "_ZN3aaa9GG3121313E", // class name
  bases__ZN3aaa9GG3121313E, 6,
  &(vtc__ZN3aaa9GG3121313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121321  : ::aaa::EE312 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31213213fooEv
  ~GG3121321(); // tgen
  GG3121321(); // tgen
};
//SIG(1 _ZN3aaa9GG3121321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31213213fooEv");}
aaa::GG3121321 ::~GG3121321(){ note_dtor("_ZN3aaa9GG3121321E", this);} // tgen
aaa::GG3121321 ::GG3121321(){ note_ctor("_ZN3aaa9GG3121321E", this);} // tgen
}
static void Test__ZN3aaa9GG3121321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121321E, buf);
    ::aaa::GG3121321 *dp, &lv = *(dp=new (buf) ::aaa::GG3121321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121321E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3121321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3121321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3121321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121321E);
    dp->::aaa::GG3121321::~GG3121321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121321E(Test__ZN3aaa9GG3121321E, "_ZN3aaa9GG3121321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121321C1Ev();
extern void _ZN3aaa9GG3121321D1Ev();
Name_Map name_map__ZN3aaa9GG3121321E[] = {
  NSPAIR(_ZN3aaa9GG3121321C1Ev),
  NSPAIR(_ZN3aaa9GG3121321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3121321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121321E[];
extern void _ZN3aaa9GG31213213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31213213fooEv,_ZThn8_N3aaa9GG31213213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31213213fooEv,_ZThn20_N3aaa9GG31213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31213213fooEv,_ZThn28_N3aaa9GG31213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31213213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31213213fooEv,_ZThn8_N3aaa9GG31213213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213213fooEv,_ZThn20_N3aaa9GG31213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213213fooEv,_ZThn28_N3aaa9GG31213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121321E[];
Class_Descriptor cd__ZN3aaa9GG3121321E = {  "_ZN3aaa9GG3121321E", // class name
  bases__ZN3aaa9GG3121321E, 6,
  &(vtc__ZN3aaa9GG3121321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121322  : ::aaa::EE312 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31213223barEv
  ~GG3121322(); // tgen
  GG3121322(); // tgen
};
//SIG(1 _ZN3aaa9GG3121322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v5 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31213223barEv");}
aaa::GG3121322 ::~GG3121322(){ note_dtor("_ZN3aaa9GG3121322E", this);} // tgen
aaa::GG3121322 ::GG3121322(){ note_ctor("_ZN3aaa9GG3121322E", this);} // tgen
}
static void Test__ZN3aaa9GG3121322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121322E, buf);
    ::aaa::GG3121322 *dp, &lv = *(dp=new (buf) ::aaa::GG3121322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121322E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3121322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3121322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3121322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121322E);
    dp->::aaa::GG3121322::~GG3121322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121322E(Test__ZN3aaa9GG3121322E, "_ZN3aaa9GG3121322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121322C1Ev();
extern void _ZN3aaa9GG3121322D1Ev();
Name_Map name_map__ZN3aaa9GG3121322E[] = {
  NSPAIR(_ZN3aaa9GG3121322C1Ev),
  NSPAIR(_ZN3aaa9GG3121322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3121322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31213223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31213223barEv,_ZThn20_N3aaa9GG31213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31213223barEv,_ZThn28_N3aaa9GG31213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213223barEv,_ZThn20_N3aaa9GG31213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213223barEv,_ZThn28_N3aaa9GG31213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121322E[];
Class_Descriptor cd__ZN3aaa9GG3121322E = {  "_ZN3aaa9GG3121322E", // class name
  bases__ZN3aaa9GG3121322E, 6,
  &(vtc__ZN3aaa9GG3121322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121323  : ::aaa::EE312 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31213233fooEv
  virtual void  bar(); // _ZN3aaa9GG31213233barEv
  ~GG3121323(); // tgen
  GG3121323(); // tgen
};
//SIG(1 _ZN3aaa9GG3121323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31213233fooEv");}
void  aaa::GG3121323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31213233barEv");}
aaa::GG3121323 ::~GG3121323(){ note_dtor("_ZN3aaa9GG3121323E", this);} // tgen
aaa::GG3121323 ::GG3121323(){ note_ctor("_ZN3aaa9GG3121323E", this);} // tgen
}
static void Test__ZN3aaa9GG3121323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121323E, buf);
    ::aaa::GG3121323 *dp, &lv = *(dp=new (buf) ::aaa::GG3121323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121323E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3121323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3121323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3121323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121323E);
    dp->::aaa::GG3121323::~GG3121323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121323E(Test__ZN3aaa9GG3121323E, "_ZN3aaa9GG3121323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121323C1Ev();
extern void _ZN3aaa9GG3121323D1Ev();
Name_Map name_map__ZN3aaa9GG3121323E[] = {
  NSPAIR(_ZN3aaa9GG3121323C1Ev),
  NSPAIR(_ZN3aaa9GG3121323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3121323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121323E[];
extern void _ZN3aaa9GG31213233fooEv();
extern void _ZN3aaa9GG31213233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31213233fooEv,_ZThn8_N3aaa9GG31213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31213233fooEv,_ZThn20_N3aaa9GG31213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31213233barEv,_ZThn20_N3aaa9GG31213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213233fooEv,_ZThn28_N3aaa9GG31213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213233barEv,_ZThn28_N3aaa9GG31213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31213233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31213233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31213233fooEv,_ZThn8_N3aaa9GG31213233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213233fooEv,_ZThn20_N3aaa9GG31213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213233barEv,_ZThn20_N3aaa9GG31213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213233fooEv,_ZThn28_N3aaa9GG31213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213233barEv,_ZThn28_N3aaa9GG31213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121323E[];
Class_Descriptor cd__ZN3aaa9GG3121323E = {  "_ZN3aaa9GG3121323E", // class name
  bases__ZN3aaa9GG3121323E, 6,
  &(vtc__ZN3aaa9GG3121323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121331  : ::aaa::EE312 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31213313fooEv
  ~GG3121331(); // tgen
  GG3121331(); // tgen
};
//SIG(1 _ZN3aaa9GG3121331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31213313fooEv");}
aaa::GG3121331 ::~GG3121331(){ note_dtor("_ZN3aaa9GG3121331E", this);} // tgen
aaa::GG3121331 ::GG3121331(){ note_ctor("_ZN3aaa9GG3121331E", this);} // tgen
}
static void Test__ZN3aaa9GG3121331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121331E, buf);
    ::aaa::GG3121331 *dp, &lv = *(dp=new (buf) ::aaa::GG3121331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121331E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3121331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3121331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3121331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121331E);
    dp->::aaa::GG3121331::~GG3121331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121331E(Test__ZN3aaa9GG3121331E, "_ZN3aaa9GG3121331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121331C1Ev();
extern void _ZN3aaa9GG3121331D1Ev();
Name_Map name_map__ZN3aaa9GG3121331E[] = {
  NSPAIR(_ZN3aaa9GG3121331C1Ev),
  NSPAIR(_ZN3aaa9GG3121331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3121331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121331E[];
extern void _ZN3aaa9GG31213313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31213313fooEv,_ZThn8_N3aaa9GG31213313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31213313fooEv,_ZThn20_N3aaa9GG31213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31213313fooEv,_ZThn28_N3aaa9GG31213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31213313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31213313fooEv,_ZThn8_N3aaa9GG31213313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213313fooEv,_ZThn20_N3aaa9GG31213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213313fooEv,_ZThn28_N3aaa9GG31213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121331E[];
Class_Descriptor cd__ZN3aaa9GG3121331E = {  "_ZN3aaa9GG3121331E", // class name
  bases__ZN3aaa9GG3121331E, 6,
  &(vtc__ZN3aaa9GG3121331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121332  : ::aaa::EE312 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31213323barEv
  ~GG3121332(); // tgen
  GG3121332(); // tgen
};
//SIG(1 _ZN3aaa9GG3121332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v4 v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3121332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31213323barEv");}
aaa::GG3121332 ::~GG3121332(){ note_dtor("_ZN3aaa9GG3121332E", this);} // tgen
aaa::GG3121332 ::GG3121332(){ note_ctor("_ZN3aaa9GG3121332E", this);} // tgen
}
static void Test__ZN3aaa9GG3121332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121332E, buf);
    ::aaa::GG3121332 *dp, &lv = *(dp=new (buf) ::aaa::GG3121332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121332E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3121332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3121332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3121332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121332E);
    dp->::aaa::GG3121332::~GG3121332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121332E(Test__ZN3aaa9GG3121332E, "_ZN3aaa9GG3121332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121332C1Ev();
extern void _ZN3aaa9GG3121332D1Ev();
Name_Map name_map__ZN3aaa9GG3121332E[] = {
  NSPAIR(_ZN3aaa9GG3121332C1Ev),
  NSPAIR(_ZN3aaa9GG3121332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3121332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31213323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31213323barEv,_ZThn20_N3aaa9GG31213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213323barEv,_ZThn28_N3aaa9GG31213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213323barEv,_ZThn20_N3aaa9GG31213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213323barEv,_ZThn28_N3aaa9GG31213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121332E[];
Class_Descriptor cd__ZN3aaa9GG3121332E = {  "_ZN3aaa9GG3121332E", // class name
  bases__ZN3aaa9GG3121332E, 6,
  &(vtc__ZN3aaa9GG3121332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3121333  : ::aaa::EE312 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31213333fooEv
  virtual void  bar(); // _ZN3aaa9GG31213333barEv
  ~GG3121333(); // tgen
  GG3121333(); // tgen
};
//SIG(1 _ZN3aaa9GG3121333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3121333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31213333fooEv");}
void  aaa::GG3121333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31213333barEv");}
aaa::GG3121333 ::~GG3121333(){ note_dtor("_ZN3aaa9GG3121333E", this);} // tgen
aaa::GG3121333 ::GG3121333(){ note_ctor("_ZN3aaa9GG3121333E", this);} // tgen
}
static void Test__ZN3aaa9GG3121333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3121333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3121333E, buf);
    ::aaa::GG3121333 *dp, &lv = *(dp=new (buf) ::aaa::GG3121333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3121333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3121333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3121333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3121333E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3121333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3121333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3121333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3121333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3121333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3121333E);
    dp->::aaa::GG3121333::~GG3121333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3121333E(Test__ZN3aaa9GG3121333E, "_ZN3aaa9GG3121333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3121333C1Ev();
extern void _ZN3aaa9GG3121333D1Ev();
Name_Map name_map__ZN3aaa9GG3121333E[] = {
  NSPAIR(_ZN3aaa9GG3121333C1Ev),
  NSPAIR(_ZN3aaa9GG3121333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3121333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3121333E[];
extern void _ZN3aaa9GG31213333fooEv();
extern void _ZN3aaa9GG31213333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31213333fooEv,_ZThn8_N3aaa9GG31213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31213333fooEv,_ZThn20_N3aaa9GG31213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31213333barEv,_ZThn20_N3aaa9GG31213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213333fooEv,_ZThn28_N3aaa9GG31213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31213333barEv,_ZThn28_N3aaa9GG31213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3121333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31213333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31213333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31213333fooEv,_ZThn8_N3aaa9GG31213333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213333fooEv,_ZThn20_N3aaa9GG31213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31213333barEv,_ZThn20_N3aaa9GG31213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3121333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213333fooEv,_ZThn28_N3aaa9GG31213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31213333barEv,_ZThn28_N3aaa9GG31213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3121333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3121333E[];
Class_Descriptor cd__ZN3aaa9GG3121333E = {  "_ZN3aaa9GG3121333E", // class name
  bases__ZN3aaa9GG3121333E, 6,
  &(vtc__ZN3aaa9GG3121333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3121333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3121333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122111  : ::aaa::EE312 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31221113fooEv
  ~GG3122111(); // tgen
  GG3122111(); // tgen
};
//SIG(1 _ZN3aaa9GG3122111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31221113fooEv");}
aaa::GG3122111 ::~GG3122111(){ note_dtor("_ZN3aaa9GG3122111E", this);} // tgen
aaa::GG3122111 ::GG3122111(){ note_ctor("_ZN3aaa9GG3122111E", this);} // tgen
}
static void Test__ZN3aaa9GG3122111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122111E, buf);
    ::aaa::GG3122111 *dp, &lv = *(dp=new (buf) ::aaa::GG3122111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122111E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3122111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3122111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3122111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122111E);
    dp->::aaa::GG3122111::~GG3122111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122111E(Test__ZN3aaa9GG3122111E, "_ZN3aaa9GG3122111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122111C1Ev();
extern void _ZN3aaa9GG3122111D1Ev();
Name_Map name_map__ZN3aaa9GG3122111E[] = {
  NSPAIR(_ZN3aaa9GG3122111C1Ev),
  NSPAIR(_ZN3aaa9GG3122111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3122111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122111E[];
extern void _ZN3aaa9GG31221113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31221113fooEv,_ZThn8_N3aaa9GG31221113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31221113fooEv,_ZThn20_N3aaa9GG31221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31221113fooEv,_ZThn28_N3aaa9GG31221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31221113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31221113fooEv,_ZThn8_N3aaa9GG31221113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221113fooEv,_ZThn20_N3aaa9GG31221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31221113fooEv,_ZThn28_N3aaa9GG31221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122111E[];
Class_Descriptor cd__ZN3aaa9GG3122111E = {  "_ZN3aaa9GG3122111E", // class name
  bases__ZN3aaa9GG3122111E, 6,
  &(vtc__ZN3aaa9GG3122111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122112  : ::aaa::EE312 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31221123barEv
  ~GG3122112(); // tgen
  GG3122112(); // tgen
};
//SIG(1 _ZN3aaa9GG3122112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31221123barEv");}
aaa::GG3122112 ::~GG3122112(){ note_dtor("_ZN3aaa9GG3122112E", this);} // tgen
aaa::GG3122112 ::GG3122112(){ note_ctor("_ZN3aaa9GG3122112E", this);} // tgen
}
static void Test__ZN3aaa9GG3122112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122112E, buf);
    ::aaa::GG3122112 *dp, &lv = *(dp=new (buf) ::aaa::GG3122112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122112E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3122112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3122112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3122112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122112E);
    dp->::aaa::GG3122112::~GG3122112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122112E(Test__ZN3aaa9GG3122112E, "_ZN3aaa9GG3122112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122112C1Ev();
extern void _ZN3aaa9GG3122112D1Ev();
Name_Map name_map__ZN3aaa9GG3122112E[] = {
  NSPAIR(_ZN3aaa9GG3122112C1Ev),
  NSPAIR(_ZN3aaa9GG3122112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3122112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31221123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31221123barEv,_ZThn20_N3aaa9GG31221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221123barEv,_ZThn20_N3aaa9GG31221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122112E[];
Class_Descriptor cd__ZN3aaa9GG3122112E = {  "_ZN3aaa9GG3122112E", // class name
  bases__ZN3aaa9GG3122112E, 6,
  &(vtc__ZN3aaa9GG3122112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122113  : ::aaa::EE312 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31221133fooEv
  virtual void  bar(); // _ZN3aaa9GG31221133barEv
  ~GG3122113(); // tgen
  GG3122113(); // tgen
};
//SIG(1 _ZN3aaa9GG3122113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31221133fooEv");}
void  aaa::GG3122113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31221133barEv");}
aaa::GG3122113 ::~GG3122113(){ note_dtor("_ZN3aaa9GG3122113E", this);} // tgen
aaa::GG3122113 ::GG3122113(){ note_ctor("_ZN3aaa9GG3122113E", this);} // tgen
}
static void Test__ZN3aaa9GG3122113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122113E, buf);
    ::aaa::GG3122113 *dp, &lv = *(dp=new (buf) ::aaa::GG3122113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122113E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3122113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3122113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3122113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122113E);
    dp->::aaa::GG3122113::~GG3122113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122113E(Test__ZN3aaa9GG3122113E, "_ZN3aaa9GG3122113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122113C1Ev();
extern void _ZN3aaa9GG3122113D1Ev();
Name_Map name_map__ZN3aaa9GG3122113E[] = {
  NSPAIR(_ZN3aaa9GG3122113C1Ev),
  NSPAIR(_ZN3aaa9GG3122113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3122113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122113E[];
extern void _ZN3aaa9GG31221133fooEv();
extern void _ZN3aaa9GG31221133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31221133fooEv,_ZThn8_N3aaa9GG31221133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31221133barEv,_ZThn20_N3aaa9GG31221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31221133fooEv,_ZThn20_N3aaa9GG31221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31221133fooEv,_ZThn28_N3aaa9GG31221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31221133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31221133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31221133fooEv,_ZThn8_N3aaa9GG31221133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221133barEv,_ZThn20_N3aaa9GG31221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221133fooEv,_ZThn20_N3aaa9GG31221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31221133fooEv,_ZThn28_N3aaa9GG31221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122113E[];
Class_Descriptor cd__ZN3aaa9GG3122113E = {  "_ZN3aaa9GG3122113E", // class name
  bases__ZN3aaa9GG3122113E, 6,
  &(vtc__ZN3aaa9GG3122113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122121  : ::aaa::EE312 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31221213fooEv
  ~GG3122121(); // tgen
  GG3122121(); // tgen
};
//SIG(1 _ZN3aaa9GG3122121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31221213fooEv");}
aaa::GG3122121 ::~GG3122121(){ note_dtor("_ZN3aaa9GG3122121E", this);} // tgen
aaa::GG3122121 ::GG3122121(){ note_ctor("_ZN3aaa9GG3122121E", this);} // tgen
}
static void Test__ZN3aaa9GG3122121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122121E, buf);
    ::aaa::GG3122121 *dp, &lv = *(dp=new (buf) ::aaa::GG3122121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122121E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3122121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3122121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3122121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122121E);
    dp->::aaa::GG3122121::~GG3122121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122121E(Test__ZN3aaa9GG3122121E, "_ZN3aaa9GG3122121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122121C1Ev();
extern void _ZN3aaa9GG3122121D1Ev();
Name_Map name_map__ZN3aaa9GG3122121E[] = {
  NSPAIR(_ZN3aaa9GG3122121C1Ev),
  NSPAIR(_ZN3aaa9GG3122121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3122121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122121E[];
extern void _ZN3aaa9GG31221213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31221213fooEv,_ZThn8_N3aaa9GG31221213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31221213fooEv,_ZThn28_N3aaa9GG31221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31221213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31221213fooEv,_ZThn8_N3aaa9GG31221213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31221213fooEv,_ZThn28_N3aaa9GG31221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122121E[];
Class_Descriptor cd__ZN3aaa9GG3122121E = {  "_ZN3aaa9GG3122121E", // class name
  bases__ZN3aaa9GG3122121E, 6,
  &(vtc__ZN3aaa9GG3122121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122122  : ::aaa::EE312 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31221223barEv
  ~GG3122122(); // tgen
  GG3122122(); // tgen
};
//SIG(1 _ZN3aaa9GG3122122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31221223barEv");}
aaa::GG3122122 ::~GG3122122(){ note_dtor("_ZN3aaa9GG3122122E", this);} // tgen
aaa::GG3122122 ::GG3122122(){ note_ctor("_ZN3aaa9GG3122122E", this);} // tgen
}
static void Test__ZN3aaa9GG3122122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122122E, buf);
    ::aaa::GG3122122 *dp, &lv = *(dp=new (buf) ::aaa::GG3122122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122122E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3122122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3122122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3122122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122122E);
    dp->::aaa::GG3122122::~GG3122122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122122E(Test__ZN3aaa9GG3122122E, "_ZN3aaa9GG3122122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122122C1Ev();
extern void _ZN3aaa9GG3122122D1Ev();
Name_Map name_map__ZN3aaa9GG3122122E[] = {
  NSPAIR(_ZN3aaa9GG3122122C1Ev),
  NSPAIR(_ZN3aaa9GG3122122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3122122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31221223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31221223barEv,_ZThn20_N3aaa9GG31221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221223barEv,_ZThn20_N3aaa9GG31221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122122E[];
Class_Descriptor cd__ZN3aaa9GG3122122E = {  "_ZN3aaa9GG3122122E", // class name
  bases__ZN3aaa9GG3122122E, 6,
  &(vtc__ZN3aaa9GG3122122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122123  : ::aaa::EE312 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31221233fooEv
  virtual void  bar(); // _ZN3aaa9GG31221233barEv
  ~GG3122123(); // tgen
  GG3122123(); // tgen
};
//SIG(1 _ZN3aaa9GG3122123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31221233fooEv");}
void  aaa::GG3122123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31221233barEv");}
aaa::GG3122123 ::~GG3122123(){ note_dtor("_ZN3aaa9GG3122123E", this);} // tgen
aaa::GG3122123 ::GG3122123(){ note_ctor("_ZN3aaa9GG3122123E", this);} // tgen
}
static void Test__ZN3aaa9GG3122123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122123E, buf);
    ::aaa::GG3122123 *dp, &lv = *(dp=new (buf) ::aaa::GG3122123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122123E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3122123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3122123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3122123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122123E);
    dp->::aaa::GG3122123::~GG3122123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122123E(Test__ZN3aaa9GG3122123E, "_ZN3aaa9GG3122123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122123C1Ev();
extern void _ZN3aaa9GG3122123D1Ev();
Name_Map name_map__ZN3aaa9GG3122123E[] = {
  NSPAIR(_ZN3aaa9GG3122123C1Ev),
  NSPAIR(_ZN3aaa9GG3122123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3122123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122123E[];
extern void _ZN3aaa9GG31221233fooEv();
extern void _ZN3aaa9GG31221233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31221233fooEv,_ZThn8_N3aaa9GG31221233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31221233barEv,_ZThn20_N3aaa9GG31221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31221233fooEv,_ZThn28_N3aaa9GG31221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31221233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31221233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31221233fooEv,_ZThn8_N3aaa9GG31221233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221233barEv,_ZThn20_N3aaa9GG31221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31221233fooEv,_ZThn28_N3aaa9GG31221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122123E[];
Class_Descriptor cd__ZN3aaa9GG3122123E = {  "_ZN3aaa9GG3122123E", // class name
  bases__ZN3aaa9GG3122123E, 6,
  &(vtc__ZN3aaa9GG3122123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122131  : ::aaa::EE312 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31221313fooEv
  ~GG3122131(); // tgen
  GG3122131(); // tgen
};
//SIG(1 _ZN3aaa9GG3122131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31221313fooEv");}
aaa::GG3122131 ::~GG3122131(){ note_dtor("_ZN3aaa9GG3122131E", this);} // tgen
aaa::GG3122131 ::GG3122131(){ note_ctor("_ZN3aaa9GG3122131E", this);} // tgen
}
static void Test__ZN3aaa9GG3122131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122131E, buf);
    ::aaa::GG3122131 *dp, &lv = *(dp=new (buf) ::aaa::GG3122131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122131E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3122131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3122131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3122131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122131E);
    dp->::aaa::GG3122131::~GG3122131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122131E(Test__ZN3aaa9GG3122131E, "_ZN3aaa9GG3122131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122131C1Ev();
extern void _ZN3aaa9GG3122131D1Ev();
Name_Map name_map__ZN3aaa9GG3122131E[] = {
  NSPAIR(_ZN3aaa9GG3122131C1Ev),
  NSPAIR(_ZN3aaa9GG3122131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3122131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122131E[];
extern void _ZN3aaa9GG31221313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31221313fooEv,_ZThn8_N3aaa9GG31221313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31221313fooEv,_ZThn20_N3aaa9GG31221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31221313fooEv,_ZThn28_N3aaa9GG31221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31221313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31221313fooEv,_ZThn8_N3aaa9GG31221313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221313fooEv,_ZThn20_N3aaa9GG31221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31221313fooEv,_ZThn28_N3aaa9GG31221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122131E[];
Class_Descriptor cd__ZN3aaa9GG3122131E = {  "_ZN3aaa9GG3122131E", // class name
  bases__ZN3aaa9GG3122131E, 6,
  &(vtc__ZN3aaa9GG3122131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122132  : ::aaa::EE312 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31221323barEv
  ~GG3122132(); // tgen
  GG3122132(); // tgen
};
//SIG(1 _ZN3aaa9GG3122132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31221323barEv");}
aaa::GG3122132 ::~GG3122132(){ note_dtor("_ZN3aaa9GG3122132E", this);} // tgen
aaa::GG3122132 ::GG3122132(){ note_ctor("_ZN3aaa9GG3122132E", this);} // tgen
}
static void Test__ZN3aaa9GG3122132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122132E, buf);
    ::aaa::GG3122132 *dp, &lv = *(dp=new (buf) ::aaa::GG3122132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122132E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3122132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3122132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3122132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122132E);
    dp->::aaa::GG3122132::~GG3122132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122132E(Test__ZN3aaa9GG3122132E, "_ZN3aaa9GG3122132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122132C1Ev();
extern void _ZN3aaa9GG3122132D1Ev();
Name_Map name_map__ZN3aaa9GG3122132E[] = {
  NSPAIR(_ZN3aaa9GG3122132C1Ev),
  NSPAIR(_ZN3aaa9GG3122132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3122132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31221323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31221323barEv,_ZThn20_N3aaa9GG31221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221323barEv,_ZThn20_N3aaa9GG31221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122132E[];
Class_Descriptor cd__ZN3aaa9GG3122132E = {  "_ZN3aaa9GG3122132E", // class name
  bases__ZN3aaa9GG3122132E, 6,
  &(vtc__ZN3aaa9GG3122132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122133  : ::aaa::EE312 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31221333fooEv
  virtual void  bar(); // _ZN3aaa9GG31221333barEv
  ~GG3122133(); // tgen
  GG3122133(); // tgen
};
//SIG(1 _ZN3aaa9GG3122133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31221333fooEv");}
void  aaa::GG3122133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31221333barEv");}
aaa::GG3122133 ::~GG3122133(){ note_dtor("_ZN3aaa9GG3122133E", this);} // tgen
aaa::GG3122133 ::GG3122133(){ note_ctor("_ZN3aaa9GG3122133E", this);} // tgen
}
static void Test__ZN3aaa9GG3122133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122133E, buf);
    ::aaa::GG3122133 *dp, &lv = *(dp=new (buf) ::aaa::GG3122133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122133E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3122133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3122133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3122133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122133E);
    dp->::aaa::GG3122133::~GG3122133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122133E(Test__ZN3aaa9GG3122133E, "_ZN3aaa9GG3122133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122133C1Ev();
extern void _ZN3aaa9GG3122133D1Ev();
Name_Map name_map__ZN3aaa9GG3122133E[] = {
  NSPAIR(_ZN3aaa9GG3122133C1Ev),
  NSPAIR(_ZN3aaa9GG3122133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3122133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122133E[];
extern void _ZN3aaa9GG31221333fooEv();
extern void _ZN3aaa9GG31221333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31221333fooEv,_ZThn8_N3aaa9GG31221333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31221333barEv,_ZThn20_N3aaa9GG31221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31221333fooEv,_ZThn20_N3aaa9GG31221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31221333fooEv,_ZThn28_N3aaa9GG31221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31221333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31221333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31221333fooEv,_ZThn8_N3aaa9GG31221333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221333barEv,_ZThn20_N3aaa9GG31221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31221333fooEv,_ZThn20_N3aaa9GG31221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31221333fooEv,_ZThn28_N3aaa9GG31221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122133E[];
Class_Descriptor cd__ZN3aaa9GG3122133E = {  "_ZN3aaa9GG3122133E", // class name
  bases__ZN3aaa9GG3122133E, 6,
  &(vtc__ZN3aaa9GG3122133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122211  : ::aaa::EE312 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31222113fooEv
  ~GG3122211(); // tgen
  GG3122211(); // tgen
};
//SIG(1 _ZN3aaa9GG3122211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31222113fooEv");}
aaa::GG3122211 ::~GG3122211(){ note_dtor("_ZN3aaa9GG3122211E", this);} // tgen
aaa::GG3122211 ::GG3122211(){ note_ctor("_ZN3aaa9GG3122211E", this);} // tgen
}
static void Test__ZN3aaa9GG3122211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122211E, buf);
    ::aaa::GG3122211 *dp, &lv = *(dp=new (buf) ::aaa::GG3122211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122211E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3122211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3122211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3122211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122211E);
    dp->::aaa::GG3122211::~GG3122211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122211E(Test__ZN3aaa9GG3122211E, "_ZN3aaa9GG3122211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122211C1Ev();
extern void _ZN3aaa9GG3122211D1Ev();
Name_Map name_map__ZN3aaa9GG3122211E[] = {
  NSPAIR(_ZN3aaa9GG3122211C1Ev),
  NSPAIR(_ZN3aaa9GG3122211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3122211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122211E[];
extern void _ZN3aaa9GG31222113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31222113fooEv,_ZThn8_N3aaa9GG31222113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31222113fooEv,_ZThn20_N3aaa9GG31222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31222113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31222113fooEv,_ZThn8_N3aaa9GG31222113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222113fooEv,_ZThn20_N3aaa9GG31222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122211E[];
Class_Descriptor cd__ZN3aaa9GG3122211E = {  "_ZN3aaa9GG3122211E", // class name
  bases__ZN3aaa9GG3122211E, 6,
  &(vtc__ZN3aaa9GG3122211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122212  : ::aaa::EE312 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31222123barEv
  ~GG3122212(); // tgen
  GG3122212(); // tgen
};
//SIG(1 _ZN3aaa9GG3122212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31222123barEv");}
aaa::GG3122212 ::~GG3122212(){ note_dtor("_ZN3aaa9GG3122212E", this);} // tgen
aaa::GG3122212 ::GG3122212(){ note_ctor("_ZN3aaa9GG3122212E", this);} // tgen
}
static void Test__ZN3aaa9GG3122212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122212E, buf);
    ::aaa::GG3122212 *dp, &lv = *(dp=new (buf) ::aaa::GG3122212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122212E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3122212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3122212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3122212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122212E);
    dp->::aaa::GG3122212::~GG3122212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122212E(Test__ZN3aaa9GG3122212E, "_ZN3aaa9GG3122212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122212C1Ev();
extern void _ZN3aaa9GG3122212D1Ev();
Name_Map name_map__ZN3aaa9GG3122212E[] = {
  NSPAIR(_ZN3aaa9GG3122212C1Ev),
  NSPAIR(_ZN3aaa9GG3122212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3122212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31222123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31222123barEv,_ZThn20_N3aaa9GG31222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31222123barEv,_ZThn28_N3aaa9GG31222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222123barEv,_ZThn20_N3aaa9GG31222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31222123barEv,_ZThn28_N3aaa9GG31222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122212E[];
Class_Descriptor cd__ZN3aaa9GG3122212E = {  "_ZN3aaa9GG3122212E", // class name
  bases__ZN3aaa9GG3122212E, 6,
  &(vtc__ZN3aaa9GG3122212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122213  : ::aaa::EE312 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31222133fooEv
  virtual void  bar(); // _ZN3aaa9GG31222133barEv
  ~GG3122213(); // tgen
  GG3122213(); // tgen
};
//SIG(1 _ZN3aaa9GG3122213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31222133fooEv");}
void  aaa::GG3122213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31222133barEv");}
aaa::GG3122213 ::~GG3122213(){ note_dtor("_ZN3aaa9GG3122213E", this);} // tgen
aaa::GG3122213 ::GG3122213(){ note_ctor("_ZN3aaa9GG3122213E", this);} // tgen
}
static void Test__ZN3aaa9GG3122213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122213E, buf);
    ::aaa::GG3122213 *dp, &lv = *(dp=new (buf) ::aaa::GG3122213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122213E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3122213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3122213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3122213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122213E);
    dp->::aaa::GG3122213::~GG3122213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122213E(Test__ZN3aaa9GG3122213E, "_ZN3aaa9GG3122213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122213C1Ev();
extern void _ZN3aaa9GG3122213D1Ev();
Name_Map name_map__ZN3aaa9GG3122213E[] = {
  NSPAIR(_ZN3aaa9GG3122213C1Ev),
  NSPAIR(_ZN3aaa9GG3122213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3122213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122213E[];
extern void _ZN3aaa9GG31222133fooEv();
extern void _ZN3aaa9GG31222133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31222133fooEv,_ZThn8_N3aaa9GG31222133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31222133barEv,_ZThn20_N3aaa9GG31222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31222133fooEv,_ZThn20_N3aaa9GG31222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31222133barEv,_ZThn28_N3aaa9GG31222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31222133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31222133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31222133fooEv,_ZThn8_N3aaa9GG31222133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222133barEv,_ZThn20_N3aaa9GG31222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222133fooEv,_ZThn20_N3aaa9GG31222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31222133barEv,_ZThn28_N3aaa9GG31222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122213E[];
Class_Descriptor cd__ZN3aaa9GG3122213E = {  "_ZN3aaa9GG3122213E", // class name
  bases__ZN3aaa9GG3122213E, 6,
  &(vtc__ZN3aaa9GG3122213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122221  : ::aaa::EE312 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31222213fooEv
  ~GG3122221(); // tgen
  GG3122221(); // tgen
};
//SIG(1 _ZN3aaa9GG3122221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31222213fooEv");}
aaa::GG3122221 ::~GG3122221(){ note_dtor("_ZN3aaa9GG3122221E", this);} // tgen
aaa::GG3122221 ::GG3122221(){ note_ctor("_ZN3aaa9GG3122221E", this);} // tgen
}
static void Test__ZN3aaa9GG3122221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122221E, buf);
    ::aaa::GG3122221 *dp, &lv = *(dp=new (buf) ::aaa::GG3122221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122221E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3122221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3122221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3122221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122221E);
    dp->::aaa::GG3122221::~GG3122221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122221E(Test__ZN3aaa9GG3122221E, "_ZN3aaa9GG3122221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122221C1Ev();
extern void _ZN3aaa9GG3122221D1Ev();
Name_Map name_map__ZN3aaa9GG3122221E[] = {
  NSPAIR(_ZN3aaa9GG3122221C1Ev),
  NSPAIR(_ZN3aaa9GG3122221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3122221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122221E[];
extern void _ZN3aaa9GG31222213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31222213fooEv,_ZThn8_N3aaa9GG31222213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31222213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31222213fooEv,_ZThn8_N3aaa9GG31222213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122221E[];
Class_Descriptor cd__ZN3aaa9GG3122221E = {  "_ZN3aaa9GG3122221E", // class name
  bases__ZN3aaa9GG3122221E, 6,
  &(vtc__ZN3aaa9GG3122221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122222  : ::aaa::EE312 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31222223barEv
  ~GG3122222(); // tgen
  GG3122222(); // tgen
};
//SIG(1 _ZN3aaa9GG3122222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31222223barEv");}
aaa::GG3122222 ::~GG3122222(){ note_dtor("_ZN3aaa9GG3122222E", this);} // tgen
aaa::GG3122222 ::GG3122222(){ note_ctor("_ZN3aaa9GG3122222E", this);} // tgen
}
static void Test__ZN3aaa9GG3122222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122222E, buf);
    ::aaa::GG3122222 *dp, &lv = *(dp=new (buf) ::aaa::GG3122222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122222E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3122222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3122222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3122222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122222E);
    dp->::aaa::GG3122222::~GG3122222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122222E(Test__ZN3aaa9GG3122222E, "_ZN3aaa9GG3122222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122222C1Ev();
extern void _ZN3aaa9GG3122222D1Ev();
Name_Map name_map__ZN3aaa9GG3122222E[] = {
  NSPAIR(_ZN3aaa9GG3122222C1Ev),
  NSPAIR(_ZN3aaa9GG3122222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3122222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31222223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31222223barEv,_ZThn20_N3aaa9GG31222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31222223barEv,_ZThn28_N3aaa9GG31222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222223barEv,_ZThn20_N3aaa9GG31222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31222223barEv,_ZThn28_N3aaa9GG31222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122222E[];
Class_Descriptor cd__ZN3aaa9GG3122222E = {  "_ZN3aaa9GG3122222E", // class name
  bases__ZN3aaa9GG3122222E, 6,
  &(vtc__ZN3aaa9GG3122222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122223  : ::aaa::EE312 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31222233fooEv
  virtual void  bar(); // _ZN3aaa9GG31222233barEv
  ~GG3122223(); // tgen
  GG3122223(); // tgen
};
//SIG(1 _ZN3aaa9GG3122223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31222233fooEv");}
void  aaa::GG3122223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31222233barEv");}
aaa::GG3122223 ::~GG3122223(){ note_dtor("_ZN3aaa9GG3122223E", this);} // tgen
aaa::GG3122223 ::GG3122223(){ note_ctor("_ZN3aaa9GG3122223E", this);} // tgen
}
static void Test__ZN3aaa9GG3122223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122223E, buf);
    ::aaa::GG3122223 *dp, &lv = *(dp=new (buf) ::aaa::GG3122223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122223E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3122223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3122223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3122223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122223E);
    dp->::aaa::GG3122223::~GG3122223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122223E(Test__ZN3aaa9GG3122223E, "_ZN3aaa9GG3122223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122223C1Ev();
extern void _ZN3aaa9GG3122223D1Ev();
Name_Map name_map__ZN3aaa9GG3122223E[] = {
  NSPAIR(_ZN3aaa9GG3122223C1Ev),
  NSPAIR(_ZN3aaa9GG3122223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3122223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122223E[];
extern void _ZN3aaa9GG31222233fooEv();
extern void _ZN3aaa9GG31222233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31222233fooEv,_ZThn8_N3aaa9GG31222233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31222233barEv,_ZThn20_N3aaa9GG31222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31222233barEv,_ZThn28_N3aaa9GG31222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31222233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31222233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31222233fooEv,_ZThn8_N3aaa9GG31222233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222233barEv,_ZThn20_N3aaa9GG31222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31222233barEv,_ZThn28_N3aaa9GG31222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122223E[];
Class_Descriptor cd__ZN3aaa9GG3122223E = {  "_ZN3aaa9GG3122223E", // class name
  bases__ZN3aaa9GG3122223E, 6,
  &(vtc__ZN3aaa9GG3122223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122231  : ::aaa::EE312 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31222313fooEv
  ~GG3122231(); // tgen
  GG3122231(); // tgen
};
//SIG(1 _ZN3aaa9GG3122231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31222313fooEv");}
aaa::GG3122231 ::~GG3122231(){ note_dtor("_ZN3aaa9GG3122231E", this);} // tgen
aaa::GG3122231 ::GG3122231(){ note_ctor("_ZN3aaa9GG3122231E", this);} // tgen
}
static void Test__ZN3aaa9GG3122231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122231E, buf);
    ::aaa::GG3122231 *dp, &lv = *(dp=new (buf) ::aaa::GG3122231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122231E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3122231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3122231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3122231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122231E);
    dp->::aaa::GG3122231::~GG3122231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122231E(Test__ZN3aaa9GG3122231E, "_ZN3aaa9GG3122231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122231C1Ev();
extern void _ZN3aaa9GG3122231D1Ev();
Name_Map name_map__ZN3aaa9GG3122231E[] = {
  NSPAIR(_ZN3aaa9GG3122231C1Ev),
  NSPAIR(_ZN3aaa9GG3122231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3122231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122231E[];
extern void _ZN3aaa9GG31222313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31222313fooEv,_ZThn8_N3aaa9GG31222313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31222313fooEv,_ZThn20_N3aaa9GG31222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31222313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31222313fooEv,_ZThn8_N3aaa9GG31222313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222313fooEv,_ZThn20_N3aaa9GG31222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122231E[];
Class_Descriptor cd__ZN3aaa9GG3122231E = {  "_ZN3aaa9GG3122231E", // class name
  bases__ZN3aaa9GG3122231E, 6,
  &(vtc__ZN3aaa9GG3122231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122232  : ::aaa::EE312 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31222323barEv
  ~GG3122232(); // tgen
  GG3122232(); // tgen
};
//SIG(1 _ZN3aaa9GG3122232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31222323barEv");}
aaa::GG3122232 ::~GG3122232(){ note_dtor("_ZN3aaa9GG3122232E", this);} // tgen
aaa::GG3122232 ::GG3122232(){ note_ctor("_ZN3aaa9GG3122232E", this);} // tgen
}
static void Test__ZN3aaa9GG3122232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122232E, buf);
    ::aaa::GG3122232 *dp, &lv = *(dp=new (buf) ::aaa::GG3122232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122232E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3122232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3122232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3122232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122232E);
    dp->::aaa::GG3122232::~GG3122232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122232E(Test__ZN3aaa9GG3122232E, "_ZN3aaa9GG3122232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122232C1Ev();
extern void _ZN3aaa9GG3122232D1Ev();
Name_Map name_map__ZN3aaa9GG3122232E[] = {
  NSPAIR(_ZN3aaa9GG3122232C1Ev),
  NSPAIR(_ZN3aaa9GG3122232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3122232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31222323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31222323barEv,_ZThn20_N3aaa9GG31222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31222323barEv,_ZThn28_N3aaa9GG31222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222323barEv,_ZThn20_N3aaa9GG31222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31222323barEv,_ZThn28_N3aaa9GG31222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122232E[];
Class_Descriptor cd__ZN3aaa9GG3122232E = {  "_ZN3aaa9GG3122232E", // class name
  bases__ZN3aaa9GG3122232E, 6,
  &(vtc__ZN3aaa9GG3122232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122233  : ::aaa::EE312 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31222333fooEv
  virtual void  bar(); // _ZN3aaa9GG31222333barEv
  ~GG3122233(); // tgen
  GG3122233(); // tgen
};
//SIG(1 _ZN3aaa9GG3122233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31222333fooEv");}
void  aaa::GG3122233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31222333barEv");}
aaa::GG3122233 ::~GG3122233(){ note_dtor("_ZN3aaa9GG3122233E", this);} // tgen
aaa::GG3122233 ::GG3122233(){ note_ctor("_ZN3aaa9GG3122233E", this);} // tgen
}
static void Test__ZN3aaa9GG3122233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122233E, buf);
    ::aaa::GG3122233 *dp, &lv = *(dp=new (buf) ::aaa::GG3122233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122233E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3122233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3122233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3122233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122233E);
    dp->::aaa::GG3122233::~GG3122233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122233E(Test__ZN3aaa9GG3122233E, "_ZN3aaa9GG3122233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122233C1Ev();
extern void _ZN3aaa9GG3122233D1Ev();
Name_Map name_map__ZN3aaa9GG3122233E[] = {
  NSPAIR(_ZN3aaa9GG3122233C1Ev),
  NSPAIR(_ZN3aaa9GG3122233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3122233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122233E[];
extern void _ZN3aaa9GG31222333fooEv();
extern void _ZN3aaa9GG31222333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31222333fooEv,_ZThn8_N3aaa9GG31222333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31222333barEv,_ZThn20_N3aaa9GG31222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31222333fooEv,_ZThn20_N3aaa9GG31222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31222333barEv,_ZThn28_N3aaa9GG31222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31222333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31222333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31222333fooEv,_ZThn8_N3aaa9GG31222333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222333barEv,_ZThn20_N3aaa9GG31222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31222333fooEv,_ZThn20_N3aaa9GG31222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31222333barEv,_ZThn28_N3aaa9GG31222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122233E[];
Class_Descriptor cd__ZN3aaa9GG3122233E = {  "_ZN3aaa9GG3122233E", // class name
  bases__ZN3aaa9GG3122233E, 6,
  &(vtc__ZN3aaa9GG3122233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122311  : ::aaa::EE312 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31223113fooEv
  ~GG3122311(); // tgen
  GG3122311(); // tgen
};
//SIG(1 _ZN3aaa9GG3122311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31223113fooEv");}
aaa::GG3122311 ::~GG3122311(){ note_dtor("_ZN3aaa9GG3122311E", this);} // tgen
aaa::GG3122311 ::GG3122311(){ note_ctor("_ZN3aaa9GG3122311E", this);} // tgen
}
static void Test__ZN3aaa9GG3122311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122311E, buf);
    ::aaa::GG3122311 *dp, &lv = *(dp=new (buf) ::aaa::GG3122311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122311E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3122311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3122311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3122311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122311E);
    dp->::aaa::GG3122311::~GG3122311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122311E(Test__ZN3aaa9GG3122311E, "_ZN3aaa9GG3122311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122311C1Ev();
extern void _ZN3aaa9GG3122311D1Ev();
Name_Map name_map__ZN3aaa9GG3122311E[] = {
  NSPAIR(_ZN3aaa9GG3122311C1Ev),
  NSPAIR(_ZN3aaa9GG3122311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3122311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122311E[];
extern void _ZN3aaa9GG31223113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31223113fooEv,_ZThn8_N3aaa9GG31223113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31223113fooEv,_ZThn20_N3aaa9GG31223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223113fooEv,_ZThn28_N3aaa9GG31223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31223113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31223113fooEv,_ZThn8_N3aaa9GG31223113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223113fooEv,_ZThn20_N3aaa9GG31223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223113fooEv,_ZThn28_N3aaa9GG31223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122311E[];
Class_Descriptor cd__ZN3aaa9GG3122311E = {  "_ZN3aaa9GG3122311E", // class name
  bases__ZN3aaa9GG3122311E, 6,
  &(vtc__ZN3aaa9GG3122311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122312  : ::aaa::EE312 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31223123barEv
  ~GG3122312(); // tgen
  GG3122312(); // tgen
};
//SIG(1 _ZN3aaa9GG3122312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31223123barEv");}
aaa::GG3122312 ::~GG3122312(){ note_dtor("_ZN3aaa9GG3122312E", this);} // tgen
aaa::GG3122312 ::GG3122312(){ note_ctor("_ZN3aaa9GG3122312E", this);} // tgen
}
static void Test__ZN3aaa9GG3122312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122312E, buf);
    ::aaa::GG3122312 *dp, &lv = *(dp=new (buf) ::aaa::GG3122312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122312E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3122312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3122312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3122312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122312E);
    dp->::aaa::GG3122312::~GG3122312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122312E(Test__ZN3aaa9GG3122312E, "_ZN3aaa9GG3122312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122312C1Ev();
extern void _ZN3aaa9GG3122312D1Ev();
Name_Map name_map__ZN3aaa9GG3122312E[] = {
  NSPAIR(_ZN3aaa9GG3122312C1Ev),
  NSPAIR(_ZN3aaa9GG3122312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3122312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31223123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31223123barEv,_ZThn20_N3aaa9GG31223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223123barEv,_ZThn28_N3aaa9GG31223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223123barEv,_ZThn20_N3aaa9GG31223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223123barEv,_ZThn28_N3aaa9GG31223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122312E[];
Class_Descriptor cd__ZN3aaa9GG3122312E = {  "_ZN3aaa9GG3122312E", // class name
  bases__ZN3aaa9GG3122312E, 6,
  &(vtc__ZN3aaa9GG3122312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122313  : ::aaa::EE312 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31223133fooEv
  virtual void  bar(); // _ZN3aaa9GG31223133barEv
  ~GG3122313(); // tgen
  GG3122313(); // tgen
};
//SIG(1 _ZN3aaa9GG3122313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31223133fooEv");}
void  aaa::GG3122313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31223133barEv");}
aaa::GG3122313 ::~GG3122313(){ note_dtor("_ZN3aaa9GG3122313E", this);} // tgen
aaa::GG3122313 ::GG3122313(){ note_ctor("_ZN3aaa9GG3122313E", this);} // tgen
}
static void Test__ZN3aaa9GG3122313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122313E, buf);
    ::aaa::GG3122313 *dp, &lv = *(dp=new (buf) ::aaa::GG3122313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122313E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3122313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3122313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3122313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122313E);
    dp->::aaa::GG3122313::~GG3122313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122313E(Test__ZN3aaa9GG3122313E, "_ZN3aaa9GG3122313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122313C1Ev();
extern void _ZN3aaa9GG3122313D1Ev();
Name_Map name_map__ZN3aaa9GG3122313E[] = {
  NSPAIR(_ZN3aaa9GG3122313C1Ev),
  NSPAIR(_ZN3aaa9GG3122313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3122313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122313E[];
extern void _ZN3aaa9GG31223133fooEv();
extern void _ZN3aaa9GG31223133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31223133fooEv,_ZThn8_N3aaa9GG31223133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31223133barEv,_ZThn20_N3aaa9GG31223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31223133fooEv,_ZThn20_N3aaa9GG31223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223133fooEv,_ZThn28_N3aaa9GG31223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223133barEv,_ZThn28_N3aaa9GG31223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31223133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31223133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31223133fooEv,_ZThn8_N3aaa9GG31223133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223133barEv,_ZThn20_N3aaa9GG31223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223133fooEv,_ZThn20_N3aaa9GG31223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223133fooEv,_ZThn28_N3aaa9GG31223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223133barEv,_ZThn28_N3aaa9GG31223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122313E[];
Class_Descriptor cd__ZN3aaa9GG3122313E = {  "_ZN3aaa9GG3122313E", // class name
  bases__ZN3aaa9GG3122313E, 6,
  &(vtc__ZN3aaa9GG3122313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122321  : ::aaa::EE312 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31223213fooEv
  ~GG3122321(); // tgen
  GG3122321(); // tgen
};
//SIG(1 _ZN3aaa9GG3122321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31223213fooEv");}
aaa::GG3122321 ::~GG3122321(){ note_dtor("_ZN3aaa9GG3122321E", this);} // tgen
aaa::GG3122321 ::GG3122321(){ note_ctor("_ZN3aaa9GG3122321E", this);} // tgen
}
static void Test__ZN3aaa9GG3122321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122321E, buf);
    ::aaa::GG3122321 *dp, &lv = *(dp=new (buf) ::aaa::GG3122321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122321E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3122321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3122321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3122321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122321E);
    dp->::aaa::GG3122321::~GG3122321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122321E(Test__ZN3aaa9GG3122321E, "_ZN3aaa9GG3122321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122321C1Ev();
extern void _ZN3aaa9GG3122321D1Ev();
Name_Map name_map__ZN3aaa9GG3122321E[] = {
  NSPAIR(_ZN3aaa9GG3122321C1Ev),
  NSPAIR(_ZN3aaa9GG3122321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3122321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122321E[];
extern void _ZN3aaa9GG31223213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31223213fooEv,_ZThn8_N3aaa9GG31223213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31223213fooEv,_ZThn28_N3aaa9GG31223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31223213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31223213fooEv,_ZThn8_N3aaa9GG31223213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223213fooEv,_ZThn28_N3aaa9GG31223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122321E[];
Class_Descriptor cd__ZN3aaa9GG3122321E = {  "_ZN3aaa9GG3122321E", // class name
  bases__ZN3aaa9GG3122321E, 6,
  &(vtc__ZN3aaa9GG3122321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122322  : ::aaa::EE312 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31223223barEv
  ~GG3122322(); // tgen
  GG3122322(); // tgen
};
//SIG(1 _ZN3aaa9GG3122322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31223223barEv");}
aaa::GG3122322 ::~GG3122322(){ note_dtor("_ZN3aaa9GG3122322E", this);} // tgen
aaa::GG3122322 ::GG3122322(){ note_ctor("_ZN3aaa9GG3122322E", this);} // tgen
}
static void Test__ZN3aaa9GG3122322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122322E, buf);
    ::aaa::GG3122322 *dp, &lv = *(dp=new (buf) ::aaa::GG3122322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122322E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3122322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3122322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3122322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122322E);
    dp->::aaa::GG3122322::~GG3122322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122322E(Test__ZN3aaa9GG3122322E, "_ZN3aaa9GG3122322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122322C1Ev();
extern void _ZN3aaa9GG3122322D1Ev();
Name_Map name_map__ZN3aaa9GG3122322E[] = {
  NSPAIR(_ZN3aaa9GG3122322C1Ev),
  NSPAIR(_ZN3aaa9GG3122322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3122322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31223223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31223223barEv,_ZThn20_N3aaa9GG31223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31223223barEv,_ZThn28_N3aaa9GG31223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223223barEv,_ZThn20_N3aaa9GG31223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223223barEv,_ZThn28_N3aaa9GG31223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122322E[];
Class_Descriptor cd__ZN3aaa9GG3122322E = {  "_ZN3aaa9GG3122322E", // class name
  bases__ZN3aaa9GG3122322E, 6,
  &(vtc__ZN3aaa9GG3122322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122323  : ::aaa::EE312 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31223233fooEv
  virtual void  bar(); // _ZN3aaa9GG31223233barEv
  ~GG3122323(); // tgen
  GG3122323(); // tgen
};
//SIG(1 _ZN3aaa9GG3122323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31223233fooEv");}
void  aaa::GG3122323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31223233barEv");}
aaa::GG3122323 ::~GG3122323(){ note_dtor("_ZN3aaa9GG3122323E", this);} // tgen
aaa::GG3122323 ::GG3122323(){ note_ctor("_ZN3aaa9GG3122323E", this);} // tgen
}
static void Test__ZN3aaa9GG3122323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122323E, buf);
    ::aaa::GG3122323 *dp, &lv = *(dp=new (buf) ::aaa::GG3122323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122323E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3122323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3122323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3122323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122323E);
    dp->::aaa::GG3122323::~GG3122323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122323E(Test__ZN3aaa9GG3122323E, "_ZN3aaa9GG3122323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122323C1Ev();
extern void _ZN3aaa9GG3122323D1Ev();
Name_Map name_map__ZN3aaa9GG3122323E[] = {
  NSPAIR(_ZN3aaa9GG3122323C1Ev),
  NSPAIR(_ZN3aaa9GG3122323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3122323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122323E[];
extern void _ZN3aaa9GG31223233fooEv();
extern void _ZN3aaa9GG31223233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31223233fooEv,_ZThn8_N3aaa9GG31223233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31223233barEv,_ZThn20_N3aaa9GG31223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223233fooEv,_ZThn28_N3aaa9GG31223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223233barEv,_ZThn28_N3aaa9GG31223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31223233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31223233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31223233fooEv,_ZThn8_N3aaa9GG31223233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223233barEv,_ZThn20_N3aaa9GG31223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223233fooEv,_ZThn28_N3aaa9GG31223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223233barEv,_ZThn28_N3aaa9GG31223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122323E[];
Class_Descriptor cd__ZN3aaa9GG3122323E = {  "_ZN3aaa9GG3122323E", // class name
  bases__ZN3aaa9GG3122323E, 6,
  &(vtc__ZN3aaa9GG3122323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122331  : ::aaa::EE312 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31223313fooEv
  ~GG3122331(); // tgen
  GG3122331(); // tgen
};
//SIG(1 _ZN3aaa9GG3122331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31223313fooEv");}
aaa::GG3122331 ::~GG3122331(){ note_dtor("_ZN3aaa9GG3122331E", this);} // tgen
aaa::GG3122331 ::GG3122331(){ note_ctor("_ZN3aaa9GG3122331E", this);} // tgen
}
static void Test__ZN3aaa9GG3122331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122331E, buf);
    ::aaa::GG3122331 *dp, &lv = *(dp=new (buf) ::aaa::GG3122331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122331E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3122331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3122331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3122331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122331E);
    dp->::aaa::GG3122331::~GG3122331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122331E(Test__ZN3aaa9GG3122331E, "_ZN3aaa9GG3122331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122331C1Ev();
extern void _ZN3aaa9GG3122331D1Ev();
Name_Map name_map__ZN3aaa9GG3122331E[] = {
  NSPAIR(_ZN3aaa9GG3122331C1Ev),
  NSPAIR(_ZN3aaa9GG3122331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3122331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122331E[];
extern void _ZN3aaa9GG31223313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31223313fooEv,_ZThn8_N3aaa9GG31223313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31223313fooEv,_ZThn20_N3aaa9GG31223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223313fooEv,_ZThn28_N3aaa9GG31223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31223313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31223313fooEv,_ZThn8_N3aaa9GG31223313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223313fooEv,_ZThn20_N3aaa9GG31223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223313fooEv,_ZThn28_N3aaa9GG31223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122331E[];
Class_Descriptor cd__ZN3aaa9GG3122331E = {  "_ZN3aaa9GG3122331E", // class name
  bases__ZN3aaa9GG3122331E, 6,
  &(vtc__ZN3aaa9GG3122331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122332  : ::aaa::EE312 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31223323barEv
  ~GG3122332(); // tgen
  GG3122332(); // tgen
};
//SIG(1 _ZN3aaa9GG3122332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3122332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31223323barEv");}
aaa::GG3122332 ::~GG3122332(){ note_dtor("_ZN3aaa9GG3122332E", this);} // tgen
aaa::GG3122332 ::GG3122332(){ note_ctor("_ZN3aaa9GG3122332E", this);} // tgen
}
static void Test__ZN3aaa9GG3122332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122332E, buf);
    ::aaa::GG3122332 *dp, &lv = *(dp=new (buf) ::aaa::GG3122332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122332E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3122332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3122332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3122332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122332E);
    dp->::aaa::GG3122332::~GG3122332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122332E(Test__ZN3aaa9GG3122332E, "_ZN3aaa9GG3122332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122332C1Ev();
extern void _ZN3aaa9GG3122332D1Ev();
Name_Map name_map__ZN3aaa9GG3122332E[] = {
  NSPAIR(_ZN3aaa9GG3122332C1Ev),
  NSPAIR(_ZN3aaa9GG3122332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3122332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31223323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31223323barEv,_ZThn20_N3aaa9GG31223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223323barEv,_ZThn28_N3aaa9GG31223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223323barEv,_ZThn20_N3aaa9GG31223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223323barEv,_ZThn28_N3aaa9GG31223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122332E[];
Class_Descriptor cd__ZN3aaa9GG3122332E = {  "_ZN3aaa9GG3122332E", // class name
  bases__ZN3aaa9GG3122332E, 6,
  &(vtc__ZN3aaa9GG3122332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3122333  : ::aaa::EE312 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31223333fooEv
  virtual void  bar(); // _ZN3aaa9GG31223333barEv
  ~GG3122333(); // tgen
  GG3122333(); // tgen
};
//SIG(1 _ZN3aaa9GG3122333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3122333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31223333fooEv");}
void  aaa::GG3122333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31223333barEv");}
aaa::GG3122333 ::~GG3122333(){ note_dtor("_ZN3aaa9GG3122333E", this);} // tgen
aaa::GG3122333 ::GG3122333(){ note_ctor("_ZN3aaa9GG3122333E", this);} // tgen
}
static void Test__ZN3aaa9GG3122333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3122333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3122333E, buf);
    ::aaa::GG3122333 *dp, &lv = *(dp=new (buf) ::aaa::GG3122333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3122333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3122333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3122333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3122333E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3122333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3122333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3122333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3122333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3122333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3122333E);
    dp->::aaa::GG3122333::~GG3122333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3122333E(Test__ZN3aaa9GG3122333E, "_ZN3aaa9GG3122333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3122333C1Ev();
extern void _ZN3aaa9GG3122333D1Ev();
Name_Map name_map__ZN3aaa9GG3122333E[] = {
  NSPAIR(_ZN3aaa9GG3122333C1Ev),
  NSPAIR(_ZN3aaa9GG3122333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3122333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3122333E[];
extern void _ZN3aaa9GG31223333fooEv();
extern void _ZN3aaa9GG31223333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31223333fooEv,_ZThn8_N3aaa9GG31223333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31223333barEv,_ZThn20_N3aaa9GG31223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31223333fooEv,_ZThn20_N3aaa9GG31223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223333fooEv,_ZThn28_N3aaa9GG31223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31223333barEv,_ZThn28_N3aaa9GG31223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3122333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31223333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31223333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31223333fooEv,_ZThn8_N3aaa9GG31223333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223333barEv,_ZThn20_N3aaa9GG31223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31223333fooEv,_ZThn20_N3aaa9GG31223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3122333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223333fooEv,_ZThn28_N3aaa9GG31223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31223333barEv,_ZThn28_N3aaa9GG31223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3122333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3122333E[];
Class_Descriptor cd__ZN3aaa9GG3122333E = {  "_ZN3aaa9GG3122333E", // class name
  bases__ZN3aaa9GG3122333E, 6,
  &(vtc__ZN3aaa9GG3122333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3122333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3122333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123111  : ::aaa::EE312 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31231113fooEv
  ~GG3123111(); // tgen
  GG3123111(); // tgen
};
//SIG(1 _ZN3aaa9GG3123111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31231113fooEv");}
aaa::GG3123111 ::~GG3123111(){ note_dtor("_ZN3aaa9GG3123111E", this);} // tgen
aaa::GG3123111 ::GG3123111(){ note_ctor("_ZN3aaa9GG3123111E", this);} // tgen
}
static void Test__ZN3aaa9GG3123111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123111E, buf);
    ::aaa::GG3123111 *dp, &lv = *(dp=new (buf) ::aaa::GG3123111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123111E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3123111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3123111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3123111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123111E);
    dp->::aaa::GG3123111::~GG3123111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123111E(Test__ZN3aaa9GG3123111E, "_ZN3aaa9GG3123111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123111C1Ev();
extern void _ZN3aaa9GG3123111D1Ev();
Name_Map name_map__ZN3aaa9GG3123111E[] = {
  NSPAIR(_ZN3aaa9GG3123111C1Ev),
  NSPAIR(_ZN3aaa9GG3123111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3123111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123111E[];
extern void _ZN3aaa9GG31231113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31231113fooEv,_ZThn8_N3aaa9GG31231113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231113fooEv,_ZThn20_N3aaa9GG31231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31231113fooEv,_ZThn28_N3aaa9GG31231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31231113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31231113fooEv,_ZThn8_N3aaa9GG31231113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231113fooEv,_ZThn20_N3aaa9GG31231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31231113fooEv,_ZThn28_N3aaa9GG31231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123111E[];
Class_Descriptor cd__ZN3aaa9GG3123111E = {  "_ZN3aaa9GG3123111E", // class name
  bases__ZN3aaa9GG3123111E, 6,
  &(vtc__ZN3aaa9GG3123111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123112  : ::aaa::EE312 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31231123barEv
  ~GG3123112(); // tgen
  GG3123112(); // tgen
};
//SIG(1 _ZN3aaa9GG3123112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31231123barEv");}
aaa::GG3123112 ::~GG3123112(){ note_dtor("_ZN3aaa9GG3123112E", this);} // tgen
aaa::GG3123112 ::GG3123112(){ note_ctor("_ZN3aaa9GG3123112E", this);} // tgen
}
static void Test__ZN3aaa9GG3123112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123112E, buf);
    ::aaa::GG3123112 *dp, &lv = *(dp=new (buf) ::aaa::GG3123112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123112E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3123112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3123112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3123112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123112E);
    dp->::aaa::GG3123112::~GG3123112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123112E(Test__ZN3aaa9GG3123112E, "_ZN3aaa9GG3123112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123112C1Ev();
extern void _ZN3aaa9GG3123112D1Ev();
Name_Map name_map__ZN3aaa9GG3123112E[] = {
  NSPAIR(_ZN3aaa9GG3123112C1Ev),
  NSPAIR(_ZN3aaa9GG3123112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3123112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31231123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31231123barEv,_ZThn20_N3aaa9GG31231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231123barEv,_ZThn20_N3aaa9GG31231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123112E[];
Class_Descriptor cd__ZN3aaa9GG3123112E = {  "_ZN3aaa9GG3123112E", // class name
  bases__ZN3aaa9GG3123112E, 6,
  &(vtc__ZN3aaa9GG3123112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123113  : ::aaa::EE312 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31231133fooEv
  virtual void  bar(); // _ZN3aaa9GG31231133barEv
  ~GG3123113(); // tgen
  GG3123113(); // tgen
};
//SIG(1 _ZN3aaa9GG3123113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31231133fooEv");}
void  aaa::GG3123113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31231133barEv");}
aaa::GG3123113 ::~GG3123113(){ note_dtor("_ZN3aaa9GG3123113E", this);} // tgen
aaa::GG3123113 ::GG3123113(){ note_ctor("_ZN3aaa9GG3123113E", this);} // tgen
}
static void Test__ZN3aaa9GG3123113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123113E, buf);
    ::aaa::GG3123113 *dp, &lv = *(dp=new (buf) ::aaa::GG3123113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123113E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3123113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3123113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3123113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123113E);
    dp->::aaa::GG3123113::~GG3123113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123113E(Test__ZN3aaa9GG3123113E, "_ZN3aaa9GG3123113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123113C1Ev();
extern void _ZN3aaa9GG3123113D1Ev();
Name_Map name_map__ZN3aaa9GG3123113E[] = {
  NSPAIR(_ZN3aaa9GG3123113C1Ev),
  NSPAIR(_ZN3aaa9GG3123113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3123113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123113E[];
extern void _ZN3aaa9GG31231133fooEv();
extern void _ZN3aaa9GG31231133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31231133fooEv,_ZThn8_N3aaa9GG31231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231133fooEv,_ZThn20_N3aaa9GG31231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231133barEv,_ZThn20_N3aaa9GG31231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31231133fooEv,_ZThn28_N3aaa9GG31231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31231133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31231133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31231133fooEv,_ZThn8_N3aaa9GG31231133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231133fooEv,_ZThn20_N3aaa9GG31231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231133barEv,_ZThn20_N3aaa9GG31231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31231133fooEv,_ZThn28_N3aaa9GG31231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123113E[];
Class_Descriptor cd__ZN3aaa9GG3123113E = {  "_ZN3aaa9GG3123113E", // class name
  bases__ZN3aaa9GG3123113E, 6,
  &(vtc__ZN3aaa9GG3123113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123121  : ::aaa::EE312 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31231213fooEv
  ~GG3123121(); // tgen
  GG3123121(); // tgen
};
//SIG(1 _ZN3aaa9GG3123121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31231213fooEv");}
aaa::GG3123121 ::~GG3123121(){ note_dtor("_ZN3aaa9GG3123121E", this);} // tgen
aaa::GG3123121 ::GG3123121(){ note_ctor("_ZN3aaa9GG3123121E", this);} // tgen
}
static void Test__ZN3aaa9GG3123121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123121E, buf);
    ::aaa::GG3123121 *dp, &lv = *(dp=new (buf) ::aaa::GG3123121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123121E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3123121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3123121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3123121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123121E);
    dp->::aaa::GG3123121::~GG3123121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123121E(Test__ZN3aaa9GG3123121E, "_ZN3aaa9GG3123121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123121C1Ev();
extern void _ZN3aaa9GG3123121D1Ev();
Name_Map name_map__ZN3aaa9GG3123121E[] = {
  NSPAIR(_ZN3aaa9GG3123121C1Ev),
  NSPAIR(_ZN3aaa9GG3123121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3123121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123121E[];
extern void _ZN3aaa9GG31231213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31231213fooEv,_ZThn8_N3aaa9GG31231213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231213fooEv,_ZThn20_N3aaa9GG31231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31231213fooEv,_ZThn28_N3aaa9GG31231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31231213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31231213fooEv,_ZThn8_N3aaa9GG31231213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231213fooEv,_ZThn20_N3aaa9GG31231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31231213fooEv,_ZThn28_N3aaa9GG31231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123121E[];
Class_Descriptor cd__ZN3aaa9GG3123121E = {  "_ZN3aaa9GG3123121E", // class name
  bases__ZN3aaa9GG3123121E, 6,
  &(vtc__ZN3aaa9GG3123121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123122  : ::aaa::EE312 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31231223barEv
  ~GG3123122(); // tgen
  GG3123122(); // tgen
};
//SIG(1 _ZN3aaa9GG3123122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31231223barEv");}
aaa::GG3123122 ::~GG3123122(){ note_dtor("_ZN3aaa9GG3123122E", this);} // tgen
aaa::GG3123122 ::GG3123122(){ note_ctor("_ZN3aaa9GG3123122E", this);} // tgen
}
static void Test__ZN3aaa9GG3123122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123122E, buf);
    ::aaa::GG3123122 *dp, &lv = *(dp=new (buf) ::aaa::GG3123122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123122E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3123122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3123122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3123122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123122E);
    dp->::aaa::GG3123122::~GG3123122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123122E(Test__ZN3aaa9GG3123122E, "_ZN3aaa9GG3123122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123122C1Ev();
extern void _ZN3aaa9GG3123122D1Ev();
Name_Map name_map__ZN3aaa9GG3123122E[] = {
  NSPAIR(_ZN3aaa9GG3123122C1Ev),
  NSPAIR(_ZN3aaa9GG3123122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3123122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31231223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31231223barEv,_ZThn20_N3aaa9GG31231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231223barEv,_ZThn20_N3aaa9GG31231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123122E[];
Class_Descriptor cd__ZN3aaa9GG3123122E = {  "_ZN3aaa9GG3123122E", // class name
  bases__ZN3aaa9GG3123122E, 6,
  &(vtc__ZN3aaa9GG3123122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123123  : ::aaa::EE312 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31231233fooEv
  virtual void  bar(); // _ZN3aaa9GG31231233barEv
  ~GG3123123(); // tgen
  GG3123123(); // tgen
};
//SIG(1 _ZN3aaa9GG3123123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31231233fooEv");}
void  aaa::GG3123123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31231233barEv");}
aaa::GG3123123 ::~GG3123123(){ note_dtor("_ZN3aaa9GG3123123E", this);} // tgen
aaa::GG3123123 ::GG3123123(){ note_ctor("_ZN3aaa9GG3123123E", this);} // tgen
}
static void Test__ZN3aaa9GG3123123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123123E, buf);
    ::aaa::GG3123123 *dp, &lv = *(dp=new (buf) ::aaa::GG3123123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123123E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3123123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3123123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3123123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123123E);
    dp->::aaa::GG3123123::~GG3123123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123123E(Test__ZN3aaa9GG3123123E, "_ZN3aaa9GG3123123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123123C1Ev();
extern void _ZN3aaa9GG3123123D1Ev();
Name_Map name_map__ZN3aaa9GG3123123E[] = {
  NSPAIR(_ZN3aaa9GG3123123C1Ev),
  NSPAIR(_ZN3aaa9GG3123123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3123123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123123E[];
extern void _ZN3aaa9GG31231233fooEv();
extern void _ZN3aaa9GG31231233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31231233fooEv,_ZThn8_N3aaa9GG31231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231233fooEv,_ZThn20_N3aaa9GG31231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231233barEv,_ZThn20_N3aaa9GG31231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31231233fooEv,_ZThn28_N3aaa9GG31231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31231233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31231233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31231233fooEv,_ZThn8_N3aaa9GG31231233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231233fooEv,_ZThn20_N3aaa9GG31231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231233barEv,_ZThn20_N3aaa9GG31231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31231233fooEv,_ZThn28_N3aaa9GG31231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123123E[];
Class_Descriptor cd__ZN3aaa9GG3123123E = {  "_ZN3aaa9GG3123123E", // class name
  bases__ZN3aaa9GG3123123E, 6,
  &(vtc__ZN3aaa9GG3123123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123131  : ::aaa::EE312 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31231313fooEv
  ~GG3123131(); // tgen
  GG3123131(); // tgen
};
//SIG(1 _ZN3aaa9GG3123131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31231313fooEv");}
aaa::GG3123131 ::~GG3123131(){ note_dtor("_ZN3aaa9GG3123131E", this);} // tgen
aaa::GG3123131 ::GG3123131(){ note_ctor("_ZN3aaa9GG3123131E", this);} // tgen
}
static void Test__ZN3aaa9GG3123131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123131E, buf);
    ::aaa::GG3123131 *dp, &lv = *(dp=new (buf) ::aaa::GG3123131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123131E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3123131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3123131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3123131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123131E);
    dp->::aaa::GG3123131::~GG3123131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123131E(Test__ZN3aaa9GG3123131E, "_ZN3aaa9GG3123131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123131C1Ev();
extern void _ZN3aaa9GG3123131D1Ev();
Name_Map name_map__ZN3aaa9GG3123131E[] = {
  NSPAIR(_ZN3aaa9GG3123131C1Ev),
  NSPAIR(_ZN3aaa9GG3123131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3123131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123131E[];
extern void _ZN3aaa9GG31231313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31231313fooEv,_ZThn8_N3aaa9GG31231313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231313fooEv,_ZThn20_N3aaa9GG31231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31231313fooEv,_ZThn28_N3aaa9GG31231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31231313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31231313fooEv,_ZThn8_N3aaa9GG31231313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231313fooEv,_ZThn20_N3aaa9GG31231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31231313fooEv,_ZThn28_N3aaa9GG31231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123131E[];
Class_Descriptor cd__ZN3aaa9GG3123131E = {  "_ZN3aaa9GG3123131E", // class name
  bases__ZN3aaa9GG3123131E, 6,
  &(vtc__ZN3aaa9GG3123131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123132  : ::aaa::EE312 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31231323barEv
  ~GG3123132(); // tgen
  GG3123132(); // tgen
};
//SIG(1 _ZN3aaa9GG3123132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31231323barEv");}
aaa::GG3123132 ::~GG3123132(){ note_dtor("_ZN3aaa9GG3123132E", this);} // tgen
aaa::GG3123132 ::GG3123132(){ note_ctor("_ZN3aaa9GG3123132E", this);} // tgen
}
static void Test__ZN3aaa9GG3123132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123132E, buf);
    ::aaa::GG3123132 *dp, &lv = *(dp=new (buf) ::aaa::GG3123132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123132E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3123132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3123132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3123132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123132E);
    dp->::aaa::GG3123132::~GG3123132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123132E(Test__ZN3aaa9GG3123132E, "_ZN3aaa9GG3123132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123132C1Ev();
extern void _ZN3aaa9GG3123132D1Ev();
Name_Map name_map__ZN3aaa9GG3123132E[] = {
  NSPAIR(_ZN3aaa9GG3123132C1Ev),
  NSPAIR(_ZN3aaa9GG3123132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3123132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31231323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31231323barEv,_ZThn20_N3aaa9GG31231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231323barEv,_ZThn20_N3aaa9GG31231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123132E[];
Class_Descriptor cd__ZN3aaa9GG3123132E = {  "_ZN3aaa9GG3123132E", // class name
  bases__ZN3aaa9GG3123132E, 6,
  &(vtc__ZN3aaa9GG3123132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123133  : ::aaa::EE312 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31231333fooEv
  virtual void  bar(); // _ZN3aaa9GG31231333barEv
  ~GG3123133(); // tgen
  GG3123133(); // tgen
};
//SIG(1 _ZN3aaa9GG3123133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31231333fooEv");}
void  aaa::GG3123133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31231333barEv");}
aaa::GG3123133 ::~GG3123133(){ note_dtor("_ZN3aaa9GG3123133E", this);} // tgen
aaa::GG3123133 ::GG3123133(){ note_ctor("_ZN3aaa9GG3123133E", this);} // tgen
}
static void Test__ZN3aaa9GG3123133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123133E, buf);
    ::aaa::GG3123133 *dp, &lv = *(dp=new (buf) ::aaa::GG3123133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123133E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3123133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3123133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3123133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123133E);
    dp->::aaa::GG3123133::~GG3123133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123133E(Test__ZN3aaa9GG3123133E, "_ZN3aaa9GG3123133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123133C1Ev();
extern void _ZN3aaa9GG3123133D1Ev();
Name_Map name_map__ZN3aaa9GG3123133E[] = {
  NSPAIR(_ZN3aaa9GG3123133C1Ev),
  NSPAIR(_ZN3aaa9GG3123133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3123133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123133E[];
extern void _ZN3aaa9GG31231333fooEv();
extern void _ZN3aaa9GG31231333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31231333fooEv,_ZThn8_N3aaa9GG31231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231333fooEv,_ZThn20_N3aaa9GG31231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31231333barEv,_ZThn20_N3aaa9GG31231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31231333fooEv,_ZThn28_N3aaa9GG31231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31231333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31231333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31231333fooEv,_ZThn8_N3aaa9GG31231333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231333fooEv,_ZThn20_N3aaa9GG31231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31231333barEv,_ZThn20_N3aaa9GG31231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31231333fooEv,_ZThn28_N3aaa9GG31231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123133E[];
Class_Descriptor cd__ZN3aaa9GG3123133E = {  "_ZN3aaa9GG3123133E", // class name
  bases__ZN3aaa9GG3123133E, 6,
  &(vtc__ZN3aaa9GG3123133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123211  : ::aaa::EE312 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31232113fooEv
  ~GG3123211(); // tgen
  GG3123211(); // tgen
};
//SIG(1 _ZN3aaa9GG3123211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31232113fooEv");}
aaa::GG3123211 ::~GG3123211(){ note_dtor("_ZN3aaa9GG3123211E", this);} // tgen
aaa::GG3123211 ::GG3123211(){ note_ctor("_ZN3aaa9GG3123211E", this);} // tgen
}
static void Test__ZN3aaa9GG3123211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123211E, buf);
    ::aaa::GG3123211 *dp, &lv = *(dp=new (buf) ::aaa::GG3123211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123211E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3123211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3123211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3123211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123211E);
    dp->::aaa::GG3123211::~GG3123211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123211E(Test__ZN3aaa9GG3123211E, "_ZN3aaa9GG3123211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123211C1Ev();
extern void _ZN3aaa9GG3123211D1Ev();
Name_Map name_map__ZN3aaa9GG3123211E[] = {
  NSPAIR(_ZN3aaa9GG3123211C1Ev),
  NSPAIR(_ZN3aaa9GG3123211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3123211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123211E[];
extern void _ZN3aaa9GG31232113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31232113fooEv,_ZThn8_N3aaa9GG31232113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232113fooEv,_ZThn20_N3aaa9GG31232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31232113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31232113fooEv,_ZThn8_N3aaa9GG31232113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232113fooEv,_ZThn20_N3aaa9GG31232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123211E[];
Class_Descriptor cd__ZN3aaa9GG3123211E = {  "_ZN3aaa9GG3123211E", // class name
  bases__ZN3aaa9GG3123211E, 6,
  &(vtc__ZN3aaa9GG3123211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123212  : ::aaa::EE312 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31232123barEv
  ~GG3123212(); // tgen
  GG3123212(); // tgen
};
//SIG(1 _ZN3aaa9GG3123212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31232123barEv");}
aaa::GG3123212 ::~GG3123212(){ note_dtor("_ZN3aaa9GG3123212E", this);} // tgen
aaa::GG3123212 ::GG3123212(){ note_ctor("_ZN3aaa9GG3123212E", this);} // tgen
}
static void Test__ZN3aaa9GG3123212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123212E, buf);
    ::aaa::GG3123212 *dp, &lv = *(dp=new (buf) ::aaa::GG3123212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123212E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3123212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3123212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3123212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123212E);
    dp->::aaa::GG3123212::~GG3123212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123212E(Test__ZN3aaa9GG3123212E, "_ZN3aaa9GG3123212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123212C1Ev();
extern void _ZN3aaa9GG3123212D1Ev();
Name_Map name_map__ZN3aaa9GG3123212E[] = {
  NSPAIR(_ZN3aaa9GG3123212C1Ev),
  NSPAIR(_ZN3aaa9GG3123212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3123212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31232123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31232123barEv,_ZThn20_N3aaa9GG31232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31232123barEv,_ZThn28_N3aaa9GG31232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232123barEv,_ZThn20_N3aaa9GG31232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31232123barEv,_ZThn28_N3aaa9GG31232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123212E[];
Class_Descriptor cd__ZN3aaa9GG3123212E = {  "_ZN3aaa9GG3123212E", // class name
  bases__ZN3aaa9GG3123212E, 6,
  &(vtc__ZN3aaa9GG3123212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123213  : ::aaa::EE312 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31232133fooEv
  virtual void  bar(); // _ZN3aaa9GG31232133barEv
  ~GG3123213(); // tgen
  GG3123213(); // tgen
};
//SIG(1 _ZN3aaa9GG3123213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31232133fooEv");}
void  aaa::GG3123213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31232133barEv");}
aaa::GG3123213 ::~GG3123213(){ note_dtor("_ZN3aaa9GG3123213E", this);} // tgen
aaa::GG3123213 ::GG3123213(){ note_ctor("_ZN3aaa9GG3123213E", this);} // tgen
}
static void Test__ZN3aaa9GG3123213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123213E, buf);
    ::aaa::GG3123213 *dp, &lv = *(dp=new (buf) ::aaa::GG3123213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123213E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3123213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3123213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3123213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123213E);
    dp->::aaa::GG3123213::~GG3123213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123213E(Test__ZN3aaa9GG3123213E, "_ZN3aaa9GG3123213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123213C1Ev();
extern void _ZN3aaa9GG3123213D1Ev();
Name_Map name_map__ZN3aaa9GG3123213E[] = {
  NSPAIR(_ZN3aaa9GG3123213C1Ev),
  NSPAIR(_ZN3aaa9GG3123213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3123213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123213E[];
extern void _ZN3aaa9GG31232133fooEv();
extern void _ZN3aaa9GG31232133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31232133fooEv,_ZThn8_N3aaa9GG31232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232133fooEv,_ZThn20_N3aaa9GG31232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232133barEv,_ZThn20_N3aaa9GG31232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31232133barEv,_ZThn28_N3aaa9GG31232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31232133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31232133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31232133fooEv,_ZThn8_N3aaa9GG31232133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232133fooEv,_ZThn20_N3aaa9GG31232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232133barEv,_ZThn20_N3aaa9GG31232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31232133barEv,_ZThn28_N3aaa9GG31232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123213E[];
Class_Descriptor cd__ZN3aaa9GG3123213E = {  "_ZN3aaa9GG3123213E", // class name
  bases__ZN3aaa9GG3123213E, 6,
  &(vtc__ZN3aaa9GG3123213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123221  : ::aaa::EE312 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31232213fooEv
  ~GG3123221(); // tgen
  GG3123221(); // tgen
};
//SIG(1 _ZN3aaa9GG3123221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31232213fooEv");}
aaa::GG3123221 ::~GG3123221(){ note_dtor("_ZN3aaa9GG3123221E", this);} // tgen
aaa::GG3123221 ::GG3123221(){ note_ctor("_ZN3aaa9GG3123221E", this);} // tgen
}
static void Test__ZN3aaa9GG3123221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123221E, buf);
    ::aaa::GG3123221 *dp, &lv = *(dp=new (buf) ::aaa::GG3123221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123221E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3123221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3123221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3123221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123221E);
    dp->::aaa::GG3123221::~GG3123221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123221E(Test__ZN3aaa9GG3123221E, "_ZN3aaa9GG3123221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123221C1Ev();
extern void _ZN3aaa9GG3123221D1Ev();
Name_Map name_map__ZN3aaa9GG3123221E[] = {
  NSPAIR(_ZN3aaa9GG3123221C1Ev),
  NSPAIR(_ZN3aaa9GG3123221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3123221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123221E[];
extern void _ZN3aaa9GG31232213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31232213fooEv,_ZThn8_N3aaa9GG31232213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232213fooEv,_ZThn20_N3aaa9GG31232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31232213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31232213fooEv,_ZThn8_N3aaa9GG31232213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232213fooEv,_ZThn20_N3aaa9GG31232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123221E[];
Class_Descriptor cd__ZN3aaa9GG3123221E = {  "_ZN3aaa9GG3123221E", // class name
  bases__ZN3aaa9GG3123221E, 6,
  &(vtc__ZN3aaa9GG3123221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123222  : ::aaa::EE312 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31232223barEv
  ~GG3123222(); // tgen
  GG3123222(); // tgen
};
//SIG(1 _ZN3aaa9GG3123222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31232223barEv");}
aaa::GG3123222 ::~GG3123222(){ note_dtor("_ZN3aaa9GG3123222E", this);} // tgen
aaa::GG3123222 ::GG3123222(){ note_ctor("_ZN3aaa9GG3123222E", this);} // tgen
}
static void Test__ZN3aaa9GG3123222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123222E, buf);
    ::aaa::GG3123222 *dp, &lv = *(dp=new (buf) ::aaa::GG3123222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123222E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3123222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3123222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3123222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123222E);
    dp->::aaa::GG3123222::~GG3123222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123222E(Test__ZN3aaa9GG3123222E, "_ZN3aaa9GG3123222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123222C1Ev();
extern void _ZN3aaa9GG3123222D1Ev();
Name_Map name_map__ZN3aaa9GG3123222E[] = {
  NSPAIR(_ZN3aaa9GG3123222C1Ev),
  NSPAIR(_ZN3aaa9GG3123222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3123222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31232223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31232223barEv,_ZThn20_N3aaa9GG31232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31232223barEv,_ZThn28_N3aaa9GG31232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232223barEv,_ZThn20_N3aaa9GG31232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31232223barEv,_ZThn28_N3aaa9GG31232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123222E[];
Class_Descriptor cd__ZN3aaa9GG3123222E = {  "_ZN3aaa9GG3123222E", // class name
  bases__ZN3aaa9GG3123222E, 6,
  &(vtc__ZN3aaa9GG3123222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123223  : ::aaa::EE312 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31232233fooEv
  virtual void  bar(); // _ZN3aaa9GG31232233barEv
  ~GG3123223(); // tgen
  GG3123223(); // tgen
};
//SIG(1 _ZN3aaa9GG3123223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31232233fooEv");}
void  aaa::GG3123223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31232233barEv");}
aaa::GG3123223 ::~GG3123223(){ note_dtor("_ZN3aaa9GG3123223E", this);} // tgen
aaa::GG3123223 ::GG3123223(){ note_ctor("_ZN3aaa9GG3123223E", this);} // tgen
}
static void Test__ZN3aaa9GG3123223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123223E, buf);
    ::aaa::GG3123223 *dp, &lv = *(dp=new (buf) ::aaa::GG3123223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123223E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3123223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3123223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3123223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123223E);
    dp->::aaa::GG3123223::~GG3123223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123223E(Test__ZN3aaa9GG3123223E, "_ZN3aaa9GG3123223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123223C1Ev();
extern void _ZN3aaa9GG3123223D1Ev();
Name_Map name_map__ZN3aaa9GG3123223E[] = {
  NSPAIR(_ZN3aaa9GG3123223C1Ev),
  NSPAIR(_ZN3aaa9GG3123223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3123223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123223E[];
extern void _ZN3aaa9GG31232233fooEv();
extern void _ZN3aaa9GG31232233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31232233fooEv,_ZThn8_N3aaa9GG31232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232233fooEv,_ZThn20_N3aaa9GG31232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232233barEv,_ZThn20_N3aaa9GG31232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31232233barEv,_ZThn28_N3aaa9GG31232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31232233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31232233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31232233fooEv,_ZThn8_N3aaa9GG31232233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232233fooEv,_ZThn20_N3aaa9GG31232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232233barEv,_ZThn20_N3aaa9GG31232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31232233barEv,_ZThn28_N3aaa9GG31232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123223E[];
Class_Descriptor cd__ZN3aaa9GG3123223E = {  "_ZN3aaa9GG3123223E", // class name
  bases__ZN3aaa9GG3123223E, 6,
  &(vtc__ZN3aaa9GG3123223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123231  : ::aaa::EE312 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31232313fooEv
  ~GG3123231(); // tgen
  GG3123231(); // tgen
};
//SIG(1 _ZN3aaa9GG3123231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31232313fooEv");}
aaa::GG3123231 ::~GG3123231(){ note_dtor("_ZN3aaa9GG3123231E", this);} // tgen
aaa::GG3123231 ::GG3123231(){ note_ctor("_ZN3aaa9GG3123231E", this);} // tgen
}
static void Test__ZN3aaa9GG3123231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123231E, buf);
    ::aaa::GG3123231 *dp, &lv = *(dp=new (buf) ::aaa::GG3123231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123231E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3123231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3123231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3123231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123231E);
    dp->::aaa::GG3123231::~GG3123231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123231E(Test__ZN3aaa9GG3123231E, "_ZN3aaa9GG3123231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123231C1Ev();
extern void _ZN3aaa9GG3123231D1Ev();
Name_Map name_map__ZN3aaa9GG3123231E[] = {
  NSPAIR(_ZN3aaa9GG3123231C1Ev),
  NSPAIR(_ZN3aaa9GG3123231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3123231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123231E[];
extern void _ZN3aaa9GG31232313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31232313fooEv,_ZThn8_N3aaa9GG31232313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232313fooEv,_ZThn20_N3aaa9GG31232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31232313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31232313fooEv,_ZThn8_N3aaa9GG31232313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232313fooEv,_ZThn20_N3aaa9GG31232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123231E[];
Class_Descriptor cd__ZN3aaa9GG3123231E = {  "_ZN3aaa9GG3123231E", // class name
  bases__ZN3aaa9GG3123231E, 6,
  &(vtc__ZN3aaa9GG3123231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123232  : ::aaa::EE312 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31232323barEv
  ~GG3123232(); // tgen
  GG3123232(); // tgen
};
//SIG(1 _ZN3aaa9GG3123232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31232323barEv");}
aaa::GG3123232 ::~GG3123232(){ note_dtor("_ZN3aaa9GG3123232E", this);} // tgen
aaa::GG3123232 ::GG3123232(){ note_ctor("_ZN3aaa9GG3123232E", this);} // tgen
}
static void Test__ZN3aaa9GG3123232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123232E, buf);
    ::aaa::GG3123232 *dp, &lv = *(dp=new (buf) ::aaa::GG3123232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123232E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3123232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3123232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3123232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123232E);
    dp->::aaa::GG3123232::~GG3123232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123232E(Test__ZN3aaa9GG3123232E, "_ZN3aaa9GG3123232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123232C1Ev();
extern void _ZN3aaa9GG3123232D1Ev();
Name_Map name_map__ZN3aaa9GG3123232E[] = {
  NSPAIR(_ZN3aaa9GG3123232C1Ev),
  NSPAIR(_ZN3aaa9GG3123232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3123232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31232323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31232323barEv,_ZThn20_N3aaa9GG31232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31232323barEv,_ZThn28_N3aaa9GG31232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232323barEv,_ZThn20_N3aaa9GG31232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31232323barEv,_ZThn28_N3aaa9GG31232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123232E[];
Class_Descriptor cd__ZN3aaa9GG3123232E = {  "_ZN3aaa9GG3123232E", // class name
  bases__ZN3aaa9GG3123232E, 6,
  &(vtc__ZN3aaa9GG3123232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123233  : ::aaa::EE312 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31232333fooEv
  virtual void  bar(); // _ZN3aaa9GG31232333barEv
  ~GG3123233(); // tgen
  GG3123233(); // tgen
};
//SIG(1 _ZN3aaa9GG3123233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31232333fooEv");}
void  aaa::GG3123233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31232333barEv");}
aaa::GG3123233 ::~GG3123233(){ note_dtor("_ZN3aaa9GG3123233E", this);} // tgen
aaa::GG3123233 ::GG3123233(){ note_ctor("_ZN3aaa9GG3123233E", this);} // tgen
}
static void Test__ZN3aaa9GG3123233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123233E, buf);
    ::aaa::GG3123233 *dp, &lv = *(dp=new (buf) ::aaa::GG3123233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123233E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3123233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3123233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3123233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123233E);
    dp->::aaa::GG3123233::~GG3123233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123233E(Test__ZN3aaa9GG3123233E, "_ZN3aaa9GG3123233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123233C1Ev();
extern void _ZN3aaa9GG3123233D1Ev();
Name_Map name_map__ZN3aaa9GG3123233E[] = {
  NSPAIR(_ZN3aaa9GG3123233C1Ev),
  NSPAIR(_ZN3aaa9GG3123233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3123233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123233E[];
extern void _ZN3aaa9GG31232333fooEv();
extern void _ZN3aaa9GG31232333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31232333fooEv,_ZThn8_N3aaa9GG31232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232333fooEv,_ZThn20_N3aaa9GG31232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31232333barEv,_ZThn20_N3aaa9GG31232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31232333barEv,_ZThn28_N3aaa9GG31232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31232333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31232333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31232333fooEv,_ZThn8_N3aaa9GG31232333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232333fooEv,_ZThn20_N3aaa9GG31232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31232333barEv,_ZThn20_N3aaa9GG31232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31232333barEv,_ZThn28_N3aaa9GG31232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123233E[];
Class_Descriptor cd__ZN3aaa9GG3123233E = {  "_ZN3aaa9GG3123233E", // class name
  bases__ZN3aaa9GG3123233E, 6,
  &(vtc__ZN3aaa9GG3123233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123311  : ::aaa::EE312 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31233113fooEv
  ~GG3123311(); // tgen
  GG3123311(); // tgen
};
//SIG(1 _ZN3aaa9GG3123311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31233113fooEv");}
aaa::GG3123311 ::~GG3123311(){ note_dtor("_ZN3aaa9GG3123311E", this);} // tgen
aaa::GG3123311 ::GG3123311(){ note_ctor("_ZN3aaa9GG3123311E", this);} // tgen
}
static void Test__ZN3aaa9GG3123311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123311E, buf);
    ::aaa::GG3123311 *dp, &lv = *(dp=new (buf) ::aaa::GG3123311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123311E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3123311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3123311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3123311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123311E);
    dp->::aaa::GG3123311::~GG3123311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123311E(Test__ZN3aaa9GG3123311E, "_ZN3aaa9GG3123311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123311C1Ev();
extern void _ZN3aaa9GG3123311D1Ev();
Name_Map name_map__ZN3aaa9GG3123311E[] = {
  NSPAIR(_ZN3aaa9GG3123311C1Ev),
  NSPAIR(_ZN3aaa9GG3123311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3123311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123311E[];
extern void _ZN3aaa9GG31233113fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31233113fooEv,_ZThn8_N3aaa9GG31233113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233113fooEv,_ZThn20_N3aaa9GG31233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31233113fooEv,_ZThn28_N3aaa9GG31233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31233113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31233113fooEv,_ZThn8_N3aaa9GG31233113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233113fooEv,_ZThn20_N3aaa9GG31233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233113fooEv,_ZThn28_N3aaa9GG31233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123311E[];
Class_Descriptor cd__ZN3aaa9GG3123311E = {  "_ZN3aaa9GG3123311E", // class name
  bases__ZN3aaa9GG3123311E, 6,
  &(vtc__ZN3aaa9GG3123311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123312  : ::aaa::EE312 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31233123barEv
  ~GG3123312(); // tgen
  GG3123312(); // tgen
};
//SIG(1 _ZN3aaa9GG3123312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31233123barEv");}
aaa::GG3123312 ::~GG3123312(){ note_dtor("_ZN3aaa9GG3123312E", this);} // tgen
aaa::GG3123312 ::GG3123312(){ note_ctor("_ZN3aaa9GG3123312E", this);} // tgen
}
static void Test__ZN3aaa9GG3123312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123312E, buf);
    ::aaa::GG3123312 *dp, &lv = *(dp=new (buf) ::aaa::GG3123312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123312E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3123312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3123312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3123312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123312E);
    dp->::aaa::GG3123312::~GG3123312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123312E(Test__ZN3aaa9GG3123312E, "_ZN3aaa9GG3123312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123312C1Ev();
extern void _ZN3aaa9GG3123312D1Ev();
Name_Map name_map__ZN3aaa9GG3123312E[] = {
  NSPAIR(_ZN3aaa9GG3123312C1Ev),
  NSPAIR(_ZN3aaa9GG3123312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3123312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31233123barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31233123barEv,_ZThn20_N3aaa9GG31233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31233123barEv,_ZThn28_N3aaa9GG31233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233123barEv,_ZThn20_N3aaa9GG31233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233123barEv,_ZThn28_N3aaa9GG31233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123312E[];
Class_Descriptor cd__ZN3aaa9GG3123312E = {  "_ZN3aaa9GG3123312E", // class name
  bases__ZN3aaa9GG3123312E, 6,
  &(vtc__ZN3aaa9GG3123312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123313  : ::aaa::EE312 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31233133fooEv
  virtual void  bar(); // _ZN3aaa9GG31233133barEv
  ~GG3123313(); // tgen
  GG3123313(); // tgen
};
//SIG(1 _ZN3aaa9GG3123313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31233133fooEv");}
void  aaa::GG3123313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31233133barEv");}
aaa::GG3123313 ::~GG3123313(){ note_dtor("_ZN3aaa9GG3123313E", this);} // tgen
aaa::GG3123313 ::GG3123313(){ note_ctor("_ZN3aaa9GG3123313E", this);} // tgen
}
static void Test__ZN3aaa9GG3123313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123313E, buf);
    ::aaa::GG3123313 *dp, &lv = *(dp=new (buf) ::aaa::GG3123313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123313E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3123313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3123313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3123313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123313E);
    dp->::aaa::GG3123313::~GG3123313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123313E(Test__ZN3aaa9GG3123313E, "_ZN3aaa9GG3123313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123313C1Ev();
extern void _ZN3aaa9GG3123313D1Ev();
Name_Map name_map__ZN3aaa9GG3123313E[] = {
  NSPAIR(_ZN3aaa9GG3123313C1Ev),
  NSPAIR(_ZN3aaa9GG3123313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3123313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123313E[];
extern void _ZN3aaa9GG31233133fooEv();
extern void _ZN3aaa9GG31233133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31233133fooEv,_ZThn8_N3aaa9GG31233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233133fooEv,_ZThn20_N3aaa9GG31233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233133barEv,_ZThn20_N3aaa9GG31233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31233133fooEv,_ZThn28_N3aaa9GG31233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31233133barEv,_ZThn28_N3aaa9GG31233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31233133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31233133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31233133fooEv,_ZThn8_N3aaa9GG31233133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233133fooEv,_ZThn20_N3aaa9GG31233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233133barEv,_ZThn20_N3aaa9GG31233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233133fooEv,_ZThn28_N3aaa9GG31233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233133barEv,_ZThn28_N3aaa9GG31233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123313E[];
Class_Descriptor cd__ZN3aaa9GG3123313E = {  "_ZN3aaa9GG3123313E", // class name
  bases__ZN3aaa9GG3123313E, 6,
  &(vtc__ZN3aaa9GG3123313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123321  : ::aaa::EE312 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31233213fooEv
  ~GG3123321(); // tgen
  GG3123321(); // tgen
};
//SIG(1 _ZN3aaa9GG3123321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31233213fooEv");}
aaa::GG3123321 ::~GG3123321(){ note_dtor("_ZN3aaa9GG3123321E", this);} // tgen
aaa::GG3123321 ::GG3123321(){ note_ctor("_ZN3aaa9GG3123321E", this);} // tgen
}
static void Test__ZN3aaa9GG3123321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123321E, buf);
    ::aaa::GG3123321 *dp, &lv = *(dp=new (buf) ::aaa::GG3123321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123321E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3123321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3123321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3123321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123321E);
    dp->::aaa::GG3123321::~GG3123321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123321E(Test__ZN3aaa9GG3123321E, "_ZN3aaa9GG3123321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123321C1Ev();
extern void _ZN3aaa9GG3123321D1Ev();
Name_Map name_map__ZN3aaa9GG3123321E[] = {
  NSPAIR(_ZN3aaa9GG3123321C1Ev),
  NSPAIR(_ZN3aaa9GG3123321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3123321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123321E[];
extern void _ZN3aaa9GG31233213fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31233213fooEv,_ZThn8_N3aaa9GG31233213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233213fooEv,_ZThn20_N3aaa9GG31233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31233213fooEv,_ZThn28_N3aaa9GG31233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31233213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31233213fooEv,_ZThn8_N3aaa9GG31233213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233213fooEv,_ZThn20_N3aaa9GG31233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233213fooEv,_ZThn28_N3aaa9GG31233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123321E[];
Class_Descriptor cd__ZN3aaa9GG3123321E = {  "_ZN3aaa9GG3123321E", // class name
  bases__ZN3aaa9GG3123321E, 6,
  &(vtc__ZN3aaa9GG3123321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123322  : ::aaa::EE312 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31233223barEv
  ~GG3123322(); // tgen
  GG3123322(); // tgen
};
//SIG(1 _ZN3aaa9GG3123322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31233223barEv");}
aaa::GG3123322 ::~GG3123322(){ note_dtor("_ZN3aaa9GG3123322E", this);} // tgen
aaa::GG3123322 ::GG3123322(){ note_ctor("_ZN3aaa9GG3123322E", this);} // tgen
}
static void Test__ZN3aaa9GG3123322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123322E, buf);
    ::aaa::GG3123322 *dp, &lv = *(dp=new (buf) ::aaa::GG3123322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123322E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3123322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3123322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3123322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123322E);
    dp->::aaa::GG3123322::~GG3123322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123322E(Test__ZN3aaa9GG3123322E, "_ZN3aaa9GG3123322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123322C1Ev();
extern void _ZN3aaa9GG3123322D1Ev();
Name_Map name_map__ZN3aaa9GG3123322E[] = {
  NSPAIR(_ZN3aaa9GG3123322C1Ev),
  NSPAIR(_ZN3aaa9GG3123322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3123322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31233223barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31233223barEv,_ZThn20_N3aaa9GG31233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31233223barEv,_ZThn28_N3aaa9GG31233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233223barEv,_ZThn20_N3aaa9GG31233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233223barEv,_ZThn28_N3aaa9GG31233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123322E[];
Class_Descriptor cd__ZN3aaa9GG3123322E = {  "_ZN3aaa9GG3123322E", // class name
  bases__ZN3aaa9GG3123322E, 6,
  &(vtc__ZN3aaa9GG3123322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123323  : ::aaa::EE312 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31233233fooEv
  virtual void  bar(); // _ZN3aaa9GG31233233barEv
  ~GG3123323(); // tgen
  GG3123323(); // tgen
};
//SIG(1 _ZN3aaa9GG3123323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31233233fooEv");}
void  aaa::GG3123323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31233233barEv");}
aaa::GG3123323 ::~GG3123323(){ note_dtor("_ZN3aaa9GG3123323E", this);} // tgen
aaa::GG3123323 ::GG3123323(){ note_ctor("_ZN3aaa9GG3123323E", this);} // tgen
}
static void Test__ZN3aaa9GG3123323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123323E, buf);
    ::aaa::GG3123323 *dp, &lv = *(dp=new (buf) ::aaa::GG3123323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123323E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3123323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3123323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3123323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123323E);
    dp->::aaa::GG3123323::~GG3123323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123323E(Test__ZN3aaa9GG3123323E, "_ZN3aaa9GG3123323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123323C1Ev();
extern void _ZN3aaa9GG3123323D1Ev();
Name_Map name_map__ZN3aaa9GG3123323E[] = {
  NSPAIR(_ZN3aaa9GG3123323C1Ev),
  NSPAIR(_ZN3aaa9GG3123323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3123323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123323E[];
extern void _ZN3aaa9GG31233233fooEv();
extern void _ZN3aaa9GG31233233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31233233fooEv,_ZThn8_N3aaa9GG31233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233233fooEv,_ZThn20_N3aaa9GG31233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233233barEv,_ZThn20_N3aaa9GG31233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31233233fooEv,_ZThn28_N3aaa9GG31233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31233233barEv,_ZThn28_N3aaa9GG31233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31233233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31233233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31233233fooEv,_ZThn8_N3aaa9GG31233233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233233fooEv,_ZThn20_N3aaa9GG31233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233233barEv,_ZThn20_N3aaa9GG31233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233233fooEv,_ZThn28_N3aaa9GG31233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233233barEv,_ZThn28_N3aaa9GG31233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123323E[];
Class_Descriptor cd__ZN3aaa9GG3123323E = {  "_ZN3aaa9GG3123323E", // class name
  bases__ZN3aaa9GG3123323E, 6,
  &(vtc__ZN3aaa9GG3123323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123331  : ::aaa::EE312 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31233313fooEv
  ~GG3123331(); // tgen
  GG3123331(); // tgen
};
//SIG(1 _ZN3aaa9GG3123331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31233313fooEv");}
aaa::GG3123331 ::~GG3123331(){ note_dtor("_ZN3aaa9GG3123331E", this);} // tgen
aaa::GG3123331 ::GG3123331(){ note_ctor("_ZN3aaa9GG3123331E", this);} // tgen
}
static void Test__ZN3aaa9GG3123331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123331E, buf);
    ::aaa::GG3123331 *dp, &lv = *(dp=new (buf) ::aaa::GG3123331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123331E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3123331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3123331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3123331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123331E);
    dp->::aaa::GG3123331::~GG3123331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123331E(Test__ZN3aaa9GG3123331E, "_ZN3aaa9GG3123331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123331C1Ev();
extern void _ZN3aaa9GG3123331D1Ev();
Name_Map name_map__ZN3aaa9GG3123331E[] = {
  NSPAIR(_ZN3aaa9GG3123331C1Ev),
  NSPAIR(_ZN3aaa9GG3123331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3123331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123331E[];
extern void _ZN3aaa9GG31233313fooEv();
extern void _ZN3aaa5EE3123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31233313fooEv,_ZThn8_N3aaa9GG31233313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233313fooEv,_ZThn20_N3aaa9GG31233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31233313fooEv,_ZThn28_N3aaa9GG31233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31233313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31233313fooEv,_ZThn8_N3aaa9GG31233313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233313fooEv,_ZThn20_N3aaa9GG31233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233313fooEv,_ZThn28_N3aaa9GG31233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123331E[];
Class_Descriptor cd__ZN3aaa9GG3123331E = {  "_ZN3aaa9GG3123331E", // class name
  bases__ZN3aaa9GG3123331E, 6,
  &(vtc__ZN3aaa9GG3123331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123332  : ::aaa::EE312 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31233323barEv
  ~GG3123332(); // tgen
  GG3123332(); // tgen
};
//SIG(1 _ZN3aaa9GG3123332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3123332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31233323barEv");}
aaa::GG3123332 ::~GG3123332(){ note_dtor("_ZN3aaa9GG3123332E", this);} // tgen
aaa::GG3123332 ::GG3123332(){ note_ctor("_ZN3aaa9GG3123332E", this);} // tgen
}
static void Test__ZN3aaa9GG3123332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123332E, buf);
    ::aaa::GG3123332 *dp, &lv = *(dp=new (buf) ::aaa::GG3123332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123332E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3123332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3123332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3123332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123332E);
    dp->::aaa::GG3123332::~GG3123332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123332E(Test__ZN3aaa9GG3123332E, "_ZN3aaa9GG3123332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123332C1Ev();
extern void _ZN3aaa9GG3123332D1Ev();
Name_Map name_map__ZN3aaa9GG3123332E[] = {
  NSPAIR(_ZN3aaa9GG3123332C1Ev),
  NSPAIR(_ZN3aaa9GG3123332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3123332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG31233323barEv();
extern void _ZN3aaa3BB13fooEv();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31233323barEv,_ZThn20_N3aaa9GG31233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31233323barEv,_ZThn28_N3aaa9GG31233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233323barEv,_ZThn20_N3aaa9GG31233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233323barEv,_ZThn28_N3aaa9GG31233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123332E[];
Class_Descriptor cd__ZN3aaa9GG3123332E = {  "_ZN3aaa9GG3123332E", // class name
  bases__ZN3aaa9GG3123332E, 6,
  &(vtc__ZN3aaa9GG3123332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3123333  : ::aaa::EE312 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31233333fooEv
  virtual void  bar(); // _ZN3aaa9GG31233333barEv
  ~GG3123333(); // tgen
  GG3123333(); // tgen
};
//SIG(1 _ZN3aaa9GG3123333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3123333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31233333fooEv");}
void  aaa::GG3123333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31233333barEv");}
aaa::GG3123333 ::~GG3123333(){ note_dtor("_ZN3aaa9GG3123333E", this);} // tgen
aaa::GG3123333 ::GG3123333(){ note_ctor("_ZN3aaa9GG3123333E", this);} // tgen
}
static void Test__ZN3aaa9GG3123333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3123333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3123333E, buf);
    ::aaa::GG3123333 *dp, &lv = *(dp=new (buf) ::aaa::GG3123333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3123333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3123333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE312*), 0, "_ZN3aaa9GG3123333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE312*), ABISELECT(16,8), "_ZN3aaa9GG3123333E");
    check_base_class_offset(lv, (::aaa::EE312*), 0, "_ZN3aaa9GG3123333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3123333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3123333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3123333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3123333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3123333E);
    dp->::aaa::GG3123333::~GG3123333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3123333E(Test__ZN3aaa9GG3123333E, "_ZN3aaa9GG3123333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3123333C1Ev();
extern void _ZN3aaa9GG3123333D1Ev();
Name_Map name_map__ZN3aaa9GG3123333E[] = {
  NSPAIR(_ZN3aaa9GG3123333C1Ev),
  NSPAIR(_ZN3aaa9GG3123333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE312E;
extern VTBL_ENTRY _ZTIN3aaa5EE312E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE312E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3123333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE312E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3123333E[];
extern void _ZN3aaa9GG31233333fooEv();
extern void _ZN3aaa9GG31233333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31233333fooEv,_ZThn8_N3aaa9GG31233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233333fooEv,_ZThn20_N3aaa9GG31233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31233333barEv,_ZThn20_N3aaa9GG31233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31233333fooEv,_ZThn28_N3aaa9GG31233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31233333barEv,_ZThn28_N3aaa9GG31233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3123333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31233333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31233333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31233333fooEv,_ZThn8_N3aaa9GG31233333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233333fooEv,_ZThn20_N3aaa9GG31233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31233333barEv,_ZThn20_N3aaa9GG31233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3123333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233333fooEv,_ZThn28_N3aaa9GG31233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31233333barEv,_ZThn28_N3aaa9GG31233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3123333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3123333E[];
Class_Descriptor cd__ZN3aaa9GG3123333E = {  "_ZN3aaa9GG3123333E", // class name
  bases__ZN3aaa9GG3123333E, 6,
  &(vtc__ZN3aaa9GG3123333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3123333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3123333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131111  : ::aaa::EE313 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31311113fooEv
  ~GG3131111(); // tgen
  GG3131111(); // tgen
};
//SIG(1 _ZN3aaa9GG3131111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31311113fooEv");}
aaa::GG3131111 ::~GG3131111(){ note_dtor("_ZN3aaa9GG3131111E", this);} // tgen
aaa::GG3131111 ::GG3131111(){ note_ctor("_ZN3aaa9GG3131111E", this);} // tgen
}
static void Test__ZN3aaa9GG3131111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131111E, buf);
    ::aaa::GG3131111 *dp, &lv = *(dp=new (buf) ::aaa::GG3131111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131111E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3131111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3131111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3131111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131111E);
    dp->::aaa::GG3131111::~GG3131111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131111E(Test__ZN3aaa9GG3131111E, "_ZN3aaa9GG3131111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131111C1Ev();
extern void _ZN3aaa9GG3131111D1Ev();
Name_Map name_map__ZN3aaa9GG3131111E[] = {
  NSPAIR(_ZN3aaa9GG3131111C1Ev),
  NSPAIR(_ZN3aaa9GG3131111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3131111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131111E[];
extern void _ZN3aaa9GG31311113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31311113fooEv,_ZThn8_N3aaa9GG31311113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31311113fooEv,_ZThn20_N3aaa9GG31311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31311113fooEv,_ZThn28_N3aaa9GG31311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31311113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31311113fooEv,_ZThn8_N3aaa9GG31311113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311113fooEv,_ZThn20_N3aaa9GG31311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31311113fooEv,_ZThn28_N3aaa9GG31311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131111E[];
Class_Descriptor cd__ZN3aaa9GG3131111E = {  "_ZN3aaa9GG3131111E", // class name
  bases__ZN3aaa9GG3131111E, 6,
  &(vtc__ZN3aaa9GG3131111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131112  : ::aaa::EE313 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31311123barEv
  ~GG3131112(); // tgen
  GG3131112(); // tgen
};
//SIG(1 _ZN3aaa9GG3131112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31311123barEv");}
aaa::GG3131112 ::~GG3131112(){ note_dtor("_ZN3aaa9GG3131112E", this);} // tgen
aaa::GG3131112 ::GG3131112(){ note_ctor("_ZN3aaa9GG3131112E", this);} // tgen
}
static void Test__ZN3aaa9GG3131112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131112E, buf);
    ::aaa::GG3131112 *dp, &lv = *(dp=new (buf) ::aaa::GG3131112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131112E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3131112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3131112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3131112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131112E);
    dp->::aaa::GG3131112::~GG3131112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131112E(Test__ZN3aaa9GG3131112E, "_ZN3aaa9GG3131112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131112C1Ev();
extern void _ZN3aaa9GG3131112D1Ev();
Name_Map name_map__ZN3aaa9GG3131112E[] = {
  NSPAIR(_ZN3aaa9GG3131112C1Ev),
  NSPAIR(_ZN3aaa9GG3131112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3131112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131112E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31311123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31311123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131112E[];
Class_Descriptor cd__ZN3aaa9GG3131112E = {  "_ZN3aaa9GG3131112E", // class name
  bases__ZN3aaa9GG3131112E, 6,
  &(vtc__ZN3aaa9GG3131112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131113  : ::aaa::EE313 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31311133fooEv
  virtual void  bar(); // _ZN3aaa9GG31311133barEv
  ~GG3131113(); // tgen
  GG3131113(); // tgen
};
//SIG(1 _ZN3aaa9GG3131113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31311133fooEv");}
void  aaa::GG3131113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31311133barEv");}
aaa::GG3131113 ::~GG3131113(){ note_dtor("_ZN3aaa9GG3131113E", this);} // tgen
aaa::GG3131113 ::GG3131113(){ note_ctor("_ZN3aaa9GG3131113E", this);} // tgen
}
static void Test__ZN3aaa9GG3131113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131113E, buf);
    ::aaa::GG3131113 *dp, &lv = *(dp=new (buf) ::aaa::GG3131113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131113E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3131113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3131113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3131113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131113E);
    dp->::aaa::GG3131113::~GG3131113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131113E(Test__ZN3aaa9GG3131113E, "_ZN3aaa9GG3131113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131113C1Ev();
extern void _ZN3aaa9GG3131113D1Ev();
Name_Map name_map__ZN3aaa9GG3131113E[] = {
  NSPAIR(_ZN3aaa9GG3131113C1Ev),
  NSPAIR(_ZN3aaa9GG3131113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3131113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131113E[];
extern void _ZN3aaa9GG31311133fooEv();
extern void _ZN3aaa9GG31311133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31311133fooEv,_ZThn8_N3aaa9GG31311133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31311133fooEv,_ZThn20_N3aaa9GG31311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31311133fooEv,_ZThn28_N3aaa9GG31311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31311133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31311133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31311133fooEv,_ZThn8_N3aaa9GG31311133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311133fooEv,_ZThn20_N3aaa9GG31311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31311133fooEv,_ZThn28_N3aaa9GG31311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131113E[];
Class_Descriptor cd__ZN3aaa9GG3131113E = {  "_ZN3aaa9GG3131113E", // class name
  bases__ZN3aaa9GG3131113E, 6,
  &(vtc__ZN3aaa9GG3131113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131121  : ::aaa::EE313 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31311213fooEv
  ~GG3131121(); // tgen
  GG3131121(); // tgen
};
//SIG(1 _ZN3aaa9GG3131121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31311213fooEv");}
aaa::GG3131121 ::~GG3131121(){ note_dtor("_ZN3aaa9GG3131121E", this);} // tgen
aaa::GG3131121 ::GG3131121(){ note_ctor("_ZN3aaa9GG3131121E", this);} // tgen
}
static void Test__ZN3aaa9GG3131121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131121E, buf);
    ::aaa::GG3131121 *dp, &lv = *(dp=new (buf) ::aaa::GG3131121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131121E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3131121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3131121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3131121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131121E);
    dp->::aaa::GG3131121::~GG3131121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131121E(Test__ZN3aaa9GG3131121E, "_ZN3aaa9GG3131121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131121C1Ev();
extern void _ZN3aaa9GG3131121D1Ev();
Name_Map name_map__ZN3aaa9GG3131121E[] = {
  NSPAIR(_ZN3aaa9GG3131121C1Ev),
  NSPAIR(_ZN3aaa9GG3131121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3131121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131121E[];
extern void _ZN3aaa9GG31311213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31311213fooEv,_ZThn8_N3aaa9GG31311213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31311213fooEv,_ZThn20_N3aaa9GG31311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31311213fooEv,_ZThn28_N3aaa9GG31311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31311213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31311213fooEv,_ZThn8_N3aaa9GG31311213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311213fooEv,_ZThn20_N3aaa9GG31311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31311213fooEv,_ZThn28_N3aaa9GG31311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131121E[];
Class_Descriptor cd__ZN3aaa9GG3131121E = {  "_ZN3aaa9GG3131121E", // class name
  bases__ZN3aaa9GG3131121E, 6,
  &(vtc__ZN3aaa9GG3131121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131122  : ::aaa::EE313 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31311223barEv
  ~GG3131122(); // tgen
  GG3131122(); // tgen
};
//SIG(1 _ZN3aaa9GG3131122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31311223barEv");}
aaa::GG3131122 ::~GG3131122(){ note_dtor("_ZN3aaa9GG3131122E", this);} // tgen
aaa::GG3131122 ::GG3131122(){ note_ctor("_ZN3aaa9GG3131122E", this);} // tgen
}
static void Test__ZN3aaa9GG3131122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131122E, buf);
    ::aaa::GG3131122 *dp, &lv = *(dp=new (buf) ::aaa::GG3131122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131122E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3131122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3131122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3131122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131122E);
    dp->::aaa::GG3131122::~GG3131122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131122E(Test__ZN3aaa9GG3131122E, "_ZN3aaa9GG3131122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131122C1Ev();
extern void _ZN3aaa9GG3131122D1Ev();
Name_Map name_map__ZN3aaa9GG3131122E[] = {
  NSPAIR(_ZN3aaa9GG3131122C1Ev),
  NSPAIR(_ZN3aaa9GG3131122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3131122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131122E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31311223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31311223barEv,_ZThn20_N3aaa9GG31311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31311223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311223barEv,_ZThn20_N3aaa9GG31311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131122E[];
Class_Descriptor cd__ZN3aaa9GG3131122E = {  "_ZN3aaa9GG3131122E", // class name
  bases__ZN3aaa9GG3131122E, 6,
  &(vtc__ZN3aaa9GG3131122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131123  : ::aaa::EE313 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31311233fooEv
  virtual void  bar(); // _ZN3aaa9GG31311233barEv
  ~GG3131123(); // tgen
  GG3131123(); // tgen
};
//SIG(1 _ZN3aaa9GG3131123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31311233fooEv");}
void  aaa::GG3131123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31311233barEv");}
aaa::GG3131123 ::~GG3131123(){ note_dtor("_ZN3aaa9GG3131123E", this);} // tgen
aaa::GG3131123 ::GG3131123(){ note_ctor("_ZN3aaa9GG3131123E", this);} // tgen
}
static void Test__ZN3aaa9GG3131123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131123E, buf);
    ::aaa::GG3131123 *dp, &lv = *(dp=new (buf) ::aaa::GG3131123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131123E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3131123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3131123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3131123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131123E);
    dp->::aaa::GG3131123::~GG3131123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131123E(Test__ZN3aaa9GG3131123E, "_ZN3aaa9GG3131123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131123C1Ev();
extern void _ZN3aaa9GG3131123D1Ev();
Name_Map name_map__ZN3aaa9GG3131123E[] = {
  NSPAIR(_ZN3aaa9GG3131123C1Ev),
  NSPAIR(_ZN3aaa9GG3131123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3131123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131123E[];
extern void _ZN3aaa9GG31311233fooEv();
extern void _ZN3aaa9GG31311233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31311233fooEv,_ZThn8_N3aaa9GG31311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31311233fooEv,_ZThn20_N3aaa9GG31311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31311233barEv,_ZThn20_N3aaa9GG31311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31311233fooEv,_ZThn28_N3aaa9GG31311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31311233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31311233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31311233fooEv,_ZThn8_N3aaa9GG31311233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311233fooEv,_ZThn20_N3aaa9GG31311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311233barEv,_ZThn20_N3aaa9GG31311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31311233fooEv,_ZThn28_N3aaa9GG31311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131123E[];
Class_Descriptor cd__ZN3aaa9GG3131123E = {  "_ZN3aaa9GG3131123E", // class name
  bases__ZN3aaa9GG3131123E, 6,
  &(vtc__ZN3aaa9GG3131123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131131  : ::aaa::EE313 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31311313fooEv
  ~GG3131131(); // tgen
  GG3131131(); // tgen
};
//SIG(1 _ZN3aaa9GG3131131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31311313fooEv");}
aaa::GG3131131 ::~GG3131131(){ note_dtor("_ZN3aaa9GG3131131E", this);} // tgen
aaa::GG3131131 ::GG3131131(){ note_ctor("_ZN3aaa9GG3131131E", this);} // tgen
}
static void Test__ZN3aaa9GG3131131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131131E, buf);
    ::aaa::GG3131131 *dp, &lv = *(dp=new (buf) ::aaa::GG3131131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131131E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3131131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3131131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3131131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131131E);
    dp->::aaa::GG3131131::~GG3131131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131131E(Test__ZN3aaa9GG3131131E, "_ZN3aaa9GG3131131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131131C1Ev();
extern void _ZN3aaa9GG3131131D1Ev();
Name_Map name_map__ZN3aaa9GG3131131E[] = {
  NSPAIR(_ZN3aaa9GG3131131C1Ev),
  NSPAIR(_ZN3aaa9GG3131131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3131131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131131E[];
extern void _ZN3aaa9GG31311313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31311313fooEv,_ZThn8_N3aaa9GG31311313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31311313fooEv,_ZThn20_N3aaa9GG31311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31311313fooEv,_ZThn28_N3aaa9GG31311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31311313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31311313fooEv,_ZThn8_N3aaa9GG31311313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311313fooEv,_ZThn20_N3aaa9GG31311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31311313fooEv,_ZThn28_N3aaa9GG31311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131131E[];
Class_Descriptor cd__ZN3aaa9GG3131131E = {  "_ZN3aaa9GG3131131E", // class name
  bases__ZN3aaa9GG3131131E, 6,
  &(vtc__ZN3aaa9GG3131131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131132  : ::aaa::EE313 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31311323barEv
  ~GG3131132(); // tgen
  GG3131132(); // tgen
};
//SIG(1 _ZN3aaa9GG3131132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31311323barEv");}
aaa::GG3131132 ::~GG3131132(){ note_dtor("_ZN3aaa9GG3131132E", this);} // tgen
aaa::GG3131132 ::GG3131132(){ note_ctor("_ZN3aaa9GG3131132E", this);} // tgen
}
static void Test__ZN3aaa9GG3131132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131132E, buf);
    ::aaa::GG3131132 *dp, &lv = *(dp=new (buf) ::aaa::GG3131132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131132E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3131132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3131132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3131132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131132E);
    dp->::aaa::GG3131132::~GG3131132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131132E(Test__ZN3aaa9GG3131132E, "_ZN3aaa9GG3131132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131132C1Ev();
extern void _ZN3aaa9GG3131132D1Ev();
Name_Map name_map__ZN3aaa9GG3131132E[] = {
  NSPAIR(_ZN3aaa9GG3131132C1Ev),
  NSPAIR(_ZN3aaa9GG3131132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3131132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131132E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31311323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31311323barEv,_ZThn20_N3aaa9GG31311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31311323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311323barEv,_ZThn20_N3aaa9GG31311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131132E[];
Class_Descriptor cd__ZN3aaa9GG3131132E = {  "_ZN3aaa9GG3131132E", // class name
  bases__ZN3aaa9GG3131132E, 6,
  &(vtc__ZN3aaa9GG3131132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131133  : ::aaa::EE313 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31311333fooEv
  virtual void  bar(); // _ZN3aaa9GG31311333barEv
  ~GG3131133(); // tgen
  GG3131133(); // tgen
};
//SIG(1 _ZN3aaa9GG3131133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31311333fooEv");}
void  aaa::GG3131133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31311333barEv");}
aaa::GG3131133 ::~GG3131133(){ note_dtor("_ZN3aaa9GG3131133E", this);} // tgen
aaa::GG3131133 ::GG3131133(){ note_ctor("_ZN3aaa9GG3131133E", this);} // tgen
}
static void Test__ZN3aaa9GG3131133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131133E, buf);
    ::aaa::GG3131133 *dp, &lv = *(dp=new (buf) ::aaa::GG3131133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131133E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3131133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3131133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3131133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131133E);
    dp->::aaa::GG3131133::~GG3131133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131133E(Test__ZN3aaa9GG3131133E, "_ZN3aaa9GG3131133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131133C1Ev();
extern void _ZN3aaa9GG3131133D1Ev();
Name_Map name_map__ZN3aaa9GG3131133E[] = {
  NSPAIR(_ZN3aaa9GG3131133C1Ev),
  NSPAIR(_ZN3aaa9GG3131133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3131133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131133E[];
extern void _ZN3aaa9GG31311333fooEv();
extern void _ZN3aaa9GG31311333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31311333fooEv,_ZThn8_N3aaa9GG31311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31311333fooEv,_ZThn20_N3aaa9GG31311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31311333barEv,_ZThn20_N3aaa9GG31311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31311333fooEv,_ZThn28_N3aaa9GG31311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31311333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31311333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31311333fooEv,_ZThn8_N3aaa9GG31311333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311333fooEv,_ZThn20_N3aaa9GG31311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31311333barEv,_ZThn20_N3aaa9GG31311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31311333fooEv,_ZThn28_N3aaa9GG31311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131133E[];
Class_Descriptor cd__ZN3aaa9GG3131133E = {  "_ZN3aaa9GG3131133E", // class name
  bases__ZN3aaa9GG3131133E, 6,
  &(vtc__ZN3aaa9GG3131133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131211  : ::aaa::EE313 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31312113fooEv
  ~GG3131211(); // tgen
  GG3131211(); // tgen
};
//SIG(1 _ZN3aaa9GG3131211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31312113fooEv");}
aaa::GG3131211 ::~GG3131211(){ note_dtor("_ZN3aaa9GG3131211E", this);} // tgen
aaa::GG3131211 ::GG3131211(){ note_ctor("_ZN3aaa9GG3131211E", this);} // tgen
}
static void Test__ZN3aaa9GG3131211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131211E, buf);
    ::aaa::GG3131211 *dp, &lv = *(dp=new (buf) ::aaa::GG3131211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131211E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3131211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3131211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3131211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131211E);
    dp->::aaa::GG3131211::~GG3131211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131211E(Test__ZN3aaa9GG3131211E, "_ZN3aaa9GG3131211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131211C1Ev();
extern void _ZN3aaa9GG3131211D1Ev();
Name_Map name_map__ZN3aaa9GG3131211E[] = {
  NSPAIR(_ZN3aaa9GG3131211C1Ev),
  NSPAIR(_ZN3aaa9GG3131211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3131211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131211E[];
extern void _ZN3aaa9GG31312113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31312113fooEv,_ZThn8_N3aaa9GG31312113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31312113fooEv,_ZThn20_N3aaa9GG31312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31312113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31312113fooEv,_ZThn8_N3aaa9GG31312113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312113fooEv,_ZThn20_N3aaa9GG31312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131211E[];
Class_Descriptor cd__ZN3aaa9GG3131211E = {  "_ZN3aaa9GG3131211E", // class name
  bases__ZN3aaa9GG3131211E, 6,
  &(vtc__ZN3aaa9GG3131211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131212  : ::aaa::EE313 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31312123barEv
  ~GG3131212(); // tgen
  GG3131212(); // tgen
};
//SIG(1 _ZN3aaa9GG3131212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31312123barEv");}
aaa::GG3131212 ::~GG3131212(){ note_dtor("_ZN3aaa9GG3131212E", this);} // tgen
aaa::GG3131212 ::GG3131212(){ note_ctor("_ZN3aaa9GG3131212E", this);} // tgen
}
static void Test__ZN3aaa9GG3131212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131212E, buf);
    ::aaa::GG3131212 *dp, &lv = *(dp=new (buf) ::aaa::GG3131212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131212E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3131212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3131212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3131212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131212E);
    dp->::aaa::GG3131212::~GG3131212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131212E(Test__ZN3aaa9GG3131212E, "_ZN3aaa9GG3131212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131212C1Ev();
extern void _ZN3aaa9GG3131212D1Ev();
Name_Map name_map__ZN3aaa9GG3131212E[] = {
  NSPAIR(_ZN3aaa9GG3131212C1Ev),
  NSPAIR(_ZN3aaa9GG3131212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3131212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131212E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31312123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31312123barEv,_ZThn28_N3aaa9GG31312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31312123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31312123barEv,_ZThn28_N3aaa9GG31312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131212E[];
Class_Descriptor cd__ZN3aaa9GG3131212E = {  "_ZN3aaa9GG3131212E", // class name
  bases__ZN3aaa9GG3131212E, 6,
  &(vtc__ZN3aaa9GG3131212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131213  : ::aaa::EE313 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31312133fooEv
  virtual void  bar(); // _ZN3aaa9GG31312133barEv
  ~GG3131213(); // tgen
  GG3131213(); // tgen
};
//SIG(1 _ZN3aaa9GG3131213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31312133fooEv");}
void  aaa::GG3131213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31312133barEv");}
aaa::GG3131213 ::~GG3131213(){ note_dtor("_ZN3aaa9GG3131213E", this);} // tgen
aaa::GG3131213 ::GG3131213(){ note_ctor("_ZN3aaa9GG3131213E", this);} // tgen
}
static void Test__ZN3aaa9GG3131213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131213E, buf);
    ::aaa::GG3131213 *dp, &lv = *(dp=new (buf) ::aaa::GG3131213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131213E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3131213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3131213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3131213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131213E);
    dp->::aaa::GG3131213::~GG3131213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131213E(Test__ZN3aaa9GG3131213E, "_ZN3aaa9GG3131213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131213C1Ev();
extern void _ZN3aaa9GG3131213D1Ev();
Name_Map name_map__ZN3aaa9GG3131213E[] = {
  NSPAIR(_ZN3aaa9GG3131213C1Ev),
  NSPAIR(_ZN3aaa9GG3131213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3131213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131213E[];
extern void _ZN3aaa9GG31312133fooEv();
extern void _ZN3aaa9GG31312133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31312133fooEv,_ZThn8_N3aaa9GG31312133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31312133fooEv,_ZThn20_N3aaa9GG31312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31312133barEv,_ZThn28_N3aaa9GG31312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31312133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31312133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31312133fooEv,_ZThn8_N3aaa9GG31312133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312133fooEv,_ZThn20_N3aaa9GG31312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31312133barEv,_ZThn28_N3aaa9GG31312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131213E[];
Class_Descriptor cd__ZN3aaa9GG3131213E = {  "_ZN3aaa9GG3131213E", // class name
  bases__ZN3aaa9GG3131213E, 6,
  &(vtc__ZN3aaa9GG3131213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131221  : ::aaa::EE313 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31312213fooEv
  ~GG3131221(); // tgen
  GG3131221(); // tgen
};
//SIG(1 _ZN3aaa9GG3131221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31312213fooEv");}
aaa::GG3131221 ::~GG3131221(){ note_dtor("_ZN3aaa9GG3131221E", this);} // tgen
aaa::GG3131221 ::GG3131221(){ note_ctor("_ZN3aaa9GG3131221E", this);} // tgen
}
static void Test__ZN3aaa9GG3131221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131221E, buf);
    ::aaa::GG3131221 *dp, &lv = *(dp=new (buf) ::aaa::GG3131221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131221E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3131221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3131221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3131221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131221E);
    dp->::aaa::GG3131221::~GG3131221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131221E(Test__ZN3aaa9GG3131221E, "_ZN3aaa9GG3131221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131221C1Ev();
extern void _ZN3aaa9GG3131221D1Ev();
Name_Map name_map__ZN3aaa9GG3131221E[] = {
  NSPAIR(_ZN3aaa9GG3131221C1Ev),
  NSPAIR(_ZN3aaa9GG3131221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3131221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131221E[];
extern void _ZN3aaa9GG31312213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31312213fooEv,_ZThn8_N3aaa9GG31312213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31312213fooEv,_ZThn20_N3aaa9GG31312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31312213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31312213fooEv,_ZThn8_N3aaa9GG31312213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312213fooEv,_ZThn20_N3aaa9GG31312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131221E[];
Class_Descriptor cd__ZN3aaa9GG3131221E = {  "_ZN3aaa9GG3131221E", // class name
  bases__ZN3aaa9GG3131221E, 6,
  &(vtc__ZN3aaa9GG3131221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131222  : ::aaa::EE313 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31312223barEv
  ~GG3131222(); // tgen
  GG3131222(); // tgen
};
//SIG(1 _ZN3aaa9GG3131222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31312223barEv");}
aaa::GG3131222 ::~GG3131222(){ note_dtor("_ZN3aaa9GG3131222E", this);} // tgen
aaa::GG3131222 ::GG3131222(){ note_ctor("_ZN3aaa9GG3131222E", this);} // tgen
}
static void Test__ZN3aaa9GG3131222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131222E, buf);
    ::aaa::GG3131222 *dp, &lv = *(dp=new (buf) ::aaa::GG3131222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131222E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3131222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3131222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3131222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131222E);
    dp->::aaa::GG3131222::~GG3131222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131222E(Test__ZN3aaa9GG3131222E, "_ZN3aaa9GG3131222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131222C1Ev();
extern void _ZN3aaa9GG3131222D1Ev();
Name_Map name_map__ZN3aaa9GG3131222E[] = {
  NSPAIR(_ZN3aaa9GG3131222C1Ev),
  NSPAIR(_ZN3aaa9GG3131222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3131222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131222E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31312223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31312223barEv,_ZThn20_N3aaa9GG31312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31312223barEv,_ZThn28_N3aaa9GG31312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31312223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312223barEv,_ZThn20_N3aaa9GG31312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31312223barEv,_ZThn28_N3aaa9GG31312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131222E[];
Class_Descriptor cd__ZN3aaa9GG3131222E = {  "_ZN3aaa9GG3131222E", // class name
  bases__ZN3aaa9GG3131222E, 6,
  &(vtc__ZN3aaa9GG3131222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131223  : ::aaa::EE313 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31312233fooEv
  virtual void  bar(); // _ZN3aaa9GG31312233barEv
  ~GG3131223(); // tgen
  GG3131223(); // tgen
};
//SIG(1 _ZN3aaa9GG3131223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31312233fooEv");}
void  aaa::GG3131223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31312233barEv");}
aaa::GG3131223 ::~GG3131223(){ note_dtor("_ZN3aaa9GG3131223E", this);} // tgen
aaa::GG3131223 ::GG3131223(){ note_ctor("_ZN3aaa9GG3131223E", this);} // tgen
}
static void Test__ZN3aaa9GG3131223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131223E, buf);
    ::aaa::GG3131223 *dp, &lv = *(dp=new (buf) ::aaa::GG3131223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131223E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3131223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3131223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3131223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131223E);
    dp->::aaa::GG3131223::~GG3131223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131223E(Test__ZN3aaa9GG3131223E, "_ZN3aaa9GG3131223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131223C1Ev();
extern void _ZN3aaa9GG3131223D1Ev();
Name_Map name_map__ZN3aaa9GG3131223E[] = {
  NSPAIR(_ZN3aaa9GG3131223C1Ev),
  NSPAIR(_ZN3aaa9GG3131223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3131223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131223E[];
extern void _ZN3aaa9GG31312233fooEv();
extern void _ZN3aaa9GG31312233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31312233fooEv,_ZThn8_N3aaa9GG31312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31312233fooEv,_ZThn20_N3aaa9GG31312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31312233barEv,_ZThn20_N3aaa9GG31312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31312233barEv,_ZThn28_N3aaa9GG31312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31312233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31312233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31312233fooEv,_ZThn8_N3aaa9GG31312233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312233fooEv,_ZThn20_N3aaa9GG31312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312233barEv,_ZThn20_N3aaa9GG31312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31312233barEv,_ZThn28_N3aaa9GG31312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131223E[];
Class_Descriptor cd__ZN3aaa9GG3131223E = {  "_ZN3aaa9GG3131223E", // class name
  bases__ZN3aaa9GG3131223E, 6,
  &(vtc__ZN3aaa9GG3131223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131231  : ::aaa::EE313 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31312313fooEv
  ~GG3131231(); // tgen
  GG3131231(); // tgen
};
//SIG(1 _ZN3aaa9GG3131231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31312313fooEv");}
aaa::GG3131231 ::~GG3131231(){ note_dtor("_ZN3aaa9GG3131231E", this);} // tgen
aaa::GG3131231 ::GG3131231(){ note_ctor("_ZN3aaa9GG3131231E", this);} // tgen
}
static void Test__ZN3aaa9GG3131231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131231E, buf);
    ::aaa::GG3131231 *dp, &lv = *(dp=new (buf) ::aaa::GG3131231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131231E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3131231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3131231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3131231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131231E);
    dp->::aaa::GG3131231::~GG3131231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131231E(Test__ZN3aaa9GG3131231E, "_ZN3aaa9GG3131231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131231C1Ev();
extern void _ZN3aaa9GG3131231D1Ev();
Name_Map name_map__ZN3aaa9GG3131231E[] = {
  NSPAIR(_ZN3aaa9GG3131231C1Ev),
  NSPAIR(_ZN3aaa9GG3131231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3131231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131231E[];
extern void _ZN3aaa9GG31312313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31312313fooEv,_ZThn8_N3aaa9GG31312313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31312313fooEv,_ZThn20_N3aaa9GG31312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31312313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31312313fooEv,_ZThn8_N3aaa9GG31312313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312313fooEv,_ZThn20_N3aaa9GG31312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131231E[];
Class_Descriptor cd__ZN3aaa9GG3131231E = {  "_ZN3aaa9GG3131231E", // class name
  bases__ZN3aaa9GG3131231E, 6,
  &(vtc__ZN3aaa9GG3131231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131232  : ::aaa::EE313 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31312323barEv
  ~GG3131232(); // tgen
  GG3131232(); // tgen
};
//SIG(1 _ZN3aaa9GG3131232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31312323barEv");}
aaa::GG3131232 ::~GG3131232(){ note_dtor("_ZN3aaa9GG3131232E", this);} // tgen
aaa::GG3131232 ::GG3131232(){ note_ctor("_ZN3aaa9GG3131232E", this);} // tgen
}
static void Test__ZN3aaa9GG3131232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131232E, buf);
    ::aaa::GG3131232 *dp, &lv = *(dp=new (buf) ::aaa::GG3131232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131232E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3131232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3131232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3131232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131232E);
    dp->::aaa::GG3131232::~GG3131232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131232E(Test__ZN3aaa9GG3131232E, "_ZN3aaa9GG3131232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131232C1Ev();
extern void _ZN3aaa9GG3131232D1Ev();
Name_Map name_map__ZN3aaa9GG3131232E[] = {
  NSPAIR(_ZN3aaa9GG3131232C1Ev),
  NSPAIR(_ZN3aaa9GG3131232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3131232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131232E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31312323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31312323barEv,_ZThn20_N3aaa9GG31312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31312323barEv,_ZThn28_N3aaa9GG31312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31312323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312323barEv,_ZThn20_N3aaa9GG31312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31312323barEv,_ZThn28_N3aaa9GG31312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131232E[];
Class_Descriptor cd__ZN3aaa9GG3131232E = {  "_ZN3aaa9GG3131232E", // class name
  bases__ZN3aaa9GG3131232E, 6,
  &(vtc__ZN3aaa9GG3131232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131233  : ::aaa::EE313 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31312333fooEv
  virtual void  bar(); // _ZN3aaa9GG31312333barEv
  ~GG3131233(); // tgen
  GG3131233(); // tgen
};
//SIG(1 _ZN3aaa9GG3131233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31312333fooEv");}
void  aaa::GG3131233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31312333barEv");}
aaa::GG3131233 ::~GG3131233(){ note_dtor("_ZN3aaa9GG3131233E", this);} // tgen
aaa::GG3131233 ::GG3131233(){ note_ctor("_ZN3aaa9GG3131233E", this);} // tgen
}
static void Test__ZN3aaa9GG3131233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131233E, buf);
    ::aaa::GG3131233 *dp, &lv = *(dp=new (buf) ::aaa::GG3131233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131233E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3131233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3131233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3131233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131233E);
    dp->::aaa::GG3131233::~GG3131233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131233E(Test__ZN3aaa9GG3131233E, "_ZN3aaa9GG3131233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131233C1Ev();
extern void _ZN3aaa9GG3131233D1Ev();
Name_Map name_map__ZN3aaa9GG3131233E[] = {
  NSPAIR(_ZN3aaa9GG3131233C1Ev),
  NSPAIR(_ZN3aaa9GG3131233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3131233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131233E[];
extern void _ZN3aaa9GG31312333fooEv();
extern void _ZN3aaa9GG31312333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31312333fooEv,_ZThn8_N3aaa9GG31312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31312333fooEv,_ZThn20_N3aaa9GG31312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31312333barEv,_ZThn20_N3aaa9GG31312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31312333barEv,_ZThn28_N3aaa9GG31312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31312333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31312333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31312333fooEv,_ZThn8_N3aaa9GG31312333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312333fooEv,_ZThn20_N3aaa9GG31312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31312333barEv,_ZThn20_N3aaa9GG31312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31312333barEv,_ZThn28_N3aaa9GG31312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131233E[];
Class_Descriptor cd__ZN3aaa9GG3131233E = {  "_ZN3aaa9GG3131233E", // class name
  bases__ZN3aaa9GG3131233E, 6,
  &(vtc__ZN3aaa9GG3131233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131311  : ::aaa::EE313 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31313113fooEv
  ~GG3131311(); // tgen
  GG3131311(); // tgen
};
//SIG(1 _ZN3aaa9GG3131311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31313113fooEv");}
aaa::GG3131311 ::~GG3131311(){ note_dtor("_ZN3aaa9GG3131311E", this);} // tgen
aaa::GG3131311 ::GG3131311(){ note_ctor("_ZN3aaa9GG3131311E", this);} // tgen
}
static void Test__ZN3aaa9GG3131311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131311E, buf);
    ::aaa::GG3131311 *dp, &lv = *(dp=new (buf) ::aaa::GG3131311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131311E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3131311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3131311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3131311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131311E);
    dp->::aaa::GG3131311::~GG3131311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131311E(Test__ZN3aaa9GG3131311E, "_ZN3aaa9GG3131311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131311C1Ev();
extern void _ZN3aaa9GG3131311D1Ev();
Name_Map name_map__ZN3aaa9GG3131311E[] = {
  NSPAIR(_ZN3aaa9GG3131311C1Ev),
  NSPAIR(_ZN3aaa9GG3131311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3131311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131311E[];
extern void _ZN3aaa9GG31313113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31313113fooEv,_ZThn8_N3aaa9GG31313113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31313113fooEv,_ZThn20_N3aaa9GG31313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313113fooEv,_ZThn28_N3aaa9GG31313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31313113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31313113fooEv,_ZThn8_N3aaa9GG31313113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313113fooEv,_ZThn20_N3aaa9GG31313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313113fooEv,_ZThn28_N3aaa9GG31313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131311E[];
Class_Descriptor cd__ZN3aaa9GG3131311E = {  "_ZN3aaa9GG3131311E", // class name
  bases__ZN3aaa9GG3131311E, 6,
  &(vtc__ZN3aaa9GG3131311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131312  : ::aaa::EE313 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31313123barEv
  ~GG3131312(); // tgen
  GG3131312(); // tgen
};
//SIG(1 _ZN3aaa9GG3131312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31313123barEv");}
aaa::GG3131312 ::~GG3131312(){ note_dtor("_ZN3aaa9GG3131312E", this);} // tgen
aaa::GG3131312 ::GG3131312(){ note_ctor("_ZN3aaa9GG3131312E", this);} // tgen
}
static void Test__ZN3aaa9GG3131312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131312E, buf);
    ::aaa::GG3131312 *dp, &lv = *(dp=new (buf) ::aaa::GG3131312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131312E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3131312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3131312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3131312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131312E);
    dp->::aaa::GG3131312::~GG3131312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131312E(Test__ZN3aaa9GG3131312E, "_ZN3aaa9GG3131312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131312C1Ev();
extern void _ZN3aaa9GG3131312D1Ev();
Name_Map name_map__ZN3aaa9GG3131312E[] = {
  NSPAIR(_ZN3aaa9GG3131312C1Ev),
  NSPAIR(_ZN3aaa9GG3131312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3131312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131312E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31313123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313123barEv,_ZThn28_N3aaa9GG31313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31313123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313123barEv,_ZThn28_N3aaa9GG31313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131312E[];
Class_Descriptor cd__ZN3aaa9GG3131312E = {  "_ZN3aaa9GG3131312E", // class name
  bases__ZN3aaa9GG3131312E, 6,
  &(vtc__ZN3aaa9GG3131312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131313  : ::aaa::EE313 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31313133fooEv
  virtual void  bar(); // _ZN3aaa9GG31313133barEv
  ~GG3131313(); // tgen
  GG3131313(); // tgen
};
//SIG(1 _ZN3aaa9GG3131313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31313133fooEv");}
void  aaa::GG3131313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31313133barEv");}
aaa::GG3131313 ::~GG3131313(){ note_dtor("_ZN3aaa9GG3131313E", this);} // tgen
aaa::GG3131313 ::GG3131313(){ note_ctor("_ZN3aaa9GG3131313E", this);} // tgen
}
static void Test__ZN3aaa9GG3131313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131313E, buf);
    ::aaa::GG3131313 *dp, &lv = *(dp=new (buf) ::aaa::GG3131313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131313E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3131313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3131313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3131313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131313E);
    dp->::aaa::GG3131313::~GG3131313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131313E(Test__ZN3aaa9GG3131313E, "_ZN3aaa9GG3131313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131313C1Ev();
extern void _ZN3aaa9GG3131313D1Ev();
Name_Map name_map__ZN3aaa9GG3131313E[] = {
  NSPAIR(_ZN3aaa9GG3131313C1Ev),
  NSPAIR(_ZN3aaa9GG3131313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3131313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131313E[];
extern void _ZN3aaa9GG31313133fooEv();
extern void _ZN3aaa9GG31313133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31313133fooEv,_ZThn8_N3aaa9GG31313133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31313133fooEv,_ZThn20_N3aaa9GG31313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313133fooEv,_ZThn28_N3aaa9GG31313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313133barEv,_ZThn28_N3aaa9GG31313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31313133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31313133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31313133fooEv,_ZThn8_N3aaa9GG31313133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313133fooEv,_ZThn20_N3aaa9GG31313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313133fooEv,_ZThn28_N3aaa9GG31313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313133barEv,_ZThn28_N3aaa9GG31313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131313E[];
Class_Descriptor cd__ZN3aaa9GG3131313E = {  "_ZN3aaa9GG3131313E", // class name
  bases__ZN3aaa9GG3131313E, 6,
  &(vtc__ZN3aaa9GG3131313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131321  : ::aaa::EE313 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31313213fooEv
  ~GG3131321(); // tgen
  GG3131321(); // tgen
};
//SIG(1 _ZN3aaa9GG3131321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31313213fooEv");}
aaa::GG3131321 ::~GG3131321(){ note_dtor("_ZN3aaa9GG3131321E", this);} // tgen
aaa::GG3131321 ::GG3131321(){ note_ctor("_ZN3aaa9GG3131321E", this);} // tgen
}
static void Test__ZN3aaa9GG3131321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131321E, buf);
    ::aaa::GG3131321 *dp, &lv = *(dp=new (buf) ::aaa::GG3131321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131321E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3131321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3131321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3131321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131321E);
    dp->::aaa::GG3131321::~GG3131321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131321E(Test__ZN3aaa9GG3131321E, "_ZN3aaa9GG3131321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131321C1Ev();
extern void _ZN3aaa9GG3131321D1Ev();
Name_Map name_map__ZN3aaa9GG3131321E[] = {
  NSPAIR(_ZN3aaa9GG3131321C1Ev),
  NSPAIR(_ZN3aaa9GG3131321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3131321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131321E[];
extern void _ZN3aaa9GG31313213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31313213fooEv,_ZThn8_N3aaa9GG31313213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31313213fooEv,_ZThn20_N3aaa9GG31313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31313213fooEv,_ZThn28_N3aaa9GG31313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31313213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31313213fooEv,_ZThn8_N3aaa9GG31313213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313213fooEv,_ZThn20_N3aaa9GG31313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313213fooEv,_ZThn28_N3aaa9GG31313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131321E[];
Class_Descriptor cd__ZN3aaa9GG3131321E = {  "_ZN3aaa9GG3131321E", // class name
  bases__ZN3aaa9GG3131321E, 6,
  &(vtc__ZN3aaa9GG3131321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131322  : ::aaa::EE313 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31313223barEv
  ~GG3131322(); // tgen
  GG3131322(); // tgen
};
//SIG(1 _ZN3aaa9GG3131322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31313223barEv");}
aaa::GG3131322 ::~GG3131322(){ note_dtor("_ZN3aaa9GG3131322E", this);} // tgen
aaa::GG3131322 ::GG3131322(){ note_ctor("_ZN3aaa9GG3131322E", this);} // tgen
}
static void Test__ZN3aaa9GG3131322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131322E, buf);
    ::aaa::GG3131322 *dp, &lv = *(dp=new (buf) ::aaa::GG3131322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131322E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3131322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3131322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3131322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131322E);
    dp->::aaa::GG3131322::~GG3131322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131322E(Test__ZN3aaa9GG3131322E, "_ZN3aaa9GG3131322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131322C1Ev();
extern void _ZN3aaa9GG3131322D1Ev();
Name_Map name_map__ZN3aaa9GG3131322E[] = {
  NSPAIR(_ZN3aaa9GG3131322C1Ev),
  NSPAIR(_ZN3aaa9GG3131322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3131322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131322E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31313223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31313223barEv,_ZThn20_N3aaa9GG31313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31313223barEv,_ZThn28_N3aaa9GG31313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31313223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313223barEv,_ZThn20_N3aaa9GG31313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313223barEv,_ZThn28_N3aaa9GG31313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131322E[];
Class_Descriptor cd__ZN3aaa9GG3131322E = {  "_ZN3aaa9GG3131322E", // class name
  bases__ZN3aaa9GG3131322E, 6,
  &(vtc__ZN3aaa9GG3131322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131323  : ::aaa::EE313 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31313233fooEv
  virtual void  bar(); // _ZN3aaa9GG31313233barEv
  ~GG3131323(); // tgen
  GG3131323(); // tgen
};
//SIG(1 _ZN3aaa9GG3131323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31313233fooEv");}
void  aaa::GG3131323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31313233barEv");}
aaa::GG3131323 ::~GG3131323(){ note_dtor("_ZN3aaa9GG3131323E", this);} // tgen
aaa::GG3131323 ::GG3131323(){ note_ctor("_ZN3aaa9GG3131323E", this);} // tgen
}
static void Test__ZN3aaa9GG3131323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131323E, buf);
    ::aaa::GG3131323 *dp, &lv = *(dp=new (buf) ::aaa::GG3131323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131323E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3131323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3131323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3131323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131323E);
    dp->::aaa::GG3131323::~GG3131323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131323E(Test__ZN3aaa9GG3131323E, "_ZN3aaa9GG3131323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131323C1Ev();
extern void _ZN3aaa9GG3131323D1Ev();
Name_Map name_map__ZN3aaa9GG3131323E[] = {
  NSPAIR(_ZN3aaa9GG3131323C1Ev),
  NSPAIR(_ZN3aaa9GG3131323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3131323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131323E[];
extern void _ZN3aaa9GG31313233fooEv();
extern void _ZN3aaa9GG31313233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31313233fooEv,_ZThn8_N3aaa9GG31313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31313233fooEv,_ZThn20_N3aaa9GG31313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31313233barEv,_ZThn20_N3aaa9GG31313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313233fooEv,_ZThn28_N3aaa9GG31313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313233barEv,_ZThn28_N3aaa9GG31313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31313233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31313233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31313233fooEv,_ZThn8_N3aaa9GG31313233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313233fooEv,_ZThn20_N3aaa9GG31313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313233barEv,_ZThn20_N3aaa9GG31313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313233fooEv,_ZThn28_N3aaa9GG31313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313233barEv,_ZThn28_N3aaa9GG31313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131323E[];
Class_Descriptor cd__ZN3aaa9GG3131323E = {  "_ZN3aaa9GG3131323E", // class name
  bases__ZN3aaa9GG3131323E, 6,
  &(vtc__ZN3aaa9GG3131323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131331  : ::aaa::EE313 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31313313fooEv
  ~GG3131331(); // tgen
  GG3131331(); // tgen
};
//SIG(1 _ZN3aaa9GG3131331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31313313fooEv");}
aaa::GG3131331 ::~GG3131331(){ note_dtor("_ZN3aaa9GG3131331E", this);} // tgen
aaa::GG3131331 ::GG3131331(){ note_ctor("_ZN3aaa9GG3131331E", this);} // tgen
}
static void Test__ZN3aaa9GG3131331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131331E, buf);
    ::aaa::GG3131331 *dp, &lv = *(dp=new (buf) ::aaa::GG3131331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131331E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3131331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3131331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3131331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131331E);
    dp->::aaa::GG3131331::~GG3131331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131331E(Test__ZN3aaa9GG3131331E, "_ZN3aaa9GG3131331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131331C1Ev();
extern void _ZN3aaa9GG3131331D1Ev();
Name_Map name_map__ZN3aaa9GG3131331E[] = {
  NSPAIR(_ZN3aaa9GG3131331C1Ev),
  NSPAIR(_ZN3aaa9GG3131331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3131331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131331E[];
extern void _ZN3aaa9GG31313313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31313313fooEv,_ZThn8_N3aaa9GG31313313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31313313fooEv,_ZThn20_N3aaa9GG31313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31313313fooEv,_ZThn28_N3aaa9GG31313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31313313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31313313fooEv,_ZThn8_N3aaa9GG31313313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313313fooEv,_ZThn20_N3aaa9GG31313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313313fooEv,_ZThn28_N3aaa9GG31313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131331E[];
Class_Descriptor cd__ZN3aaa9GG3131331E = {  "_ZN3aaa9GG3131331E", // class name
  bases__ZN3aaa9GG3131331E, 6,
  &(vtc__ZN3aaa9GG3131331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131332  : ::aaa::EE313 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31313323barEv
  ~GG3131332(); // tgen
  GG3131332(); // tgen
};
//SIG(1 _ZN3aaa9GG3131332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3131332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31313323barEv");}
aaa::GG3131332 ::~GG3131332(){ note_dtor("_ZN3aaa9GG3131332E", this);} // tgen
aaa::GG3131332 ::GG3131332(){ note_ctor("_ZN3aaa9GG3131332E", this);} // tgen
}
static void Test__ZN3aaa9GG3131332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131332E, buf);
    ::aaa::GG3131332 *dp, &lv = *(dp=new (buf) ::aaa::GG3131332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131332E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3131332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3131332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3131332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131332E);
    dp->::aaa::GG3131332::~GG3131332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131332E(Test__ZN3aaa9GG3131332E, "_ZN3aaa9GG3131332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131332C1Ev();
extern void _ZN3aaa9GG3131332D1Ev();
Name_Map name_map__ZN3aaa9GG3131332E[] = {
  NSPAIR(_ZN3aaa9GG3131332C1Ev),
  NSPAIR(_ZN3aaa9GG3131332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3131332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131332E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31313323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31313323barEv,_ZThn20_N3aaa9GG31313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313323barEv,_ZThn28_N3aaa9GG31313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31313323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313323barEv,_ZThn20_N3aaa9GG31313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313323barEv,_ZThn28_N3aaa9GG31313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131332E[];
Class_Descriptor cd__ZN3aaa9GG3131332E = {  "_ZN3aaa9GG3131332E", // class name
  bases__ZN3aaa9GG3131332E, 6,
  &(vtc__ZN3aaa9GG3131332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3131333  : ::aaa::EE313 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31313333fooEv
  virtual void  bar(); // _ZN3aaa9GG31313333barEv
  ~GG3131333(); // tgen
  GG3131333(); // tgen
};
//SIG(1 _ZN3aaa9GG3131333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3131333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31313333fooEv");}
void  aaa::GG3131333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31313333barEv");}
aaa::GG3131333 ::~GG3131333(){ note_dtor("_ZN3aaa9GG3131333E", this);} // tgen
aaa::GG3131333 ::GG3131333(){ note_ctor("_ZN3aaa9GG3131333E", this);} // tgen
}
static void Test__ZN3aaa9GG3131333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3131333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3131333E, buf);
    ::aaa::GG3131333 *dp, &lv = *(dp=new (buf) ::aaa::GG3131333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3131333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3131333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3131333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3131333E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3131333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3131333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3131333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3131333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3131333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3131333E);
    dp->::aaa::GG3131333::~GG3131333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3131333E(Test__ZN3aaa9GG3131333E, "_ZN3aaa9GG3131333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3131333C1Ev();
extern void _ZN3aaa9GG3131333D1Ev();
Name_Map name_map__ZN3aaa9GG3131333E[] = {
  NSPAIR(_ZN3aaa9GG3131333C1Ev),
  NSPAIR(_ZN3aaa9GG3131333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3131333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3131333E[];
extern void _ZN3aaa9GG31313333fooEv();
extern void _ZN3aaa9GG31313333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31313333fooEv,_ZThn8_N3aaa9GG31313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31313333fooEv,_ZThn20_N3aaa9GG31313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31313333barEv,_ZThn20_N3aaa9GG31313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313333fooEv,_ZThn28_N3aaa9GG31313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31313333barEv,_ZThn28_N3aaa9GG31313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3131333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31313333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31313333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31313333fooEv,_ZThn8_N3aaa9GG31313333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313333fooEv,_ZThn20_N3aaa9GG31313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31313333barEv,_ZThn20_N3aaa9GG31313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3131333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313333fooEv,_ZThn28_N3aaa9GG31313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31313333barEv,_ZThn28_N3aaa9GG31313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3131333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3131333E[];
Class_Descriptor cd__ZN3aaa9GG3131333E = {  "_ZN3aaa9GG3131333E", // class name
  bases__ZN3aaa9GG3131333E, 6,
  &(vtc__ZN3aaa9GG3131333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3131333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3131333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132111  : ::aaa::EE313 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31321113fooEv
  ~GG3132111(); // tgen
  GG3132111(); // tgen
};
//SIG(1 _ZN3aaa9GG3132111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31321113fooEv");}
aaa::GG3132111 ::~GG3132111(){ note_dtor("_ZN3aaa9GG3132111E", this);} // tgen
aaa::GG3132111 ::GG3132111(){ note_ctor("_ZN3aaa9GG3132111E", this);} // tgen
}
static void Test__ZN3aaa9GG3132111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132111E, buf);
    ::aaa::GG3132111 *dp, &lv = *(dp=new (buf) ::aaa::GG3132111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132111E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3132111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3132111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3132111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132111E);
    dp->::aaa::GG3132111::~GG3132111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132111E(Test__ZN3aaa9GG3132111E, "_ZN3aaa9GG3132111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132111C1Ev();
extern void _ZN3aaa9GG3132111D1Ev();
Name_Map name_map__ZN3aaa9GG3132111E[] = {
  NSPAIR(_ZN3aaa9GG3132111C1Ev),
  NSPAIR(_ZN3aaa9GG3132111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3132111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132111E[];
extern void _ZN3aaa9GG31321113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31321113fooEv,_ZThn8_N3aaa9GG31321113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31321113fooEv,_ZThn20_N3aaa9GG31321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31321113fooEv,_ZThn28_N3aaa9GG31321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31321113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31321113fooEv,_ZThn8_N3aaa9GG31321113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321113fooEv,_ZThn20_N3aaa9GG31321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31321113fooEv,_ZThn28_N3aaa9GG31321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132111E[];
Class_Descriptor cd__ZN3aaa9GG3132111E = {  "_ZN3aaa9GG3132111E", // class name
  bases__ZN3aaa9GG3132111E, 6,
  &(vtc__ZN3aaa9GG3132111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132112  : ::aaa::EE313 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31321123barEv
  ~GG3132112(); // tgen
  GG3132112(); // tgen
};
//SIG(1 _ZN3aaa9GG3132112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31321123barEv");}
aaa::GG3132112 ::~GG3132112(){ note_dtor("_ZN3aaa9GG3132112E", this);} // tgen
aaa::GG3132112 ::GG3132112(){ note_ctor("_ZN3aaa9GG3132112E", this);} // tgen
}
static void Test__ZN3aaa9GG3132112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132112E, buf);
    ::aaa::GG3132112 *dp, &lv = *(dp=new (buf) ::aaa::GG3132112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132112E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3132112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3132112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3132112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132112E);
    dp->::aaa::GG3132112::~GG3132112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132112E(Test__ZN3aaa9GG3132112E, "_ZN3aaa9GG3132112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132112C1Ev();
extern void _ZN3aaa9GG3132112D1Ev();
Name_Map name_map__ZN3aaa9GG3132112E[] = {
  NSPAIR(_ZN3aaa9GG3132112C1Ev),
  NSPAIR(_ZN3aaa9GG3132112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3132112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132112E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31321123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31321123barEv,_ZThn20_N3aaa9GG31321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31321123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321123barEv,_ZThn20_N3aaa9GG31321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132112E[];
Class_Descriptor cd__ZN3aaa9GG3132112E = {  "_ZN3aaa9GG3132112E", // class name
  bases__ZN3aaa9GG3132112E, 6,
  &(vtc__ZN3aaa9GG3132112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132113  : ::aaa::EE313 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31321133fooEv
  virtual void  bar(); // _ZN3aaa9GG31321133barEv
  ~GG3132113(); // tgen
  GG3132113(); // tgen
};
//SIG(1 _ZN3aaa9GG3132113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31321133fooEv");}
void  aaa::GG3132113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31321133barEv");}
aaa::GG3132113 ::~GG3132113(){ note_dtor("_ZN3aaa9GG3132113E", this);} // tgen
aaa::GG3132113 ::GG3132113(){ note_ctor("_ZN3aaa9GG3132113E", this);} // tgen
}
static void Test__ZN3aaa9GG3132113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132113E, buf);
    ::aaa::GG3132113 *dp, &lv = *(dp=new (buf) ::aaa::GG3132113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132113E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3132113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3132113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3132113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132113E);
    dp->::aaa::GG3132113::~GG3132113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132113E(Test__ZN3aaa9GG3132113E, "_ZN3aaa9GG3132113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132113C1Ev();
extern void _ZN3aaa9GG3132113D1Ev();
Name_Map name_map__ZN3aaa9GG3132113E[] = {
  NSPAIR(_ZN3aaa9GG3132113C1Ev),
  NSPAIR(_ZN3aaa9GG3132113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3132113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132113E[];
extern void _ZN3aaa9GG31321133fooEv();
extern void _ZN3aaa9GG31321133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31321133fooEv,_ZThn8_N3aaa9GG31321133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31321133barEv,_ZThn20_N3aaa9GG31321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31321133fooEv,_ZThn20_N3aaa9GG31321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31321133fooEv,_ZThn28_N3aaa9GG31321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31321133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31321133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31321133fooEv,_ZThn8_N3aaa9GG31321133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321133barEv,_ZThn20_N3aaa9GG31321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321133fooEv,_ZThn20_N3aaa9GG31321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31321133fooEv,_ZThn28_N3aaa9GG31321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132113E[];
Class_Descriptor cd__ZN3aaa9GG3132113E = {  "_ZN3aaa9GG3132113E", // class name
  bases__ZN3aaa9GG3132113E, 6,
  &(vtc__ZN3aaa9GG3132113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132121  : ::aaa::EE313 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31321213fooEv
  ~GG3132121(); // tgen
  GG3132121(); // tgen
};
//SIG(1 _ZN3aaa9GG3132121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31321213fooEv");}
aaa::GG3132121 ::~GG3132121(){ note_dtor("_ZN3aaa9GG3132121E", this);} // tgen
aaa::GG3132121 ::GG3132121(){ note_ctor("_ZN3aaa9GG3132121E", this);} // tgen
}
static void Test__ZN3aaa9GG3132121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132121E, buf);
    ::aaa::GG3132121 *dp, &lv = *(dp=new (buf) ::aaa::GG3132121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132121E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3132121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3132121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3132121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132121E);
    dp->::aaa::GG3132121::~GG3132121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132121E(Test__ZN3aaa9GG3132121E, "_ZN3aaa9GG3132121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132121C1Ev();
extern void _ZN3aaa9GG3132121D1Ev();
Name_Map name_map__ZN3aaa9GG3132121E[] = {
  NSPAIR(_ZN3aaa9GG3132121C1Ev),
  NSPAIR(_ZN3aaa9GG3132121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3132121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132121E[];
extern void _ZN3aaa9GG31321213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31321213fooEv,_ZThn8_N3aaa9GG31321213fooEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31321213fooEv,_ZThn28_N3aaa9GG31321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31321213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31321213fooEv,_ZThn8_N3aaa9GG31321213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31321213fooEv,_ZThn28_N3aaa9GG31321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132121E[];
Class_Descriptor cd__ZN3aaa9GG3132121E = {  "_ZN3aaa9GG3132121E", // class name
  bases__ZN3aaa9GG3132121E, 6,
  &(vtc__ZN3aaa9GG3132121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132122  : ::aaa::EE313 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31321223barEv
  ~GG3132122(); // tgen
  GG3132122(); // tgen
};
//SIG(1 _ZN3aaa9GG3132122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31321223barEv");}
aaa::GG3132122 ::~GG3132122(){ note_dtor("_ZN3aaa9GG3132122E", this);} // tgen
aaa::GG3132122 ::GG3132122(){ note_ctor("_ZN3aaa9GG3132122E", this);} // tgen
}
static void Test__ZN3aaa9GG3132122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132122E, buf);
    ::aaa::GG3132122 *dp, &lv = *(dp=new (buf) ::aaa::GG3132122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132122E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3132122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3132122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3132122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132122E);
    dp->::aaa::GG3132122::~GG3132122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132122E(Test__ZN3aaa9GG3132122E, "_ZN3aaa9GG3132122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132122C1Ev();
extern void _ZN3aaa9GG3132122D1Ev();
Name_Map name_map__ZN3aaa9GG3132122E[] = {
  NSPAIR(_ZN3aaa9GG3132122C1Ev),
  NSPAIR(_ZN3aaa9GG3132122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3132122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132122E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31321223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31321223barEv,_ZThn20_N3aaa9GG31321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31321223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321223barEv,_ZThn20_N3aaa9GG31321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132122E[];
Class_Descriptor cd__ZN3aaa9GG3132122E = {  "_ZN3aaa9GG3132122E", // class name
  bases__ZN3aaa9GG3132122E, 6,
  &(vtc__ZN3aaa9GG3132122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132123  : ::aaa::EE313 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31321233fooEv
  virtual void  bar(); // _ZN3aaa9GG31321233barEv
  ~GG3132123(); // tgen
  GG3132123(); // tgen
};
//SIG(1 _ZN3aaa9GG3132123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31321233fooEv");}
void  aaa::GG3132123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31321233barEv");}
aaa::GG3132123 ::~GG3132123(){ note_dtor("_ZN3aaa9GG3132123E", this);} // tgen
aaa::GG3132123 ::GG3132123(){ note_ctor("_ZN3aaa9GG3132123E", this);} // tgen
}
static void Test__ZN3aaa9GG3132123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132123E, buf);
    ::aaa::GG3132123 *dp, &lv = *(dp=new (buf) ::aaa::GG3132123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132123E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3132123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3132123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3132123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132123E);
    dp->::aaa::GG3132123::~GG3132123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132123E(Test__ZN3aaa9GG3132123E, "_ZN3aaa9GG3132123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132123C1Ev();
extern void _ZN3aaa9GG3132123D1Ev();
Name_Map name_map__ZN3aaa9GG3132123E[] = {
  NSPAIR(_ZN3aaa9GG3132123C1Ev),
  NSPAIR(_ZN3aaa9GG3132123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3132123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132123E[];
extern void _ZN3aaa9GG31321233fooEv();
extern void _ZN3aaa9GG31321233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31321233fooEv,_ZThn8_N3aaa9GG31321233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31321233barEv,_ZThn20_N3aaa9GG31321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31321233fooEv,_ZThn28_N3aaa9GG31321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31321233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31321233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31321233fooEv,_ZThn8_N3aaa9GG31321233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321233barEv,_ZThn20_N3aaa9GG31321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31321233fooEv,_ZThn28_N3aaa9GG31321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132123E[];
Class_Descriptor cd__ZN3aaa9GG3132123E = {  "_ZN3aaa9GG3132123E", // class name
  bases__ZN3aaa9GG3132123E, 6,
  &(vtc__ZN3aaa9GG3132123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132131  : ::aaa::EE313 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31321313fooEv
  ~GG3132131(); // tgen
  GG3132131(); // tgen
};
//SIG(1 _ZN3aaa9GG3132131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31321313fooEv");}
aaa::GG3132131 ::~GG3132131(){ note_dtor("_ZN3aaa9GG3132131E", this);} // tgen
aaa::GG3132131 ::GG3132131(){ note_ctor("_ZN3aaa9GG3132131E", this);} // tgen
}
static void Test__ZN3aaa9GG3132131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132131E, buf);
    ::aaa::GG3132131 *dp, &lv = *(dp=new (buf) ::aaa::GG3132131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132131E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3132131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3132131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3132131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132131E);
    dp->::aaa::GG3132131::~GG3132131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132131E(Test__ZN3aaa9GG3132131E, "_ZN3aaa9GG3132131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132131C1Ev();
extern void _ZN3aaa9GG3132131D1Ev();
Name_Map name_map__ZN3aaa9GG3132131E[] = {
  NSPAIR(_ZN3aaa9GG3132131C1Ev),
  NSPAIR(_ZN3aaa9GG3132131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3132131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132131E[];
extern void _ZN3aaa9GG31321313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31321313fooEv,_ZThn8_N3aaa9GG31321313fooEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31321313fooEv,_ZThn20_N3aaa9GG31321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31321313fooEv,_ZThn28_N3aaa9GG31321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31321313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31321313fooEv,_ZThn8_N3aaa9GG31321313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321313fooEv,_ZThn20_N3aaa9GG31321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31321313fooEv,_ZThn28_N3aaa9GG31321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132131E[];
Class_Descriptor cd__ZN3aaa9GG3132131E = {  "_ZN3aaa9GG3132131E", // class name
  bases__ZN3aaa9GG3132131E, 6,
  &(vtc__ZN3aaa9GG3132131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132132  : ::aaa::EE313 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31321323barEv
  ~GG3132132(); // tgen
  GG3132132(); // tgen
};
//SIG(1 _ZN3aaa9GG3132132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31321323barEv");}
aaa::GG3132132 ::~GG3132132(){ note_dtor("_ZN3aaa9GG3132132E", this);} // tgen
aaa::GG3132132 ::GG3132132(){ note_ctor("_ZN3aaa9GG3132132E", this);} // tgen
}
static void Test__ZN3aaa9GG3132132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132132E, buf);
    ::aaa::GG3132132 *dp, &lv = *(dp=new (buf) ::aaa::GG3132132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132132E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3132132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3132132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3132132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132132E);
    dp->::aaa::GG3132132::~GG3132132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132132E(Test__ZN3aaa9GG3132132E, "_ZN3aaa9GG3132132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132132C1Ev();
extern void _ZN3aaa9GG3132132D1Ev();
Name_Map name_map__ZN3aaa9GG3132132E[] = {
  NSPAIR(_ZN3aaa9GG3132132C1Ev),
  NSPAIR(_ZN3aaa9GG3132132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3132132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132132E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31321323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31321323barEv,_ZThn20_N3aaa9GG31321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31321323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321323barEv,_ZThn20_N3aaa9GG31321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132132E[];
Class_Descriptor cd__ZN3aaa9GG3132132E = {  "_ZN3aaa9GG3132132E", // class name
  bases__ZN3aaa9GG3132132E, 6,
  &(vtc__ZN3aaa9GG3132132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132133  : ::aaa::EE313 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31321333fooEv
  virtual void  bar(); // _ZN3aaa9GG31321333barEv
  ~GG3132133(); // tgen
  GG3132133(); // tgen
};
//SIG(1 _ZN3aaa9GG3132133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31321333fooEv");}
void  aaa::GG3132133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31321333barEv");}
aaa::GG3132133 ::~GG3132133(){ note_dtor("_ZN3aaa9GG3132133E", this);} // tgen
aaa::GG3132133 ::GG3132133(){ note_ctor("_ZN3aaa9GG3132133E", this);} // tgen
}
static void Test__ZN3aaa9GG3132133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132133E, buf);
    ::aaa::GG3132133 *dp, &lv = *(dp=new (buf) ::aaa::GG3132133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132133E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3132133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3132133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3132133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132133E);
    dp->::aaa::GG3132133::~GG3132133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132133E(Test__ZN3aaa9GG3132133E, "_ZN3aaa9GG3132133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132133C1Ev();
extern void _ZN3aaa9GG3132133D1Ev();
Name_Map name_map__ZN3aaa9GG3132133E[] = {
  NSPAIR(_ZN3aaa9GG3132133C1Ev),
  NSPAIR(_ZN3aaa9GG3132133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3132133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132133E[];
extern void _ZN3aaa9GG31321333fooEv();
extern void _ZN3aaa9GG31321333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31321333fooEv,_ZThn8_N3aaa9GG31321333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31321333barEv,_ZThn20_N3aaa9GG31321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31321333fooEv,_ZThn20_N3aaa9GG31321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31321333fooEv,_ZThn28_N3aaa9GG31321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31321333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31321333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31321333fooEv,_ZThn8_N3aaa9GG31321333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321333barEv,_ZThn20_N3aaa9GG31321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31321333fooEv,_ZThn20_N3aaa9GG31321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31321333fooEv,_ZThn28_N3aaa9GG31321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132133E[];
Class_Descriptor cd__ZN3aaa9GG3132133E = {  "_ZN3aaa9GG3132133E", // class name
  bases__ZN3aaa9GG3132133E, 6,
  &(vtc__ZN3aaa9GG3132133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132211  : ::aaa::EE313 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31322113fooEv
  ~GG3132211(); // tgen
  GG3132211(); // tgen
};
//SIG(1 _ZN3aaa9GG3132211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31322113fooEv");}
aaa::GG3132211 ::~GG3132211(){ note_dtor("_ZN3aaa9GG3132211E", this);} // tgen
aaa::GG3132211 ::GG3132211(){ note_ctor("_ZN3aaa9GG3132211E", this);} // tgen
}
static void Test__ZN3aaa9GG3132211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132211E, buf);
    ::aaa::GG3132211 *dp, &lv = *(dp=new (buf) ::aaa::GG3132211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132211E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3132211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3132211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3132211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132211E);
    dp->::aaa::GG3132211::~GG3132211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132211E(Test__ZN3aaa9GG3132211E, "_ZN3aaa9GG3132211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132211C1Ev();
extern void _ZN3aaa9GG3132211D1Ev();
Name_Map name_map__ZN3aaa9GG3132211E[] = {
  NSPAIR(_ZN3aaa9GG3132211C1Ev),
  NSPAIR(_ZN3aaa9GG3132211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3132211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132211E[];
extern void _ZN3aaa9GG31322113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31322113fooEv,_ZThn8_N3aaa9GG31322113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31322113fooEv,_ZThn20_N3aaa9GG31322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31322113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31322113fooEv,_ZThn8_N3aaa9GG31322113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322113fooEv,_ZThn20_N3aaa9GG31322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132211E[];
Class_Descriptor cd__ZN3aaa9GG3132211E = {  "_ZN3aaa9GG3132211E", // class name
  bases__ZN3aaa9GG3132211E, 6,
  &(vtc__ZN3aaa9GG3132211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132212  : ::aaa::EE313 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31322123barEv
  ~GG3132212(); // tgen
  GG3132212(); // tgen
};
//SIG(1 _ZN3aaa9GG3132212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31322123barEv");}
aaa::GG3132212 ::~GG3132212(){ note_dtor("_ZN3aaa9GG3132212E", this);} // tgen
aaa::GG3132212 ::GG3132212(){ note_ctor("_ZN3aaa9GG3132212E", this);} // tgen
}
static void Test__ZN3aaa9GG3132212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132212E, buf);
    ::aaa::GG3132212 *dp, &lv = *(dp=new (buf) ::aaa::GG3132212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132212E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3132212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3132212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3132212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132212E);
    dp->::aaa::GG3132212::~GG3132212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132212E(Test__ZN3aaa9GG3132212E, "_ZN3aaa9GG3132212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132212C1Ev();
extern void _ZN3aaa9GG3132212D1Ev();
Name_Map name_map__ZN3aaa9GG3132212E[] = {
  NSPAIR(_ZN3aaa9GG3132212C1Ev),
  NSPAIR(_ZN3aaa9GG3132212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3132212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132212E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31322123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31322123barEv,_ZThn20_N3aaa9GG31322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31322123barEv,_ZThn28_N3aaa9GG31322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31322123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322123barEv,_ZThn20_N3aaa9GG31322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31322123barEv,_ZThn28_N3aaa9GG31322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132212E[];
Class_Descriptor cd__ZN3aaa9GG3132212E = {  "_ZN3aaa9GG3132212E", // class name
  bases__ZN3aaa9GG3132212E, 6,
  &(vtc__ZN3aaa9GG3132212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132213  : ::aaa::EE313 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31322133fooEv
  virtual void  bar(); // _ZN3aaa9GG31322133barEv
  ~GG3132213(); // tgen
  GG3132213(); // tgen
};
//SIG(1 _ZN3aaa9GG3132213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31322133fooEv");}
void  aaa::GG3132213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31322133barEv");}
aaa::GG3132213 ::~GG3132213(){ note_dtor("_ZN3aaa9GG3132213E", this);} // tgen
aaa::GG3132213 ::GG3132213(){ note_ctor("_ZN3aaa9GG3132213E", this);} // tgen
}
static void Test__ZN3aaa9GG3132213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132213E, buf);
    ::aaa::GG3132213 *dp, &lv = *(dp=new (buf) ::aaa::GG3132213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132213E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3132213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3132213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3132213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132213E);
    dp->::aaa::GG3132213::~GG3132213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132213E(Test__ZN3aaa9GG3132213E, "_ZN3aaa9GG3132213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132213C1Ev();
extern void _ZN3aaa9GG3132213D1Ev();
Name_Map name_map__ZN3aaa9GG3132213E[] = {
  NSPAIR(_ZN3aaa9GG3132213C1Ev),
  NSPAIR(_ZN3aaa9GG3132213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3132213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132213E[];
extern void _ZN3aaa9GG31322133fooEv();
extern void _ZN3aaa9GG31322133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31322133fooEv,_ZThn8_N3aaa9GG31322133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31322133barEv,_ZThn20_N3aaa9GG31322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31322133fooEv,_ZThn20_N3aaa9GG31322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31322133barEv,_ZThn28_N3aaa9GG31322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31322133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31322133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31322133fooEv,_ZThn8_N3aaa9GG31322133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322133barEv,_ZThn20_N3aaa9GG31322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322133fooEv,_ZThn20_N3aaa9GG31322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31322133barEv,_ZThn28_N3aaa9GG31322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132213E[];
Class_Descriptor cd__ZN3aaa9GG3132213E = {  "_ZN3aaa9GG3132213E", // class name
  bases__ZN3aaa9GG3132213E, 6,
  &(vtc__ZN3aaa9GG3132213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132221  : ::aaa::EE313 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31322213fooEv
  ~GG3132221(); // tgen
  GG3132221(); // tgen
};
//SIG(1 _ZN3aaa9GG3132221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31322213fooEv");}
aaa::GG3132221 ::~GG3132221(){ note_dtor("_ZN3aaa9GG3132221E", this);} // tgen
aaa::GG3132221 ::GG3132221(){ note_ctor("_ZN3aaa9GG3132221E", this);} // tgen
}
static void Test__ZN3aaa9GG3132221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132221E, buf);
    ::aaa::GG3132221 *dp, &lv = *(dp=new (buf) ::aaa::GG3132221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132221E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3132221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3132221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3132221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132221E);
    dp->::aaa::GG3132221::~GG3132221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132221E(Test__ZN3aaa9GG3132221E, "_ZN3aaa9GG3132221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132221C1Ev();
extern void _ZN3aaa9GG3132221D1Ev();
Name_Map name_map__ZN3aaa9GG3132221E[] = {
  NSPAIR(_ZN3aaa9GG3132221C1Ev),
  NSPAIR(_ZN3aaa9GG3132221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3132221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132221E[];
extern void _ZN3aaa9GG31322213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31322213fooEv,_ZThn8_N3aaa9GG31322213fooEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31322213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31322213fooEv,_ZThn8_N3aaa9GG31322213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132221E[];
Class_Descriptor cd__ZN3aaa9GG3132221E = {  "_ZN3aaa9GG3132221E", // class name
  bases__ZN3aaa9GG3132221E, 6,
  &(vtc__ZN3aaa9GG3132221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132222  : ::aaa::EE313 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31322223barEv
  ~GG3132222(); // tgen
  GG3132222(); // tgen
};
//SIG(1 _ZN3aaa9GG3132222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31322223barEv");}
aaa::GG3132222 ::~GG3132222(){ note_dtor("_ZN3aaa9GG3132222E", this);} // tgen
aaa::GG3132222 ::GG3132222(){ note_ctor("_ZN3aaa9GG3132222E", this);} // tgen
}
static void Test__ZN3aaa9GG3132222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132222E, buf);
    ::aaa::GG3132222 *dp, &lv = *(dp=new (buf) ::aaa::GG3132222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132222E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3132222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3132222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3132222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132222E);
    dp->::aaa::GG3132222::~GG3132222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132222E(Test__ZN3aaa9GG3132222E, "_ZN3aaa9GG3132222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132222C1Ev();
extern void _ZN3aaa9GG3132222D1Ev();
Name_Map name_map__ZN3aaa9GG3132222E[] = {
  NSPAIR(_ZN3aaa9GG3132222C1Ev),
  NSPAIR(_ZN3aaa9GG3132222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3132222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132222E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31322223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31322223barEv,_ZThn20_N3aaa9GG31322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31322223barEv,_ZThn28_N3aaa9GG31322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31322223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322223barEv,_ZThn20_N3aaa9GG31322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31322223barEv,_ZThn28_N3aaa9GG31322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132222E[];
Class_Descriptor cd__ZN3aaa9GG3132222E = {  "_ZN3aaa9GG3132222E", // class name
  bases__ZN3aaa9GG3132222E, 6,
  &(vtc__ZN3aaa9GG3132222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132223  : ::aaa::EE313 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31322233fooEv
  virtual void  bar(); // _ZN3aaa9GG31322233barEv
  ~GG3132223(); // tgen
  GG3132223(); // tgen
};
//SIG(1 _ZN3aaa9GG3132223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31322233fooEv");}
void  aaa::GG3132223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31322233barEv");}
aaa::GG3132223 ::~GG3132223(){ note_dtor("_ZN3aaa9GG3132223E", this);} // tgen
aaa::GG3132223 ::GG3132223(){ note_ctor("_ZN3aaa9GG3132223E", this);} // tgen
}
static void Test__ZN3aaa9GG3132223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132223E, buf);
    ::aaa::GG3132223 *dp, &lv = *(dp=new (buf) ::aaa::GG3132223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132223E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3132223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3132223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3132223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132223E);
    dp->::aaa::GG3132223::~GG3132223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132223E(Test__ZN3aaa9GG3132223E, "_ZN3aaa9GG3132223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132223C1Ev();
extern void _ZN3aaa9GG3132223D1Ev();
Name_Map name_map__ZN3aaa9GG3132223E[] = {
  NSPAIR(_ZN3aaa9GG3132223C1Ev),
  NSPAIR(_ZN3aaa9GG3132223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3132223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132223E[];
extern void _ZN3aaa9GG31322233fooEv();
extern void _ZN3aaa9GG31322233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31322233fooEv,_ZThn8_N3aaa9GG31322233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31322233barEv,_ZThn20_N3aaa9GG31322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31322233barEv,_ZThn28_N3aaa9GG31322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31322233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31322233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31322233fooEv,_ZThn8_N3aaa9GG31322233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322233barEv,_ZThn20_N3aaa9GG31322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31322233barEv,_ZThn28_N3aaa9GG31322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132223E[];
Class_Descriptor cd__ZN3aaa9GG3132223E = {  "_ZN3aaa9GG3132223E", // class name
  bases__ZN3aaa9GG3132223E, 6,
  &(vtc__ZN3aaa9GG3132223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132231  : ::aaa::EE313 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31322313fooEv
  ~GG3132231(); // tgen
  GG3132231(); // tgen
};
//SIG(1 _ZN3aaa9GG3132231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31322313fooEv");}
aaa::GG3132231 ::~GG3132231(){ note_dtor("_ZN3aaa9GG3132231E", this);} // tgen
aaa::GG3132231 ::GG3132231(){ note_ctor("_ZN3aaa9GG3132231E", this);} // tgen
}
static void Test__ZN3aaa9GG3132231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132231E, buf);
    ::aaa::GG3132231 *dp, &lv = *(dp=new (buf) ::aaa::GG3132231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132231E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3132231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3132231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3132231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132231E);
    dp->::aaa::GG3132231::~GG3132231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132231E(Test__ZN3aaa9GG3132231E, "_ZN3aaa9GG3132231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132231C1Ev();
extern void _ZN3aaa9GG3132231D1Ev();
Name_Map name_map__ZN3aaa9GG3132231E[] = {
  NSPAIR(_ZN3aaa9GG3132231C1Ev),
  NSPAIR(_ZN3aaa9GG3132231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3132231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132231E[];
extern void _ZN3aaa9GG31322313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31322313fooEv,_ZThn8_N3aaa9GG31322313fooEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31322313fooEv,_ZThn20_N3aaa9GG31322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31322313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31322313fooEv,_ZThn8_N3aaa9GG31322313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322313fooEv,_ZThn20_N3aaa9GG31322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132231E[];
Class_Descriptor cd__ZN3aaa9GG3132231E = {  "_ZN3aaa9GG3132231E", // class name
  bases__ZN3aaa9GG3132231E, 6,
  &(vtc__ZN3aaa9GG3132231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132232  : ::aaa::EE313 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31322323barEv
  ~GG3132232(); // tgen
  GG3132232(); // tgen
};
//SIG(1 _ZN3aaa9GG3132232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31322323barEv");}
aaa::GG3132232 ::~GG3132232(){ note_dtor("_ZN3aaa9GG3132232E", this);} // tgen
aaa::GG3132232 ::GG3132232(){ note_ctor("_ZN3aaa9GG3132232E", this);} // tgen
}
static void Test__ZN3aaa9GG3132232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132232E, buf);
    ::aaa::GG3132232 *dp, &lv = *(dp=new (buf) ::aaa::GG3132232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132232E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3132232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3132232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3132232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132232E);
    dp->::aaa::GG3132232::~GG3132232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132232E(Test__ZN3aaa9GG3132232E, "_ZN3aaa9GG3132232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132232C1Ev();
extern void _ZN3aaa9GG3132232D1Ev();
Name_Map name_map__ZN3aaa9GG3132232E[] = {
  NSPAIR(_ZN3aaa9GG3132232C1Ev),
  NSPAIR(_ZN3aaa9GG3132232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3132232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132232E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31322323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31322323barEv,_ZThn20_N3aaa9GG31322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31322323barEv,_ZThn28_N3aaa9GG31322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31322323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322323barEv,_ZThn20_N3aaa9GG31322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31322323barEv,_ZThn28_N3aaa9GG31322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132232E[];
Class_Descriptor cd__ZN3aaa9GG3132232E = {  "_ZN3aaa9GG3132232E", // class name
  bases__ZN3aaa9GG3132232E, 6,
  &(vtc__ZN3aaa9GG3132232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132233  : ::aaa::EE313 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31322333fooEv
  virtual void  bar(); // _ZN3aaa9GG31322333barEv
  ~GG3132233(); // tgen
  GG3132233(); // tgen
};
//SIG(1 _ZN3aaa9GG3132233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31322333fooEv");}
void  aaa::GG3132233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31322333barEv");}
aaa::GG3132233 ::~GG3132233(){ note_dtor("_ZN3aaa9GG3132233E", this);} // tgen
aaa::GG3132233 ::GG3132233(){ note_ctor("_ZN3aaa9GG3132233E", this);} // tgen
}
static void Test__ZN3aaa9GG3132233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132233E, buf);
    ::aaa::GG3132233 *dp, &lv = *(dp=new (buf) ::aaa::GG3132233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132233E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3132233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3132233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3132233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132233E);
    dp->::aaa::GG3132233::~GG3132233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132233E(Test__ZN3aaa9GG3132233E, "_ZN3aaa9GG3132233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132233C1Ev();
extern void _ZN3aaa9GG3132233D1Ev();
Name_Map name_map__ZN3aaa9GG3132233E[] = {
  NSPAIR(_ZN3aaa9GG3132233C1Ev),
  NSPAIR(_ZN3aaa9GG3132233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3132233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132233E[];
extern void _ZN3aaa9GG31322333fooEv();
extern void _ZN3aaa9GG31322333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31322333fooEv,_ZThn8_N3aaa9GG31322333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31322333barEv,_ZThn20_N3aaa9GG31322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31322333fooEv,_ZThn20_N3aaa9GG31322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31322333barEv,_ZThn28_N3aaa9GG31322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31322333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31322333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31322333fooEv,_ZThn8_N3aaa9GG31322333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322333barEv,_ZThn20_N3aaa9GG31322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31322333fooEv,_ZThn20_N3aaa9GG31322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31322333barEv,_ZThn28_N3aaa9GG31322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132233E[];
Class_Descriptor cd__ZN3aaa9GG3132233E = {  "_ZN3aaa9GG3132233E", // class name
  bases__ZN3aaa9GG3132233E, 6,
  &(vtc__ZN3aaa9GG3132233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132311  : ::aaa::EE313 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31323113fooEv
  ~GG3132311(); // tgen
  GG3132311(); // tgen
};
//SIG(1 _ZN3aaa9GG3132311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31323113fooEv");}
aaa::GG3132311 ::~GG3132311(){ note_dtor("_ZN3aaa9GG3132311E", this);} // tgen
aaa::GG3132311 ::GG3132311(){ note_ctor("_ZN3aaa9GG3132311E", this);} // tgen
}
static void Test__ZN3aaa9GG3132311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132311E, buf);
    ::aaa::GG3132311 *dp, &lv = *(dp=new (buf) ::aaa::GG3132311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132311E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3132311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3132311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3132311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132311E);
    dp->::aaa::GG3132311::~GG3132311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132311E(Test__ZN3aaa9GG3132311E, "_ZN3aaa9GG3132311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132311C1Ev();
extern void _ZN3aaa9GG3132311D1Ev();
Name_Map name_map__ZN3aaa9GG3132311E[] = {
  NSPAIR(_ZN3aaa9GG3132311C1Ev),
  NSPAIR(_ZN3aaa9GG3132311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3132311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132311E[];
extern void _ZN3aaa9GG31323113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31323113fooEv,_ZThn8_N3aaa9GG31323113fooEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31323113fooEv,_ZThn20_N3aaa9GG31323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323113fooEv,_ZThn28_N3aaa9GG31323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31323113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31323113fooEv,_ZThn8_N3aaa9GG31323113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323113fooEv,_ZThn20_N3aaa9GG31323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323113fooEv,_ZThn28_N3aaa9GG31323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132311E[];
Class_Descriptor cd__ZN3aaa9GG3132311E = {  "_ZN3aaa9GG3132311E", // class name
  bases__ZN3aaa9GG3132311E, 6,
  &(vtc__ZN3aaa9GG3132311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132312  : ::aaa::EE313 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31323123barEv
  ~GG3132312(); // tgen
  GG3132312(); // tgen
};
//SIG(1 _ZN3aaa9GG3132312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31323123barEv");}
aaa::GG3132312 ::~GG3132312(){ note_dtor("_ZN3aaa9GG3132312E", this);} // tgen
aaa::GG3132312 ::GG3132312(){ note_ctor("_ZN3aaa9GG3132312E", this);} // tgen
}
static void Test__ZN3aaa9GG3132312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132312E, buf);
    ::aaa::GG3132312 *dp, &lv = *(dp=new (buf) ::aaa::GG3132312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132312E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3132312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3132312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3132312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132312E);
    dp->::aaa::GG3132312::~GG3132312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132312E(Test__ZN3aaa9GG3132312E, "_ZN3aaa9GG3132312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132312C1Ev();
extern void _ZN3aaa9GG3132312D1Ev();
Name_Map name_map__ZN3aaa9GG3132312E[] = {
  NSPAIR(_ZN3aaa9GG3132312C1Ev),
  NSPAIR(_ZN3aaa9GG3132312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3132312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132312E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31323123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31323123barEv,_ZThn20_N3aaa9GG31323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323123barEv,_ZThn28_N3aaa9GG31323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31323123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323123barEv,_ZThn20_N3aaa9GG31323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323123barEv,_ZThn28_N3aaa9GG31323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132312E[];
Class_Descriptor cd__ZN3aaa9GG3132312E = {  "_ZN3aaa9GG3132312E", // class name
  bases__ZN3aaa9GG3132312E, 6,
  &(vtc__ZN3aaa9GG3132312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132313  : ::aaa::EE313 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31323133fooEv
  virtual void  bar(); // _ZN3aaa9GG31323133barEv
  ~GG3132313(); // tgen
  GG3132313(); // tgen
};
//SIG(1 _ZN3aaa9GG3132313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31323133fooEv");}
void  aaa::GG3132313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31323133barEv");}
aaa::GG3132313 ::~GG3132313(){ note_dtor("_ZN3aaa9GG3132313E", this);} // tgen
aaa::GG3132313 ::GG3132313(){ note_ctor("_ZN3aaa9GG3132313E", this);} // tgen
}
static void Test__ZN3aaa9GG3132313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132313E, buf);
    ::aaa::GG3132313 *dp, &lv = *(dp=new (buf) ::aaa::GG3132313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132313E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3132313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3132313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3132313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132313E);
    dp->::aaa::GG3132313::~GG3132313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132313E(Test__ZN3aaa9GG3132313E, "_ZN3aaa9GG3132313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132313C1Ev();
extern void _ZN3aaa9GG3132313D1Ev();
Name_Map name_map__ZN3aaa9GG3132313E[] = {
  NSPAIR(_ZN3aaa9GG3132313C1Ev),
  NSPAIR(_ZN3aaa9GG3132313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3132313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132313E[];
extern void _ZN3aaa9GG31323133fooEv();
extern void _ZN3aaa9GG31323133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31323133fooEv,_ZThn8_N3aaa9GG31323133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31323133barEv,_ZThn20_N3aaa9GG31323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31323133fooEv,_ZThn20_N3aaa9GG31323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323133fooEv,_ZThn28_N3aaa9GG31323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323133barEv,_ZThn28_N3aaa9GG31323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31323133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31323133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31323133fooEv,_ZThn8_N3aaa9GG31323133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323133barEv,_ZThn20_N3aaa9GG31323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323133fooEv,_ZThn20_N3aaa9GG31323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323133fooEv,_ZThn28_N3aaa9GG31323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323133barEv,_ZThn28_N3aaa9GG31323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132313E[];
Class_Descriptor cd__ZN3aaa9GG3132313E = {  "_ZN3aaa9GG3132313E", // class name
  bases__ZN3aaa9GG3132313E, 6,
  &(vtc__ZN3aaa9GG3132313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132321  : ::aaa::EE313 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31323213fooEv
  ~GG3132321(); // tgen
  GG3132321(); // tgen
};
//SIG(1 _ZN3aaa9GG3132321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31323213fooEv");}
aaa::GG3132321 ::~GG3132321(){ note_dtor("_ZN3aaa9GG3132321E", this);} // tgen
aaa::GG3132321 ::GG3132321(){ note_ctor("_ZN3aaa9GG3132321E", this);} // tgen
}
static void Test__ZN3aaa9GG3132321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132321E, buf);
    ::aaa::GG3132321 *dp, &lv = *(dp=new (buf) ::aaa::GG3132321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132321E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3132321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3132321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3132321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132321E);
    dp->::aaa::GG3132321::~GG3132321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132321E(Test__ZN3aaa9GG3132321E, "_ZN3aaa9GG3132321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132321C1Ev();
extern void _ZN3aaa9GG3132321D1Ev();
Name_Map name_map__ZN3aaa9GG3132321E[] = {
  NSPAIR(_ZN3aaa9GG3132321C1Ev),
  NSPAIR(_ZN3aaa9GG3132321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3132321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132321E[];
extern void _ZN3aaa9GG31323213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31323213fooEv,_ZThn8_N3aaa9GG31323213fooEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31323213fooEv,_ZThn28_N3aaa9GG31323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31323213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31323213fooEv,_ZThn8_N3aaa9GG31323213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323213fooEv,_ZThn28_N3aaa9GG31323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132321E[];
Class_Descriptor cd__ZN3aaa9GG3132321E = {  "_ZN3aaa9GG3132321E", // class name
  bases__ZN3aaa9GG3132321E, 6,
  &(vtc__ZN3aaa9GG3132321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132322  : ::aaa::EE313 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31323223barEv
  ~GG3132322(); // tgen
  GG3132322(); // tgen
};
//SIG(1 _ZN3aaa9GG3132322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31323223barEv");}
aaa::GG3132322 ::~GG3132322(){ note_dtor("_ZN3aaa9GG3132322E", this);} // tgen
aaa::GG3132322 ::GG3132322(){ note_ctor("_ZN3aaa9GG3132322E", this);} // tgen
}
static void Test__ZN3aaa9GG3132322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132322E, buf);
    ::aaa::GG3132322 *dp, &lv = *(dp=new (buf) ::aaa::GG3132322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132322E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3132322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3132322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3132322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132322E);
    dp->::aaa::GG3132322::~GG3132322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132322E(Test__ZN3aaa9GG3132322E, "_ZN3aaa9GG3132322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132322C1Ev();
extern void _ZN3aaa9GG3132322D1Ev();
Name_Map name_map__ZN3aaa9GG3132322E[] = {
  NSPAIR(_ZN3aaa9GG3132322C1Ev),
  NSPAIR(_ZN3aaa9GG3132322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3132322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132322E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31323223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31323223barEv,_ZThn20_N3aaa9GG31323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31323223barEv,_ZThn28_N3aaa9GG31323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31323223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323223barEv,_ZThn20_N3aaa9GG31323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323223barEv,_ZThn28_N3aaa9GG31323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132322E[];
Class_Descriptor cd__ZN3aaa9GG3132322E = {  "_ZN3aaa9GG3132322E", // class name
  bases__ZN3aaa9GG3132322E, 6,
  &(vtc__ZN3aaa9GG3132322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132323  : ::aaa::EE313 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31323233fooEv
  virtual void  bar(); // _ZN3aaa9GG31323233barEv
  ~GG3132323(); // tgen
  GG3132323(); // tgen
};
//SIG(1 _ZN3aaa9GG3132323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31323233fooEv");}
void  aaa::GG3132323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31323233barEv");}
aaa::GG3132323 ::~GG3132323(){ note_dtor("_ZN3aaa9GG3132323E", this);} // tgen
aaa::GG3132323 ::GG3132323(){ note_ctor("_ZN3aaa9GG3132323E", this);} // tgen
}
static void Test__ZN3aaa9GG3132323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132323E, buf);
    ::aaa::GG3132323 *dp, &lv = *(dp=new (buf) ::aaa::GG3132323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132323E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3132323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3132323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3132323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132323E);
    dp->::aaa::GG3132323::~GG3132323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132323E(Test__ZN3aaa9GG3132323E, "_ZN3aaa9GG3132323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132323C1Ev();
extern void _ZN3aaa9GG3132323D1Ev();
Name_Map name_map__ZN3aaa9GG3132323E[] = {
  NSPAIR(_ZN3aaa9GG3132323C1Ev),
  NSPAIR(_ZN3aaa9GG3132323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3132323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132323E[];
extern void _ZN3aaa9GG31323233fooEv();
extern void _ZN3aaa9GG31323233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31323233fooEv,_ZThn8_N3aaa9GG31323233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31323233barEv,_ZThn20_N3aaa9GG31323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323233fooEv,_ZThn28_N3aaa9GG31323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323233barEv,_ZThn28_N3aaa9GG31323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31323233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31323233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31323233fooEv,_ZThn8_N3aaa9GG31323233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323233barEv,_ZThn20_N3aaa9GG31323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323233fooEv,_ZThn28_N3aaa9GG31323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323233barEv,_ZThn28_N3aaa9GG31323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132323E[];
Class_Descriptor cd__ZN3aaa9GG3132323E = {  "_ZN3aaa9GG3132323E", // class name
  bases__ZN3aaa9GG3132323E, 6,
  &(vtc__ZN3aaa9GG3132323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132331  : ::aaa::EE313 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31323313fooEv
  ~GG3132331(); // tgen
  GG3132331(); // tgen
};
//SIG(1 _ZN3aaa9GG3132331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31323313fooEv");}
aaa::GG3132331 ::~GG3132331(){ note_dtor("_ZN3aaa9GG3132331E", this);} // tgen
aaa::GG3132331 ::GG3132331(){ note_ctor("_ZN3aaa9GG3132331E", this);} // tgen
}
static void Test__ZN3aaa9GG3132331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132331E, buf);
    ::aaa::GG3132331 *dp, &lv = *(dp=new (buf) ::aaa::GG3132331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132331E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3132331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3132331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3132331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132331E);
    dp->::aaa::GG3132331::~GG3132331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132331E(Test__ZN3aaa9GG3132331E, "_ZN3aaa9GG3132331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132331C1Ev();
extern void _ZN3aaa9GG3132331D1Ev();
Name_Map name_map__ZN3aaa9GG3132331E[] = {
  NSPAIR(_ZN3aaa9GG3132331C1Ev),
  NSPAIR(_ZN3aaa9GG3132331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3132331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132331E[];
extern void _ZN3aaa9GG31323313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31323313fooEv,_ZThn8_N3aaa9GG31323313fooEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31323313fooEv,_ZThn20_N3aaa9GG31323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323313fooEv,_ZThn28_N3aaa9GG31323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31323313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31323313fooEv,_ZThn8_N3aaa9GG31323313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323313fooEv,_ZThn20_N3aaa9GG31323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323313fooEv,_ZThn28_N3aaa9GG31323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132331E[];
Class_Descriptor cd__ZN3aaa9GG3132331E = {  "_ZN3aaa9GG3132331E", // class name
  bases__ZN3aaa9GG3132331E, 6,
  &(vtc__ZN3aaa9GG3132331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132332  : ::aaa::EE313 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31323323barEv
  ~GG3132332(); // tgen
  GG3132332(); // tgen
};
//SIG(1 _ZN3aaa9GG3132332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3132332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31323323barEv");}
aaa::GG3132332 ::~GG3132332(){ note_dtor("_ZN3aaa9GG3132332E", this);} // tgen
aaa::GG3132332 ::GG3132332(){ note_ctor("_ZN3aaa9GG3132332E", this);} // tgen
}
static void Test__ZN3aaa9GG3132332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132332E, buf);
    ::aaa::GG3132332 *dp, &lv = *(dp=new (buf) ::aaa::GG3132332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132332E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3132332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3132332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3132332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132332E);
    dp->::aaa::GG3132332::~GG3132332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132332E(Test__ZN3aaa9GG3132332E, "_ZN3aaa9GG3132332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132332C1Ev();
extern void _ZN3aaa9GG3132332D1Ev();
Name_Map name_map__ZN3aaa9GG3132332E[] = {
  NSPAIR(_ZN3aaa9GG3132332C1Ev),
  NSPAIR(_ZN3aaa9GG3132332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3132332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132332E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31323323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31323323barEv,_ZThn20_N3aaa9GG31323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323323barEv,_ZThn28_N3aaa9GG31323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31323323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323323barEv,_ZThn20_N3aaa9GG31323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323323barEv,_ZThn28_N3aaa9GG31323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132332E[];
Class_Descriptor cd__ZN3aaa9GG3132332E = {  "_ZN3aaa9GG3132332E", // class name
  bases__ZN3aaa9GG3132332E, 6,
  &(vtc__ZN3aaa9GG3132332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3132333  : ::aaa::EE313 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31323333fooEv
  virtual void  bar(); // _ZN3aaa9GG31323333barEv
  ~GG3132333(); // tgen
  GG3132333(); // tgen
};
//SIG(1 _ZN3aaa9GG3132333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3132333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31323333fooEv");}
void  aaa::GG3132333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31323333barEv");}
aaa::GG3132333 ::~GG3132333(){ note_dtor("_ZN3aaa9GG3132333E", this);} // tgen
aaa::GG3132333 ::GG3132333(){ note_ctor("_ZN3aaa9GG3132333E", this);} // tgen
}
static void Test__ZN3aaa9GG3132333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3132333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3132333E, buf);
    ::aaa::GG3132333 *dp, &lv = *(dp=new (buf) ::aaa::GG3132333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3132333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3132333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3132333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3132333E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3132333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3132333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3132333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3132333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3132333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3132333E);
    dp->::aaa::GG3132333::~GG3132333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3132333E(Test__ZN3aaa9GG3132333E, "_ZN3aaa9GG3132333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3132333C1Ev();
extern void _ZN3aaa9GG3132333D1Ev();
Name_Map name_map__ZN3aaa9GG3132333E[] = {
  NSPAIR(_ZN3aaa9GG3132333C1Ev),
  NSPAIR(_ZN3aaa9GG3132333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3132333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3132333E[];
extern void _ZN3aaa9GG31323333fooEv();
extern void _ZN3aaa9GG31323333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31323333fooEv,_ZThn8_N3aaa9GG31323333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31323333barEv,_ZThn20_N3aaa9GG31323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31323333fooEv,_ZThn20_N3aaa9GG31323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323333fooEv,_ZThn28_N3aaa9GG31323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31323333barEv,_ZThn28_N3aaa9GG31323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3132333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31323333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31323333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31323333fooEv,_ZThn8_N3aaa9GG31323333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323333barEv,_ZThn20_N3aaa9GG31323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31323333fooEv,_ZThn20_N3aaa9GG31323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3132333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323333fooEv,_ZThn28_N3aaa9GG31323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31323333barEv,_ZThn28_N3aaa9GG31323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3132333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3132333E[];
Class_Descriptor cd__ZN3aaa9GG3132333E = {  "_ZN3aaa9GG3132333E", // class name
  bases__ZN3aaa9GG3132333E, 6,
  &(vtc__ZN3aaa9GG3132333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3132333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3132333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133111  : ::aaa::EE313 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31331113fooEv
  ~GG3133111(); // tgen
  GG3133111(); // tgen
};
//SIG(1 _ZN3aaa9GG3133111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133111 ::foo(){vfunc_called(this, "_ZN3aaa9GG31331113fooEv");}
aaa::GG3133111 ::~GG3133111(){ note_dtor("_ZN3aaa9GG3133111E", this);} // tgen
aaa::GG3133111 ::GG3133111(){ note_ctor("_ZN3aaa9GG3133111E", this);} // tgen
}
static void Test__ZN3aaa9GG3133111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133111E, buf);
    ::aaa::GG3133111 *dp, &lv = *(dp=new (buf) ::aaa::GG3133111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133111E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3133111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3133111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3133111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133111E);
    dp->::aaa::GG3133111::~GG3133111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133111E(Test__ZN3aaa9GG3133111E, "_ZN3aaa9GG3133111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133111C1Ev();
extern void _ZN3aaa9GG3133111D1Ev();
Name_Map name_map__ZN3aaa9GG3133111E[] = {
  NSPAIR(_ZN3aaa9GG3133111C1Ev),
  NSPAIR(_ZN3aaa9GG3133111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3133111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133111E[];
extern void _ZN3aaa9GG31331113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31331113fooEv,_ZThn8_N3aaa9GG31331113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331113fooEv,_ZThn20_N3aaa9GG31331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31331113fooEv,_ZThn28_N3aaa9GG31331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31331113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31331113fooEv,_ZThn8_N3aaa9GG31331113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331113fooEv,_ZThn20_N3aaa9GG31331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31331113fooEv,_ZThn28_N3aaa9GG31331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133111E[];
Class_Descriptor cd__ZN3aaa9GG3133111E = {  "_ZN3aaa9GG3133111E", // class name
  bases__ZN3aaa9GG3133111E, 6,
  &(vtc__ZN3aaa9GG3133111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133112  : ::aaa::EE313 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31331123barEv
  ~GG3133112(); // tgen
  GG3133112(); // tgen
};
//SIG(1 _ZN3aaa9GG3133112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133112 ::bar(){vfunc_called(this, "_ZN3aaa9GG31331123barEv");}
aaa::GG3133112 ::~GG3133112(){ note_dtor("_ZN3aaa9GG3133112E", this);} // tgen
aaa::GG3133112 ::GG3133112(){ note_ctor("_ZN3aaa9GG3133112E", this);} // tgen
}
static void Test__ZN3aaa9GG3133112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133112E, buf);
    ::aaa::GG3133112 *dp, &lv = *(dp=new (buf) ::aaa::GG3133112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133112E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3133112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3133112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3133112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133112E);
    dp->::aaa::GG3133112::~GG3133112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133112E(Test__ZN3aaa9GG3133112E, "_ZN3aaa9GG3133112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133112C1Ev();
extern void _ZN3aaa9GG3133112D1Ev();
Name_Map name_map__ZN3aaa9GG3133112E[] = {
  NSPAIR(_ZN3aaa9GG3133112C1Ev),
  NSPAIR(_ZN3aaa9GG3133112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3133112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133112E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31331123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31331123barEv,_ZThn20_N3aaa9GG31331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31331123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331123barEv,_ZThn20_N3aaa9GG31331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133112E[];
Class_Descriptor cd__ZN3aaa9GG3133112E = {  "_ZN3aaa9GG3133112E", // class name
  bases__ZN3aaa9GG3133112E, 6,
  &(vtc__ZN3aaa9GG3133112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133113  : ::aaa::EE313 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31331133fooEv
  virtual void  bar(); // _ZN3aaa9GG31331133barEv
  ~GG3133113(); // tgen
  GG3133113(); // tgen
};
//SIG(1 _ZN3aaa9GG3133113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133113 ::foo(){vfunc_called(this, "_ZN3aaa9GG31331133fooEv");}
void  aaa::GG3133113 ::bar(){vfunc_called(this, "_ZN3aaa9GG31331133barEv");}
aaa::GG3133113 ::~GG3133113(){ note_dtor("_ZN3aaa9GG3133113E", this);} // tgen
aaa::GG3133113 ::GG3133113(){ note_ctor("_ZN3aaa9GG3133113E", this);} // tgen
}
static void Test__ZN3aaa9GG3133113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133113E, buf);
    ::aaa::GG3133113 *dp, &lv = *(dp=new (buf) ::aaa::GG3133113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133113E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3133113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3133113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3133113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133113E);
    dp->::aaa::GG3133113::~GG3133113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133113E(Test__ZN3aaa9GG3133113E, "_ZN3aaa9GG3133113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133113C1Ev();
extern void _ZN3aaa9GG3133113D1Ev();
Name_Map name_map__ZN3aaa9GG3133113E[] = {
  NSPAIR(_ZN3aaa9GG3133113C1Ev),
  NSPAIR(_ZN3aaa9GG3133113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3133113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133113E[];
extern void _ZN3aaa9GG31331133fooEv();
extern void _ZN3aaa9GG31331133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31331133fooEv,_ZThn8_N3aaa9GG31331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331133fooEv,_ZThn20_N3aaa9GG31331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331133barEv,_ZThn20_N3aaa9GG31331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31331133fooEv,_ZThn28_N3aaa9GG31331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31331133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31331133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31331133fooEv,_ZThn8_N3aaa9GG31331133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331133fooEv,_ZThn20_N3aaa9GG31331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331133barEv,_ZThn20_N3aaa9GG31331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31331133fooEv,_ZThn28_N3aaa9GG31331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133113E[];
Class_Descriptor cd__ZN3aaa9GG3133113E = {  "_ZN3aaa9GG3133113E", // class name
  bases__ZN3aaa9GG3133113E, 6,
  &(vtc__ZN3aaa9GG3133113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133121  : ::aaa::EE313 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31331213fooEv
  ~GG3133121(); // tgen
  GG3133121(); // tgen
};
//SIG(1 _ZN3aaa9GG3133121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133121 ::foo(){vfunc_called(this, "_ZN3aaa9GG31331213fooEv");}
aaa::GG3133121 ::~GG3133121(){ note_dtor("_ZN3aaa9GG3133121E", this);} // tgen
aaa::GG3133121 ::GG3133121(){ note_ctor("_ZN3aaa9GG3133121E", this);} // tgen
}
static void Test__ZN3aaa9GG3133121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133121E, buf);
    ::aaa::GG3133121 *dp, &lv = *(dp=new (buf) ::aaa::GG3133121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133121E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3133121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3133121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3133121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133121E);
    dp->::aaa::GG3133121::~GG3133121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133121E(Test__ZN3aaa9GG3133121E, "_ZN3aaa9GG3133121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133121C1Ev();
extern void _ZN3aaa9GG3133121D1Ev();
Name_Map name_map__ZN3aaa9GG3133121E[] = {
  NSPAIR(_ZN3aaa9GG3133121C1Ev),
  NSPAIR(_ZN3aaa9GG3133121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3133121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133121E[];
extern void _ZN3aaa9GG31331213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31331213fooEv,_ZThn8_N3aaa9GG31331213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331213fooEv,_ZThn20_N3aaa9GG31331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31331213fooEv,_ZThn28_N3aaa9GG31331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31331213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31331213fooEv,_ZThn8_N3aaa9GG31331213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331213fooEv,_ZThn20_N3aaa9GG31331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31331213fooEv,_ZThn28_N3aaa9GG31331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133121E[];
Class_Descriptor cd__ZN3aaa9GG3133121E = {  "_ZN3aaa9GG3133121E", // class name
  bases__ZN3aaa9GG3133121E, 6,
  &(vtc__ZN3aaa9GG3133121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133122  : ::aaa::EE313 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31331223barEv
  ~GG3133122(); // tgen
  GG3133122(); // tgen
};
//SIG(1 _ZN3aaa9GG3133122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133122 ::bar(){vfunc_called(this, "_ZN3aaa9GG31331223barEv");}
aaa::GG3133122 ::~GG3133122(){ note_dtor("_ZN3aaa9GG3133122E", this);} // tgen
aaa::GG3133122 ::GG3133122(){ note_ctor("_ZN3aaa9GG3133122E", this);} // tgen
}
static void Test__ZN3aaa9GG3133122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133122E, buf);
    ::aaa::GG3133122 *dp, &lv = *(dp=new (buf) ::aaa::GG3133122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133122E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3133122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3133122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3133122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133122E);
    dp->::aaa::GG3133122::~GG3133122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133122E(Test__ZN3aaa9GG3133122E, "_ZN3aaa9GG3133122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133122C1Ev();
extern void _ZN3aaa9GG3133122D1Ev();
Name_Map name_map__ZN3aaa9GG3133122E[] = {
  NSPAIR(_ZN3aaa9GG3133122C1Ev),
  NSPAIR(_ZN3aaa9GG3133122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3133122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133122E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31331223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31331223barEv,_ZThn20_N3aaa9GG31331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31331223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331223barEv,_ZThn20_N3aaa9GG31331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133122E[];
Class_Descriptor cd__ZN3aaa9GG3133122E = {  "_ZN3aaa9GG3133122E", // class name
  bases__ZN3aaa9GG3133122E, 6,
  &(vtc__ZN3aaa9GG3133122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133123  : ::aaa::EE313 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31331233fooEv
  virtual void  bar(); // _ZN3aaa9GG31331233barEv
  ~GG3133123(); // tgen
  GG3133123(); // tgen
};
//SIG(1 _ZN3aaa9GG3133123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133123 ::foo(){vfunc_called(this, "_ZN3aaa9GG31331233fooEv");}
void  aaa::GG3133123 ::bar(){vfunc_called(this, "_ZN3aaa9GG31331233barEv");}
aaa::GG3133123 ::~GG3133123(){ note_dtor("_ZN3aaa9GG3133123E", this);} // tgen
aaa::GG3133123 ::GG3133123(){ note_ctor("_ZN3aaa9GG3133123E", this);} // tgen
}
static void Test__ZN3aaa9GG3133123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133123E, buf);
    ::aaa::GG3133123 *dp, &lv = *(dp=new (buf) ::aaa::GG3133123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133123E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3133123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3133123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3133123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133123E);
    dp->::aaa::GG3133123::~GG3133123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133123E(Test__ZN3aaa9GG3133123E, "_ZN3aaa9GG3133123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133123C1Ev();
extern void _ZN3aaa9GG3133123D1Ev();
Name_Map name_map__ZN3aaa9GG3133123E[] = {
  NSPAIR(_ZN3aaa9GG3133123C1Ev),
  NSPAIR(_ZN3aaa9GG3133123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3133123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133123E[];
extern void _ZN3aaa9GG31331233fooEv();
extern void _ZN3aaa9GG31331233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31331233fooEv,_ZThn8_N3aaa9GG31331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331233fooEv,_ZThn20_N3aaa9GG31331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331233barEv,_ZThn20_N3aaa9GG31331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31331233fooEv,_ZThn28_N3aaa9GG31331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31331233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31331233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31331233fooEv,_ZThn8_N3aaa9GG31331233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331233fooEv,_ZThn20_N3aaa9GG31331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331233barEv,_ZThn20_N3aaa9GG31331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31331233fooEv,_ZThn28_N3aaa9GG31331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133123E[];
Class_Descriptor cd__ZN3aaa9GG3133123E = {  "_ZN3aaa9GG3133123E", // class name
  bases__ZN3aaa9GG3133123E, 6,
  &(vtc__ZN3aaa9GG3133123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133131  : ::aaa::EE313 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31331313fooEv
  ~GG3133131(); // tgen
  GG3133131(); // tgen
};
//SIG(1 _ZN3aaa9GG3133131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133131 ::foo(){vfunc_called(this, "_ZN3aaa9GG31331313fooEv");}
aaa::GG3133131 ::~GG3133131(){ note_dtor("_ZN3aaa9GG3133131E", this);} // tgen
aaa::GG3133131 ::GG3133131(){ note_ctor("_ZN3aaa9GG3133131E", this);} // tgen
}
static void Test__ZN3aaa9GG3133131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133131E, buf);
    ::aaa::GG3133131 *dp, &lv = *(dp=new (buf) ::aaa::GG3133131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133131E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3133131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3133131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3133131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133131E);
    dp->::aaa::GG3133131::~GG3133131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133131E(Test__ZN3aaa9GG3133131E, "_ZN3aaa9GG3133131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133131C1Ev();
extern void _ZN3aaa9GG3133131D1Ev();
Name_Map name_map__ZN3aaa9GG3133131E[] = {
  NSPAIR(_ZN3aaa9GG3133131C1Ev),
  NSPAIR(_ZN3aaa9GG3133131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3133131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133131E[];
extern void _ZN3aaa9GG31331313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31331313fooEv,_ZThn8_N3aaa9GG31331313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331313fooEv,_ZThn20_N3aaa9GG31331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31331313fooEv,_ZThn28_N3aaa9GG31331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31331313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31331313fooEv,_ZThn8_N3aaa9GG31331313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331313fooEv,_ZThn20_N3aaa9GG31331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31331313fooEv,_ZThn28_N3aaa9GG31331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133131E[];
Class_Descriptor cd__ZN3aaa9GG3133131E = {  "_ZN3aaa9GG3133131E", // class name
  bases__ZN3aaa9GG3133131E, 6,
  &(vtc__ZN3aaa9GG3133131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133132  : ::aaa::EE313 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31331323barEv
  ~GG3133132(); // tgen
  GG3133132(); // tgen
};
//SIG(1 _ZN3aaa9GG3133132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133132 ::bar(){vfunc_called(this, "_ZN3aaa9GG31331323barEv");}
aaa::GG3133132 ::~GG3133132(){ note_dtor("_ZN3aaa9GG3133132E", this);} // tgen
aaa::GG3133132 ::GG3133132(){ note_ctor("_ZN3aaa9GG3133132E", this);} // tgen
}
static void Test__ZN3aaa9GG3133132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133132E, buf);
    ::aaa::GG3133132 *dp, &lv = *(dp=new (buf) ::aaa::GG3133132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133132E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3133132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3133132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3133132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133132E);
    dp->::aaa::GG3133132::~GG3133132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133132E(Test__ZN3aaa9GG3133132E, "_ZN3aaa9GG3133132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133132C1Ev();
extern void _ZN3aaa9GG3133132D1Ev();
Name_Map name_map__ZN3aaa9GG3133132E[] = {
  NSPAIR(_ZN3aaa9GG3133132C1Ev),
  NSPAIR(_ZN3aaa9GG3133132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3133132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133132E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31331323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31331323barEv,_ZThn20_N3aaa9GG31331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31331323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331323barEv,_ZThn20_N3aaa9GG31331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133132E[];
Class_Descriptor cd__ZN3aaa9GG3133132E = {  "_ZN3aaa9GG3133132E", // class name
  bases__ZN3aaa9GG3133132E, 6,
  &(vtc__ZN3aaa9GG3133132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133133  : ::aaa::EE313 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31331333fooEv
  virtual void  bar(); // _ZN3aaa9GG31331333barEv
  ~GG3133133(); // tgen
  GG3133133(); // tgen
};
//SIG(1 _ZN3aaa9GG3133133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133133 ::foo(){vfunc_called(this, "_ZN3aaa9GG31331333fooEv");}
void  aaa::GG3133133 ::bar(){vfunc_called(this, "_ZN3aaa9GG31331333barEv");}
aaa::GG3133133 ::~GG3133133(){ note_dtor("_ZN3aaa9GG3133133E", this);} // tgen
aaa::GG3133133 ::GG3133133(){ note_ctor("_ZN3aaa9GG3133133E", this);} // tgen
}
static void Test__ZN3aaa9GG3133133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133133E, buf);
    ::aaa::GG3133133 *dp, &lv = *(dp=new (buf) ::aaa::GG3133133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133133E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3133133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3133133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3133133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133133E);
    dp->::aaa::GG3133133::~GG3133133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133133E(Test__ZN3aaa9GG3133133E, "_ZN3aaa9GG3133133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133133C1Ev();
extern void _ZN3aaa9GG3133133D1Ev();
Name_Map name_map__ZN3aaa9GG3133133E[] = {
  NSPAIR(_ZN3aaa9GG3133133C1Ev),
  NSPAIR(_ZN3aaa9GG3133133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3133133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133133E[];
extern void _ZN3aaa9GG31331333fooEv();
extern void _ZN3aaa9GG31331333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31331333fooEv,_ZThn8_N3aaa9GG31331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331333fooEv,_ZThn20_N3aaa9GG31331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31331333barEv,_ZThn20_N3aaa9GG31331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31331333fooEv,_ZThn28_N3aaa9GG31331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31331333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31331333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31331333fooEv,_ZThn8_N3aaa9GG31331333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331333fooEv,_ZThn20_N3aaa9GG31331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31331333barEv,_ZThn20_N3aaa9GG31331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31331333fooEv,_ZThn28_N3aaa9GG31331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133133E[];
Class_Descriptor cd__ZN3aaa9GG3133133E = {  "_ZN3aaa9GG3133133E", // class name
  bases__ZN3aaa9GG3133133E, 6,
  &(vtc__ZN3aaa9GG3133133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133211  : ::aaa::EE313 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31332113fooEv
  ~GG3133211(); // tgen
  GG3133211(); // tgen
};
//SIG(1 _ZN3aaa9GG3133211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133211 ::foo(){vfunc_called(this, "_ZN3aaa9GG31332113fooEv");}
aaa::GG3133211 ::~GG3133211(){ note_dtor("_ZN3aaa9GG3133211E", this);} // tgen
aaa::GG3133211 ::GG3133211(){ note_ctor("_ZN3aaa9GG3133211E", this);} // tgen
}
static void Test__ZN3aaa9GG3133211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133211E, buf);
    ::aaa::GG3133211 *dp, &lv = *(dp=new (buf) ::aaa::GG3133211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133211E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133211E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3133211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3133211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3133211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133211E);
    dp->::aaa::GG3133211::~GG3133211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133211E(Test__ZN3aaa9GG3133211E, "_ZN3aaa9GG3133211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133211C1Ev();
extern void _ZN3aaa9GG3133211D1Ev();
Name_Map name_map__ZN3aaa9GG3133211E[] = {
  NSPAIR(_ZN3aaa9GG3133211C1Ev),
  NSPAIR(_ZN3aaa9GG3133211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3133211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133211E[];
extern void _ZN3aaa9GG31332113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31332113fooEv,_ZThn8_N3aaa9GG31332113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332113fooEv,_ZThn20_N3aaa9GG31332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31332113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31332113fooEv,_ZThn8_N3aaa9GG31332113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332113fooEv,_ZThn20_N3aaa9GG31332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133211E[];
Class_Descriptor cd__ZN3aaa9GG3133211E = {  "_ZN3aaa9GG3133211E", // class name
  bases__ZN3aaa9GG3133211E, 6,
  &(vtc__ZN3aaa9GG3133211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133212  : ::aaa::EE313 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31332123barEv
  ~GG3133212(); // tgen
  GG3133212(); // tgen
};
//SIG(1 _ZN3aaa9GG3133212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133212 ::bar(){vfunc_called(this, "_ZN3aaa9GG31332123barEv");}
aaa::GG3133212 ::~GG3133212(){ note_dtor("_ZN3aaa9GG3133212E", this);} // tgen
aaa::GG3133212 ::GG3133212(){ note_ctor("_ZN3aaa9GG3133212E", this);} // tgen
}
static void Test__ZN3aaa9GG3133212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133212E, buf);
    ::aaa::GG3133212 *dp, &lv = *(dp=new (buf) ::aaa::GG3133212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133212E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133212E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3133212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3133212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3133212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133212E);
    dp->::aaa::GG3133212::~GG3133212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133212E(Test__ZN3aaa9GG3133212E, "_ZN3aaa9GG3133212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133212C1Ev();
extern void _ZN3aaa9GG3133212D1Ev();
Name_Map name_map__ZN3aaa9GG3133212E[] = {
  NSPAIR(_ZN3aaa9GG3133212C1Ev),
  NSPAIR(_ZN3aaa9GG3133212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3133212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133212E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31332123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31332123barEv,_ZThn20_N3aaa9GG31332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31332123barEv,_ZThn28_N3aaa9GG31332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31332123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332123barEv,_ZThn20_N3aaa9GG31332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31332123barEv,_ZThn28_N3aaa9GG31332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133212E[];
Class_Descriptor cd__ZN3aaa9GG3133212E = {  "_ZN3aaa9GG3133212E", // class name
  bases__ZN3aaa9GG3133212E, 6,
  &(vtc__ZN3aaa9GG3133212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133213  : ::aaa::EE313 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31332133fooEv
  virtual void  bar(); // _ZN3aaa9GG31332133barEv
  ~GG3133213(); // tgen
  GG3133213(); // tgen
};
//SIG(1 _ZN3aaa9GG3133213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133213 ::foo(){vfunc_called(this, "_ZN3aaa9GG31332133fooEv");}
void  aaa::GG3133213 ::bar(){vfunc_called(this, "_ZN3aaa9GG31332133barEv");}
aaa::GG3133213 ::~GG3133213(){ note_dtor("_ZN3aaa9GG3133213E", this);} // tgen
aaa::GG3133213 ::GG3133213(){ note_ctor("_ZN3aaa9GG3133213E", this);} // tgen
}
static void Test__ZN3aaa9GG3133213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133213E, buf);
    ::aaa::GG3133213 *dp, &lv = *(dp=new (buf) ::aaa::GG3133213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133213E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133213E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3133213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3133213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3133213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133213E);
    dp->::aaa::GG3133213::~GG3133213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133213E(Test__ZN3aaa9GG3133213E, "_ZN3aaa9GG3133213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133213C1Ev();
extern void _ZN3aaa9GG3133213D1Ev();
Name_Map name_map__ZN3aaa9GG3133213E[] = {
  NSPAIR(_ZN3aaa9GG3133213C1Ev),
  NSPAIR(_ZN3aaa9GG3133213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3133213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133213E[];
extern void _ZN3aaa9GG31332133fooEv();
extern void _ZN3aaa9GG31332133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31332133fooEv,_ZThn8_N3aaa9GG31332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332133fooEv,_ZThn20_N3aaa9GG31332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332133barEv,_ZThn20_N3aaa9GG31332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31332133barEv,_ZThn28_N3aaa9GG31332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31332133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31332133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31332133fooEv,_ZThn8_N3aaa9GG31332133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332133fooEv,_ZThn20_N3aaa9GG31332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332133barEv,_ZThn20_N3aaa9GG31332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31332133barEv,_ZThn28_N3aaa9GG31332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133213E[];
Class_Descriptor cd__ZN3aaa9GG3133213E = {  "_ZN3aaa9GG3133213E", // class name
  bases__ZN3aaa9GG3133213E, 6,
  &(vtc__ZN3aaa9GG3133213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133221  : ::aaa::EE313 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31332213fooEv
  ~GG3133221(); // tgen
  GG3133221(); // tgen
};
//SIG(1 _ZN3aaa9GG3133221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133221 ::foo(){vfunc_called(this, "_ZN3aaa9GG31332213fooEv");}
aaa::GG3133221 ::~GG3133221(){ note_dtor("_ZN3aaa9GG3133221E", this);} // tgen
aaa::GG3133221 ::GG3133221(){ note_ctor("_ZN3aaa9GG3133221E", this);} // tgen
}
static void Test__ZN3aaa9GG3133221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133221E, buf);
    ::aaa::GG3133221 *dp, &lv = *(dp=new (buf) ::aaa::GG3133221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133221E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133221E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3133221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3133221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3133221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133221E);
    dp->::aaa::GG3133221::~GG3133221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133221E(Test__ZN3aaa9GG3133221E, "_ZN3aaa9GG3133221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133221C1Ev();
extern void _ZN3aaa9GG3133221D1Ev();
Name_Map name_map__ZN3aaa9GG3133221E[] = {
  NSPAIR(_ZN3aaa9GG3133221C1Ev),
  NSPAIR(_ZN3aaa9GG3133221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3133221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133221E[];
extern void _ZN3aaa9GG31332213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31332213fooEv,_ZThn8_N3aaa9GG31332213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332213fooEv,_ZThn20_N3aaa9GG31332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31332213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31332213fooEv,_ZThn8_N3aaa9GG31332213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332213fooEv,_ZThn20_N3aaa9GG31332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133221E[];
Class_Descriptor cd__ZN3aaa9GG3133221E = {  "_ZN3aaa9GG3133221E", // class name
  bases__ZN3aaa9GG3133221E, 6,
  &(vtc__ZN3aaa9GG3133221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133222  : ::aaa::EE313 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31332223barEv
  ~GG3133222(); // tgen
  GG3133222(); // tgen
};
//SIG(1 _ZN3aaa9GG3133222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133222 ::bar(){vfunc_called(this, "_ZN3aaa9GG31332223barEv");}
aaa::GG3133222 ::~GG3133222(){ note_dtor("_ZN3aaa9GG3133222E", this);} // tgen
aaa::GG3133222 ::GG3133222(){ note_ctor("_ZN3aaa9GG3133222E", this);} // tgen
}
static void Test__ZN3aaa9GG3133222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133222E, buf);
    ::aaa::GG3133222 *dp, &lv = *(dp=new (buf) ::aaa::GG3133222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133222E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133222E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3133222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3133222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3133222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133222E);
    dp->::aaa::GG3133222::~GG3133222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133222E(Test__ZN3aaa9GG3133222E, "_ZN3aaa9GG3133222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133222C1Ev();
extern void _ZN3aaa9GG3133222D1Ev();
Name_Map name_map__ZN3aaa9GG3133222E[] = {
  NSPAIR(_ZN3aaa9GG3133222C1Ev),
  NSPAIR(_ZN3aaa9GG3133222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3133222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133222E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31332223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31332223barEv,_ZThn20_N3aaa9GG31332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31332223barEv,_ZThn28_N3aaa9GG31332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31332223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332223barEv,_ZThn20_N3aaa9GG31332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31332223barEv,_ZThn28_N3aaa9GG31332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133222E[];
Class_Descriptor cd__ZN3aaa9GG3133222E = {  "_ZN3aaa9GG3133222E", // class name
  bases__ZN3aaa9GG3133222E, 6,
  &(vtc__ZN3aaa9GG3133222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133223  : ::aaa::EE313 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31332233fooEv
  virtual void  bar(); // _ZN3aaa9GG31332233barEv
  ~GG3133223(); // tgen
  GG3133223(); // tgen
};
//SIG(1 _ZN3aaa9GG3133223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133223 ::foo(){vfunc_called(this, "_ZN3aaa9GG31332233fooEv");}
void  aaa::GG3133223 ::bar(){vfunc_called(this, "_ZN3aaa9GG31332233barEv");}
aaa::GG3133223 ::~GG3133223(){ note_dtor("_ZN3aaa9GG3133223E", this);} // tgen
aaa::GG3133223 ::GG3133223(){ note_ctor("_ZN3aaa9GG3133223E", this);} // tgen
}
static void Test__ZN3aaa9GG3133223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133223E, buf);
    ::aaa::GG3133223 *dp, &lv = *(dp=new (buf) ::aaa::GG3133223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133223E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133223E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3133223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3133223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3133223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133223E);
    dp->::aaa::GG3133223::~GG3133223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133223E(Test__ZN3aaa9GG3133223E, "_ZN3aaa9GG3133223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133223C1Ev();
extern void _ZN3aaa9GG3133223D1Ev();
Name_Map name_map__ZN3aaa9GG3133223E[] = {
  NSPAIR(_ZN3aaa9GG3133223C1Ev),
  NSPAIR(_ZN3aaa9GG3133223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3133223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133223E[];
extern void _ZN3aaa9GG31332233fooEv();
extern void _ZN3aaa9GG31332233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31332233fooEv,_ZThn8_N3aaa9GG31332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332233fooEv,_ZThn20_N3aaa9GG31332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332233barEv,_ZThn20_N3aaa9GG31332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31332233barEv,_ZThn28_N3aaa9GG31332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31332233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31332233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31332233fooEv,_ZThn8_N3aaa9GG31332233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332233fooEv,_ZThn20_N3aaa9GG31332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332233barEv,_ZThn20_N3aaa9GG31332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31332233barEv,_ZThn28_N3aaa9GG31332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133223E[];
Class_Descriptor cd__ZN3aaa9GG3133223E = {  "_ZN3aaa9GG3133223E", // class name
  bases__ZN3aaa9GG3133223E, 6,
  &(vtc__ZN3aaa9GG3133223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133231  : ::aaa::EE313 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31332313fooEv
  ~GG3133231(); // tgen
  GG3133231(); // tgen
};
//SIG(1 _ZN3aaa9GG3133231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133231 ::foo(){vfunc_called(this, "_ZN3aaa9GG31332313fooEv");}
aaa::GG3133231 ::~GG3133231(){ note_dtor("_ZN3aaa9GG3133231E", this);} // tgen
aaa::GG3133231 ::GG3133231(){ note_ctor("_ZN3aaa9GG3133231E", this);} // tgen
}
static void Test__ZN3aaa9GG3133231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133231E, buf);
    ::aaa::GG3133231 *dp, &lv = *(dp=new (buf) ::aaa::GG3133231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133231E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133231E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3133231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3133231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3133231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133231E);
    dp->::aaa::GG3133231::~GG3133231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133231E(Test__ZN3aaa9GG3133231E, "_ZN3aaa9GG3133231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133231C1Ev();
extern void _ZN3aaa9GG3133231D1Ev();
Name_Map name_map__ZN3aaa9GG3133231E[] = {
  NSPAIR(_ZN3aaa9GG3133231C1Ev),
  NSPAIR(_ZN3aaa9GG3133231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3133231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133231E[];
extern void _ZN3aaa9GG31332313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31332313fooEv,_ZThn8_N3aaa9GG31332313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332313fooEv,_ZThn20_N3aaa9GG31332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31332313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31332313fooEv,_ZThn8_N3aaa9GG31332313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332313fooEv,_ZThn20_N3aaa9GG31332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133231E[];
Class_Descriptor cd__ZN3aaa9GG3133231E = {  "_ZN3aaa9GG3133231E", // class name
  bases__ZN3aaa9GG3133231E, 6,
  &(vtc__ZN3aaa9GG3133231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133232  : ::aaa::EE313 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31332323barEv
  ~GG3133232(); // tgen
  GG3133232(); // tgen
};
//SIG(1 _ZN3aaa9GG3133232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133232 ::bar(){vfunc_called(this, "_ZN3aaa9GG31332323barEv");}
aaa::GG3133232 ::~GG3133232(){ note_dtor("_ZN3aaa9GG3133232E", this);} // tgen
aaa::GG3133232 ::GG3133232(){ note_ctor("_ZN3aaa9GG3133232E", this);} // tgen
}
static void Test__ZN3aaa9GG3133232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133232E, buf);
    ::aaa::GG3133232 *dp, &lv = *(dp=new (buf) ::aaa::GG3133232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133232E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133232E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3133232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3133232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3133232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133232E);
    dp->::aaa::GG3133232::~GG3133232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133232E(Test__ZN3aaa9GG3133232E, "_ZN3aaa9GG3133232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133232C1Ev();
extern void _ZN3aaa9GG3133232D1Ev();
Name_Map name_map__ZN3aaa9GG3133232E[] = {
  NSPAIR(_ZN3aaa9GG3133232C1Ev),
  NSPAIR(_ZN3aaa9GG3133232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3133232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133232E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31332323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31332323barEv,_ZThn20_N3aaa9GG31332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31332323barEv,_ZThn28_N3aaa9GG31332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31332323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332323barEv,_ZThn20_N3aaa9GG31332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31332323barEv,_ZThn28_N3aaa9GG31332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133232E[];
Class_Descriptor cd__ZN3aaa9GG3133232E = {  "_ZN3aaa9GG3133232E", // class name
  bases__ZN3aaa9GG3133232E, 6,
  &(vtc__ZN3aaa9GG3133232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133233  : ::aaa::EE313 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31332333fooEv
  virtual void  bar(); // _ZN3aaa9GG31332333barEv
  ~GG3133233(); // tgen
  GG3133233(); // tgen
};
//SIG(1 _ZN3aaa9GG3133233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133233 ::foo(){vfunc_called(this, "_ZN3aaa9GG31332333fooEv");}
void  aaa::GG3133233 ::bar(){vfunc_called(this, "_ZN3aaa9GG31332333barEv");}
aaa::GG3133233 ::~GG3133233(){ note_dtor("_ZN3aaa9GG3133233E", this);} // tgen
aaa::GG3133233 ::GG3133233(){ note_ctor("_ZN3aaa9GG3133233E", this);} // tgen
}
static void Test__ZN3aaa9GG3133233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133233E, buf);
    ::aaa::GG3133233 *dp, &lv = *(dp=new (buf) ::aaa::GG3133233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133233E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133233E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3133233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3133233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3133233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133233E);
    dp->::aaa::GG3133233::~GG3133233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133233E(Test__ZN3aaa9GG3133233E, "_ZN3aaa9GG3133233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133233C1Ev();
extern void _ZN3aaa9GG3133233D1Ev();
Name_Map name_map__ZN3aaa9GG3133233E[] = {
  NSPAIR(_ZN3aaa9GG3133233C1Ev),
  NSPAIR(_ZN3aaa9GG3133233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3133233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133233E[];
extern void _ZN3aaa9GG31332333fooEv();
extern void _ZN3aaa9GG31332333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31332333fooEv,_ZThn8_N3aaa9GG31332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332333fooEv,_ZThn20_N3aaa9GG31332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31332333barEv,_ZThn20_N3aaa9GG31332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31332333barEv,_ZThn28_N3aaa9GG31332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31332333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31332333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31332333fooEv,_ZThn8_N3aaa9GG31332333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332333fooEv,_ZThn20_N3aaa9GG31332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31332333barEv,_ZThn20_N3aaa9GG31332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31332333barEv,_ZThn28_N3aaa9GG31332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133233E[];
Class_Descriptor cd__ZN3aaa9GG3133233E = {  "_ZN3aaa9GG3133233E", // class name
  bases__ZN3aaa9GG3133233E, 6,
  &(vtc__ZN3aaa9GG3133233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133311  : ::aaa::EE313 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31333113fooEv
  ~GG3133311(); // tgen
  GG3133311(); // tgen
};
//SIG(1 _ZN3aaa9GG3133311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133311 ::foo(){vfunc_called(this, "_ZN3aaa9GG31333113fooEv");}
aaa::GG3133311 ::~GG3133311(){ note_dtor("_ZN3aaa9GG3133311E", this);} // tgen
aaa::GG3133311 ::GG3133311(){ note_ctor("_ZN3aaa9GG3133311E", this);} // tgen
}
static void Test__ZN3aaa9GG3133311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133311E, buf);
    ::aaa::GG3133311 *dp, &lv = *(dp=new (buf) ::aaa::GG3133311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133311E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133311E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3133311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3133311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3133311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133311E);
    dp->::aaa::GG3133311::~GG3133311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133311E(Test__ZN3aaa9GG3133311E, "_ZN3aaa9GG3133311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133311C1Ev();
extern void _ZN3aaa9GG3133311D1Ev();
Name_Map name_map__ZN3aaa9GG3133311E[] = {
  NSPAIR(_ZN3aaa9GG3133311C1Ev),
  NSPAIR(_ZN3aaa9GG3133311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3133311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133311E[];
extern void _ZN3aaa9GG31333113fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31333113fooEv,_ZThn8_N3aaa9GG31333113fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333113fooEv,_ZThn20_N3aaa9GG31333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31333113fooEv,_ZThn28_N3aaa9GG31333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31333113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31333113fooEv,_ZThn8_N3aaa9GG31333113fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333113fooEv,_ZThn20_N3aaa9GG31333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333113fooEv,_ZThn28_N3aaa9GG31333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133311E[];
Class_Descriptor cd__ZN3aaa9GG3133311E = {  "_ZN3aaa9GG3133311E", // class name
  bases__ZN3aaa9GG3133311E, 6,
  &(vtc__ZN3aaa9GG3133311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133312  : ::aaa::EE313 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31333123barEv
  ~GG3133312(); // tgen
  GG3133312(); // tgen
};
//SIG(1 _ZN3aaa9GG3133312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133312 ::bar(){vfunc_called(this, "_ZN3aaa9GG31333123barEv");}
aaa::GG3133312 ::~GG3133312(){ note_dtor("_ZN3aaa9GG3133312E", this);} // tgen
aaa::GG3133312 ::GG3133312(){ note_ctor("_ZN3aaa9GG3133312E", this);} // tgen
}
static void Test__ZN3aaa9GG3133312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133312E, buf);
    ::aaa::GG3133312 *dp, &lv = *(dp=new (buf) ::aaa::GG3133312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133312E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133312E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3133312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3133312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3133312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133312E);
    dp->::aaa::GG3133312::~GG3133312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133312E(Test__ZN3aaa9GG3133312E, "_ZN3aaa9GG3133312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133312C1Ev();
extern void _ZN3aaa9GG3133312D1Ev();
Name_Map name_map__ZN3aaa9GG3133312E[] = {
  NSPAIR(_ZN3aaa9GG3133312C1Ev),
  NSPAIR(_ZN3aaa9GG3133312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3133312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133312E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31333123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31333123barEv,_ZThn20_N3aaa9GG31333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31333123barEv,_ZThn28_N3aaa9GG31333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31333123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333123barEv,_ZThn20_N3aaa9GG31333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333123barEv,_ZThn28_N3aaa9GG31333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133312E[];
Class_Descriptor cd__ZN3aaa9GG3133312E = {  "_ZN3aaa9GG3133312E", // class name
  bases__ZN3aaa9GG3133312E, 6,
  &(vtc__ZN3aaa9GG3133312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133313  : ::aaa::EE313 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31333133fooEv
  virtual void  bar(); // _ZN3aaa9GG31333133barEv
  ~GG3133313(); // tgen
  GG3133313(); // tgen
};
//SIG(1 _ZN3aaa9GG3133313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133313 ::foo(){vfunc_called(this, "_ZN3aaa9GG31333133fooEv");}
void  aaa::GG3133313 ::bar(){vfunc_called(this, "_ZN3aaa9GG31333133barEv");}
aaa::GG3133313 ::~GG3133313(){ note_dtor("_ZN3aaa9GG3133313E", this);} // tgen
aaa::GG3133313 ::GG3133313(){ note_ctor("_ZN3aaa9GG3133313E", this);} // tgen
}
static void Test__ZN3aaa9GG3133313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133313E, buf);
    ::aaa::GG3133313 *dp, &lv = *(dp=new (buf) ::aaa::GG3133313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133313E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133313E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3133313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3133313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3133313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133313E);
    dp->::aaa::GG3133313::~GG3133313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133313E(Test__ZN3aaa9GG3133313E, "_ZN3aaa9GG3133313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133313C1Ev();
extern void _ZN3aaa9GG3133313D1Ev();
Name_Map name_map__ZN3aaa9GG3133313E[] = {
  NSPAIR(_ZN3aaa9GG3133313C1Ev),
  NSPAIR(_ZN3aaa9GG3133313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3133313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133313E[];
extern void _ZN3aaa9GG31333133fooEv();
extern void _ZN3aaa9GG31333133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31333133fooEv,_ZThn8_N3aaa9GG31333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333133fooEv,_ZThn20_N3aaa9GG31333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333133barEv,_ZThn20_N3aaa9GG31333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31333133fooEv,_ZThn28_N3aaa9GG31333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31333133barEv,_ZThn28_N3aaa9GG31333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31333133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31333133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31333133fooEv,_ZThn8_N3aaa9GG31333133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333133fooEv,_ZThn20_N3aaa9GG31333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333133barEv,_ZThn20_N3aaa9GG31333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333133fooEv,_ZThn28_N3aaa9GG31333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333133barEv,_ZThn28_N3aaa9GG31333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133313E[];
Class_Descriptor cd__ZN3aaa9GG3133313E = {  "_ZN3aaa9GG3133313E", // class name
  bases__ZN3aaa9GG3133313E, 6,
  &(vtc__ZN3aaa9GG3133313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133321  : ::aaa::EE313 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31333213fooEv
  ~GG3133321(); // tgen
  GG3133321(); // tgen
};
//SIG(1 _ZN3aaa9GG3133321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133321 ::foo(){vfunc_called(this, "_ZN3aaa9GG31333213fooEv");}
aaa::GG3133321 ::~GG3133321(){ note_dtor("_ZN3aaa9GG3133321E", this);} // tgen
aaa::GG3133321 ::GG3133321(){ note_ctor("_ZN3aaa9GG3133321E", this);} // tgen
}
static void Test__ZN3aaa9GG3133321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133321E, buf);
    ::aaa::GG3133321 *dp, &lv = *(dp=new (buf) ::aaa::GG3133321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133321E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133321E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3133321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3133321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3133321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133321E);
    dp->::aaa::GG3133321::~GG3133321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133321E(Test__ZN3aaa9GG3133321E, "_ZN3aaa9GG3133321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133321C1Ev();
extern void _ZN3aaa9GG3133321D1Ev();
Name_Map name_map__ZN3aaa9GG3133321E[] = {
  NSPAIR(_ZN3aaa9GG3133321C1Ev),
  NSPAIR(_ZN3aaa9GG3133321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3133321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133321E[];
extern void _ZN3aaa9GG31333213fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31333213fooEv,_ZThn8_N3aaa9GG31333213fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333213fooEv,_ZThn20_N3aaa9GG31333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31333213fooEv,_ZThn28_N3aaa9GG31333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31333213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31333213fooEv,_ZThn8_N3aaa9GG31333213fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333213fooEv,_ZThn20_N3aaa9GG31333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333213fooEv,_ZThn28_N3aaa9GG31333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133321E[];
Class_Descriptor cd__ZN3aaa9GG3133321E = {  "_ZN3aaa9GG3133321E", // class name
  bases__ZN3aaa9GG3133321E, 6,
  &(vtc__ZN3aaa9GG3133321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133322  : ::aaa::EE313 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31333223barEv
  ~GG3133322(); // tgen
  GG3133322(); // tgen
};
//SIG(1 _ZN3aaa9GG3133322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133322 ::bar(){vfunc_called(this, "_ZN3aaa9GG31333223barEv");}
aaa::GG3133322 ::~GG3133322(){ note_dtor("_ZN3aaa9GG3133322E", this);} // tgen
aaa::GG3133322 ::GG3133322(){ note_ctor("_ZN3aaa9GG3133322E", this);} // tgen
}
static void Test__ZN3aaa9GG3133322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133322E, buf);
    ::aaa::GG3133322 *dp, &lv = *(dp=new (buf) ::aaa::GG3133322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133322E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133322E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3133322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3133322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3133322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133322E);
    dp->::aaa::GG3133322::~GG3133322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133322E(Test__ZN3aaa9GG3133322E, "_ZN3aaa9GG3133322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133322C1Ev();
extern void _ZN3aaa9GG3133322D1Ev();
Name_Map name_map__ZN3aaa9GG3133322E[] = {
  NSPAIR(_ZN3aaa9GG3133322C1Ev),
  NSPAIR(_ZN3aaa9GG3133322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3133322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133322E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31333223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31333223barEv,_ZThn20_N3aaa9GG31333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31333223barEv,_ZThn28_N3aaa9GG31333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31333223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333223barEv,_ZThn20_N3aaa9GG31333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333223barEv,_ZThn28_N3aaa9GG31333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133322E[];
Class_Descriptor cd__ZN3aaa9GG3133322E = {  "_ZN3aaa9GG3133322E", // class name
  bases__ZN3aaa9GG3133322E, 6,
  &(vtc__ZN3aaa9GG3133322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133323  : ::aaa::EE313 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31333233fooEv
  virtual void  bar(); // _ZN3aaa9GG31333233barEv
  ~GG3133323(); // tgen
  GG3133323(); // tgen
};
//SIG(1 _ZN3aaa9GG3133323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133323 ::foo(){vfunc_called(this, "_ZN3aaa9GG31333233fooEv");}
void  aaa::GG3133323 ::bar(){vfunc_called(this, "_ZN3aaa9GG31333233barEv");}
aaa::GG3133323 ::~GG3133323(){ note_dtor("_ZN3aaa9GG3133323E", this);} // tgen
aaa::GG3133323 ::GG3133323(){ note_ctor("_ZN3aaa9GG3133323E", this);} // tgen
}
static void Test__ZN3aaa9GG3133323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133323E, buf);
    ::aaa::GG3133323 *dp, &lv = *(dp=new (buf) ::aaa::GG3133323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133323E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133323E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3133323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3133323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3133323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133323E);
    dp->::aaa::GG3133323::~GG3133323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133323E(Test__ZN3aaa9GG3133323E, "_ZN3aaa9GG3133323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133323C1Ev();
extern void _ZN3aaa9GG3133323D1Ev();
Name_Map name_map__ZN3aaa9GG3133323E[] = {
  NSPAIR(_ZN3aaa9GG3133323C1Ev),
  NSPAIR(_ZN3aaa9GG3133323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3133323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133323E[];
extern void _ZN3aaa9GG31333233fooEv();
extern void _ZN3aaa9GG31333233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31333233fooEv,_ZThn8_N3aaa9GG31333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333233fooEv,_ZThn20_N3aaa9GG31333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333233barEv,_ZThn20_N3aaa9GG31333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31333233fooEv,_ZThn28_N3aaa9GG31333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31333233barEv,_ZThn28_N3aaa9GG31333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31333233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31333233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31333233fooEv,_ZThn8_N3aaa9GG31333233fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333233fooEv,_ZThn20_N3aaa9GG31333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333233barEv,_ZThn20_N3aaa9GG31333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333233fooEv,_ZThn28_N3aaa9GG31333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333233barEv,_ZThn28_N3aaa9GG31333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133323E[];
Class_Descriptor cd__ZN3aaa9GG3133323E = {  "_ZN3aaa9GG3133323E", // class name
  bases__ZN3aaa9GG3133323E, 6,
  &(vtc__ZN3aaa9GG3133323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133331  : ::aaa::EE313 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31333313fooEv
  ~GG3133331(); // tgen
  GG3133331(); // tgen
};
//SIG(1 _ZN3aaa9GG3133331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133331 ::foo(){vfunc_called(this, "_ZN3aaa9GG31333313fooEv");}
aaa::GG3133331 ::~GG3133331(){ note_dtor("_ZN3aaa9GG3133331E", this);} // tgen
aaa::GG3133331 ::GG3133331(){ note_ctor("_ZN3aaa9GG3133331E", this);} // tgen
}
static void Test__ZN3aaa9GG3133331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133331E, buf);
    ::aaa::GG3133331 *dp, &lv = *(dp=new (buf) ::aaa::GG3133331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133331E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133331E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3133331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3133331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3133331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133331E);
    dp->::aaa::GG3133331::~GG3133331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133331E(Test__ZN3aaa9GG3133331E, "_ZN3aaa9GG3133331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133331C1Ev();
extern void _ZN3aaa9GG3133331D1Ev();
Name_Map name_map__ZN3aaa9GG3133331E[] = {
  NSPAIR(_ZN3aaa9GG3133331C1Ev),
  NSPAIR(_ZN3aaa9GG3133331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3133331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133331E[];
extern void _ZN3aaa9GG31333313fooEv();
extern void _ZN3aaa5EE3133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31333313fooEv,_ZThn8_N3aaa9GG31333313fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333313fooEv,_ZThn20_N3aaa9GG31333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG31333313fooEv,_ZThn28_N3aaa9GG31333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31333313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31333313fooEv,_ZThn8_N3aaa9GG31333313fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333313fooEv,_ZThn20_N3aaa9GG31333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333313fooEv,_ZThn28_N3aaa9GG31333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133331E[];
Class_Descriptor cd__ZN3aaa9GG3133331E = {  "_ZN3aaa9GG3133331E", // class name
  bases__ZN3aaa9GG3133331E, 6,
  &(vtc__ZN3aaa9GG3133331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133332  : ::aaa::EE313 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG31333323barEv
  ~GG3133332(); // tgen
  GG3133332(); // tgen
};
//SIG(1 _ZN3aaa9GG3133332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3133332 ::bar(){vfunc_called(this, "_ZN3aaa9GG31333323barEv");}
aaa::GG3133332 ::~GG3133332(){ note_dtor("_ZN3aaa9GG3133332E", this);} // tgen
aaa::GG3133332 ::GG3133332(){ note_ctor("_ZN3aaa9GG3133332E", this);} // tgen
}
static void Test__ZN3aaa9GG3133332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133332E, buf);
    ::aaa::GG3133332 *dp, &lv = *(dp=new (buf) ::aaa::GG3133332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133332E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133332E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3133332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3133332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3133332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133332E);
    dp->::aaa::GG3133332::~GG3133332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133332E(Test__ZN3aaa9GG3133332E, "_ZN3aaa9GG3133332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133332C1Ev();
extern void _ZN3aaa9GG3133332D1Ev();
Name_Map name_map__ZN3aaa9GG3133332E[] = {
  NSPAIR(_ZN3aaa9GG3133332C1Ev),
  NSPAIR(_ZN3aaa9GG3133332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3133332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133332E[];
extern void _ZN3aaa5EE3133fooEv();
extern void _ZN3aaa9GG31333323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG31333323barEv,_ZThn20_N3aaa9GG31333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31333323barEv,_ZThn28_N3aaa9GG31333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31333323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3133fooEv,_ZThn8_N3aaa5EE3133fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333323barEv,_ZThn20_N3aaa9GG31333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333323barEv,_ZThn28_N3aaa9GG31333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133332E[];
Class_Descriptor cd__ZN3aaa9GG3133332E = {  "_ZN3aaa9GG3133332E", // class name
  bases__ZN3aaa9GG3133332E, 6,
  &(vtc__ZN3aaa9GG3133332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3133333  : ::aaa::EE313 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG31333333fooEv
  virtual void  bar(); // _ZN3aaa9GG31333333barEv
  ~GG3133333(); // tgen
  GG3133333(); // tgen
};
//SIG(1 _ZN3aaa9GG3133333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3133333 ::foo(){vfunc_called(this, "_ZN3aaa9GG31333333fooEv");}
void  aaa::GG3133333 ::bar(){vfunc_called(this, "_ZN3aaa9GG31333333barEv");}
aaa::GG3133333 ::~GG3133333(){ note_dtor("_ZN3aaa9GG3133333E", this);} // tgen
aaa::GG3133333 ::GG3133333(){ note_ctor("_ZN3aaa9GG3133333E", this);} // tgen
}
static void Test__ZN3aaa9GG3133333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3133333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3133333E, buf);
    ::aaa::GG3133333 *dp, &lv = *(dp=new (buf) ::aaa::GG3133333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3133333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3133333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE313*), 0, "_ZN3aaa9GG3133333E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::EE313*), ABISELECT(16,8), "_ZN3aaa9GG3133333E");
    check_base_class_offset(lv, (::aaa::EE313*), 0, "_ZN3aaa9GG3133333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3133333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3133333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3133333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3133333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3133333E);
    dp->::aaa::GG3133333::~GG3133333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3133333E(Test__ZN3aaa9GG3133333E, "_ZN3aaa9GG3133333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3133333C1Ev();
extern void _ZN3aaa9GG3133333D1Ev();
Name_Map name_map__ZN3aaa9GG3133333E[] = {
  NSPAIR(_ZN3aaa9GG3133333C1Ev),
  NSPAIR(_ZN3aaa9GG3133333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5EE313E;
extern VTBL_ENTRY _ZTIN3aaa5EE313E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE313E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3133333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE313E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3133333E[];
extern void _ZN3aaa9GG31333333fooEv();
extern void _ZN3aaa9GG31333333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG31333333fooEv,_ZThn8_N3aaa9GG31333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333333fooEv,_ZThn20_N3aaa9GG31333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG31333333barEv,_ZThn20_N3aaa9GG31333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31333333fooEv,_ZThn28_N3aaa9GG31333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG31333333barEv,_ZThn28_N3aaa9GG31333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3133333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG31333333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG31333333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG31333333fooEv,_ZThn8_N3aaa9GG31333333fooEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333333fooEv,_ZThn20_N3aaa9GG31333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG31333333barEv,_ZThn20_N3aaa9GG31333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3133333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333333fooEv,_ZThn28_N3aaa9GG31333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG31333333barEv,_ZThn28_N3aaa9GG31333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3133333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3133333E[];
Class_Descriptor cd__ZN3aaa9GG3133333E = {  "_ZN3aaa9GG3133333E", // class name
  bases__ZN3aaa9GG3133333E, 6,
  &(vtc__ZN3aaa9GG3133333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3133333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3133333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211111  : ::aaa::EE321 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32111113fooEv
  ~GG3211111(); // tgen
  GG3211111(); // tgen
};
//SIG(1 _ZN3aaa9GG3211111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32111113fooEv");}
aaa::GG3211111 ::~GG3211111(){ note_dtor("_ZN3aaa9GG3211111E", this);} // tgen
aaa::GG3211111 ::GG3211111(){ note_ctor("_ZN3aaa9GG3211111E", this);} // tgen
}
static void Test__ZN3aaa9GG3211111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211111E, buf);
    ::aaa::GG3211111 *dp, &lv = *(dp=new (buf) ::aaa::GG3211111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211111E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3211111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3211111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3211111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211111E);
    dp->::aaa::GG3211111::~GG3211111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211111E(Test__ZN3aaa9GG3211111E, "_ZN3aaa9GG3211111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211111C1Ev();
extern void _ZN3aaa9GG3211111D1Ev();
Name_Map name_map__ZN3aaa9GG3211111E[] = {
  NSPAIR(_ZN3aaa9GG3211111C1Ev),
  NSPAIR(_ZN3aaa9GG3211111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3211111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211111E[];
extern void _ZN3aaa9GG32111113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32111113fooEv,_ZThn20_N3aaa9GG32111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32111113fooEv,_ZThn28_N3aaa9GG32111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32111113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111113fooEv,_ZThn20_N3aaa9GG32111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32111113fooEv,_ZThn28_N3aaa9GG32111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211111E[];
Class_Descriptor cd__ZN3aaa9GG3211111E = {  "_ZN3aaa9GG3211111E", // class name
  bases__ZN3aaa9GG3211111E, 6,
  &(vtc__ZN3aaa9GG3211111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211112  : ::aaa::EE321 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32111123barEv
  ~GG3211112(); // tgen
  GG3211112(); // tgen
};
//SIG(1 _ZN3aaa9GG3211112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32111123barEv");}
aaa::GG3211112 ::~GG3211112(){ note_dtor("_ZN3aaa9GG3211112E", this);} // tgen
aaa::GG3211112 ::GG3211112(){ note_ctor("_ZN3aaa9GG3211112E", this);} // tgen
}
static void Test__ZN3aaa9GG3211112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211112E, buf);
    ::aaa::GG3211112 *dp, &lv = *(dp=new (buf) ::aaa::GG3211112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211112E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3211112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3211112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3211112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211112E);
    dp->::aaa::GG3211112::~GG3211112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211112E(Test__ZN3aaa9GG3211112E, "_ZN3aaa9GG3211112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211112C1Ev();
extern void _ZN3aaa9GG3211112D1Ev();
Name_Map name_map__ZN3aaa9GG3211112E[] = {
  NSPAIR(_ZN3aaa9GG3211112C1Ev),
  NSPAIR(_ZN3aaa9GG3211112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3211112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211112E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32111123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32111123barEv,_ZThn8_N3aaa9GG32111123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32111123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32111123barEv,_ZThn8_N3aaa9GG32111123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211112E[];
Class_Descriptor cd__ZN3aaa9GG3211112E = {  "_ZN3aaa9GG3211112E", // class name
  bases__ZN3aaa9GG3211112E, 6,
  &(vtc__ZN3aaa9GG3211112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211113  : ::aaa::EE321 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32111133fooEv
  virtual void  bar(); // _ZN3aaa9GG32111133barEv
  ~GG3211113(); // tgen
  GG3211113(); // tgen
};
//SIG(1 _ZN3aaa9GG3211113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32111133fooEv");}
void  aaa::GG3211113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32111133barEv");}
aaa::GG3211113 ::~GG3211113(){ note_dtor("_ZN3aaa9GG3211113E", this);} // tgen
aaa::GG3211113 ::GG3211113(){ note_ctor("_ZN3aaa9GG3211113E", this);} // tgen
}
static void Test__ZN3aaa9GG3211113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211113E, buf);
    ::aaa::GG3211113 *dp, &lv = *(dp=new (buf) ::aaa::GG3211113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211113E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3211113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3211113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3211113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211113E);
    dp->::aaa::GG3211113::~GG3211113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211113E(Test__ZN3aaa9GG3211113E, "_ZN3aaa9GG3211113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211113C1Ev();
extern void _ZN3aaa9GG3211113D1Ev();
Name_Map name_map__ZN3aaa9GG3211113E[] = {
  NSPAIR(_ZN3aaa9GG3211113C1Ev),
  NSPAIR(_ZN3aaa9GG3211113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3211113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211113E[];
extern void _ZN3aaa9GG32111133fooEv();
extern void _ZN3aaa9GG32111133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32111133barEv,_ZThn8_N3aaa9GG32111133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32111133fooEv,_ZThn20_N3aaa9GG32111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32111133fooEv,_ZThn28_N3aaa9GG32111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32111133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32111133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32111133barEv,_ZThn8_N3aaa9GG32111133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111133fooEv,_ZThn20_N3aaa9GG32111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32111133fooEv,_ZThn28_N3aaa9GG32111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211113E[];
Class_Descriptor cd__ZN3aaa9GG3211113E = {  "_ZN3aaa9GG3211113E", // class name
  bases__ZN3aaa9GG3211113E, 6,
  &(vtc__ZN3aaa9GG3211113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211121  : ::aaa::EE321 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32111213fooEv
  ~GG3211121(); // tgen
  GG3211121(); // tgen
};
//SIG(1 _ZN3aaa9GG3211121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32111213fooEv");}
aaa::GG3211121 ::~GG3211121(){ note_dtor("_ZN3aaa9GG3211121E", this);} // tgen
aaa::GG3211121 ::GG3211121(){ note_ctor("_ZN3aaa9GG3211121E", this);} // tgen
}
static void Test__ZN3aaa9GG3211121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211121E, buf);
    ::aaa::GG3211121 *dp, &lv = *(dp=new (buf) ::aaa::GG3211121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211121E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3211121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3211121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3211121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211121E);
    dp->::aaa::GG3211121::~GG3211121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211121E(Test__ZN3aaa9GG3211121E, "_ZN3aaa9GG3211121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211121C1Ev();
extern void _ZN3aaa9GG3211121D1Ev();
Name_Map name_map__ZN3aaa9GG3211121E[] = {
  NSPAIR(_ZN3aaa9GG3211121C1Ev),
  NSPAIR(_ZN3aaa9GG3211121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3211121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211121E[];
extern void _ZN3aaa9GG32111213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32111213fooEv,_ZThn20_N3aaa9GG32111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32111213fooEv,_ZThn28_N3aaa9GG32111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32111213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111213fooEv,_ZThn20_N3aaa9GG32111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32111213fooEv,_ZThn28_N3aaa9GG32111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211121E[];
Class_Descriptor cd__ZN3aaa9GG3211121E = {  "_ZN3aaa9GG3211121E", // class name
  bases__ZN3aaa9GG3211121E, 6,
  &(vtc__ZN3aaa9GG3211121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211122  : ::aaa::EE321 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32111223barEv
  ~GG3211122(); // tgen
  GG3211122(); // tgen
};
//SIG(1 _ZN3aaa9GG3211122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32111223barEv");}
aaa::GG3211122 ::~GG3211122(){ note_dtor("_ZN3aaa9GG3211122E", this);} // tgen
aaa::GG3211122 ::GG3211122(){ note_ctor("_ZN3aaa9GG3211122E", this);} // tgen
}
static void Test__ZN3aaa9GG3211122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211122E, buf);
    ::aaa::GG3211122 *dp, &lv = *(dp=new (buf) ::aaa::GG3211122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211122E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3211122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3211122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3211122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211122E);
    dp->::aaa::GG3211122::~GG3211122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211122E(Test__ZN3aaa9GG3211122E, "_ZN3aaa9GG3211122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211122C1Ev();
extern void _ZN3aaa9GG3211122D1Ev();
Name_Map name_map__ZN3aaa9GG3211122E[] = {
  NSPAIR(_ZN3aaa9GG3211122C1Ev),
  NSPAIR(_ZN3aaa9GG3211122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3211122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211122E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32111223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32111223barEv,_ZThn8_N3aaa9GG32111223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32111223barEv,_ZThn20_N3aaa9GG32111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32111223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32111223barEv,_ZThn8_N3aaa9GG32111223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111223barEv,_ZThn20_N3aaa9GG32111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211122E[];
Class_Descriptor cd__ZN3aaa9GG3211122E = {  "_ZN3aaa9GG3211122E", // class name
  bases__ZN3aaa9GG3211122E, 6,
  &(vtc__ZN3aaa9GG3211122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211123  : ::aaa::EE321 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32111233fooEv
  virtual void  bar(); // _ZN3aaa9GG32111233barEv
  ~GG3211123(); // tgen
  GG3211123(); // tgen
};
//SIG(1 _ZN3aaa9GG3211123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32111233fooEv");}
void  aaa::GG3211123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32111233barEv");}
aaa::GG3211123 ::~GG3211123(){ note_dtor("_ZN3aaa9GG3211123E", this);} // tgen
aaa::GG3211123 ::GG3211123(){ note_ctor("_ZN3aaa9GG3211123E", this);} // tgen
}
static void Test__ZN3aaa9GG3211123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211123E, buf);
    ::aaa::GG3211123 *dp, &lv = *(dp=new (buf) ::aaa::GG3211123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211123E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3211123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3211123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3211123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211123E);
    dp->::aaa::GG3211123::~GG3211123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211123E(Test__ZN3aaa9GG3211123E, "_ZN3aaa9GG3211123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211123C1Ev();
extern void _ZN3aaa9GG3211123D1Ev();
Name_Map name_map__ZN3aaa9GG3211123E[] = {
  NSPAIR(_ZN3aaa9GG3211123C1Ev),
  NSPAIR(_ZN3aaa9GG3211123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3211123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211123E[];
extern void _ZN3aaa9GG32111233fooEv();
extern void _ZN3aaa9GG32111233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32111233barEv,_ZThn8_N3aaa9GG32111233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32111233fooEv,_ZThn20_N3aaa9GG32111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32111233barEv,_ZThn20_N3aaa9GG32111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32111233fooEv,_ZThn28_N3aaa9GG32111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32111233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32111233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32111233barEv,_ZThn8_N3aaa9GG32111233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111233fooEv,_ZThn20_N3aaa9GG32111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111233barEv,_ZThn20_N3aaa9GG32111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32111233fooEv,_ZThn28_N3aaa9GG32111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211123E[];
Class_Descriptor cd__ZN3aaa9GG3211123E = {  "_ZN3aaa9GG3211123E", // class name
  bases__ZN3aaa9GG3211123E, 6,
  &(vtc__ZN3aaa9GG3211123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211131  : ::aaa::EE321 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32111313fooEv
  ~GG3211131(); // tgen
  GG3211131(); // tgen
};
//SIG(1 _ZN3aaa9GG3211131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32111313fooEv");}
aaa::GG3211131 ::~GG3211131(){ note_dtor("_ZN3aaa9GG3211131E", this);} // tgen
aaa::GG3211131 ::GG3211131(){ note_ctor("_ZN3aaa9GG3211131E", this);} // tgen
}
static void Test__ZN3aaa9GG3211131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211131E, buf);
    ::aaa::GG3211131 *dp, &lv = *(dp=new (buf) ::aaa::GG3211131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211131E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3211131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3211131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3211131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211131E);
    dp->::aaa::GG3211131::~GG3211131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211131E(Test__ZN3aaa9GG3211131E, "_ZN3aaa9GG3211131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211131C1Ev();
extern void _ZN3aaa9GG3211131D1Ev();
Name_Map name_map__ZN3aaa9GG3211131E[] = {
  NSPAIR(_ZN3aaa9GG3211131C1Ev),
  NSPAIR(_ZN3aaa9GG3211131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3211131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211131E[];
extern void _ZN3aaa9GG32111313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32111313fooEv,_ZThn20_N3aaa9GG32111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32111313fooEv,_ZThn28_N3aaa9GG32111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32111313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111313fooEv,_ZThn20_N3aaa9GG32111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32111313fooEv,_ZThn28_N3aaa9GG32111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211131E[];
Class_Descriptor cd__ZN3aaa9GG3211131E = {  "_ZN3aaa9GG3211131E", // class name
  bases__ZN3aaa9GG3211131E, 6,
  &(vtc__ZN3aaa9GG3211131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211132  : ::aaa::EE321 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32111323barEv
  ~GG3211132(); // tgen
  GG3211132(); // tgen
};
//SIG(1 _ZN3aaa9GG3211132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32111323barEv");}
aaa::GG3211132 ::~GG3211132(){ note_dtor("_ZN3aaa9GG3211132E", this);} // tgen
aaa::GG3211132 ::GG3211132(){ note_ctor("_ZN3aaa9GG3211132E", this);} // tgen
}
static void Test__ZN3aaa9GG3211132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211132E, buf);
    ::aaa::GG3211132 *dp, &lv = *(dp=new (buf) ::aaa::GG3211132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211132E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3211132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3211132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3211132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211132E);
    dp->::aaa::GG3211132::~GG3211132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211132E(Test__ZN3aaa9GG3211132E, "_ZN3aaa9GG3211132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211132C1Ev();
extern void _ZN3aaa9GG3211132D1Ev();
Name_Map name_map__ZN3aaa9GG3211132E[] = {
  NSPAIR(_ZN3aaa9GG3211132C1Ev),
  NSPAIR(_ZN3aaa9GG3211132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3211132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211132E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32111323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32111323barEv,_ZThn8_N3aaa9GG32111323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32111323barEv,_ZThn20_N3aaa9GG32111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32111323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32111323barEv,_ZThn8_N3aaa9GG32111323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111323barEv,_ZThn20_N3aaa9GG32111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211132E[];
Class_Descriptor cd__ZN3aaa9GG3211132E = {  "_ZN3aaa9GG3211132E", // class name
  bases__ZN3aaa9GG3211132E, 6,
  &(vtc__ZN3aaa9GG3211132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211133  : ::aaa::EE321 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32111333fooEv
  virtual void  bar(); // _ZN3aaa9GG32111333barEv
  ~GG3211133(); // tgen
  GG3211133(); // tgen
};
//SIG(1 _ZN3aaa9GG3211133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32111333fooEv");}
void  aaa::GG3211133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32111333barEv");}
aaa::GG3211133 ::~GG3211133(){ note_dtor("_ZN3aaa9GG3211133E", this);} // tgen
aaa::GG3211133 ::GG3211133(){ note_ctor("_ZN3aaa9GG3211133E", this);} // tgen
}
static void Test__ZN3aaa9GG3211133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211133E, buf);
    ::aaa::GG3211133 *dp, &lv = *(dp=new (buf) ::aaa::GG3211133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211133E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3211133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3211133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3211133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211133E);
    dp->::aaa::GG3211133::~GG3211133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211133E(Test__ZN3aaa9GG3211133E, "_ZN3aaa9GG3211133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211133C1Ev();
extern void _ZN3aaa9GG3211133D1Ev();
Name_Map name_map__ZN3aaa9GG3211133E[] = {
  NSPAIR(_ZN3aaa9GG3211133C1Ev),
  NSPAIR(_ZN3aaa9GG3211133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3211133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211133E[];
extern void _ZN3aaa9GG32111333fooEv();
extern void _ZN3aaa9GG32111333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32111333barEv,_ZThn8_N3aaa9GG32111333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32111333fooEv,_ZThn20_N3aaa9GG32111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32111333barEv,_ZThn20_N3aaa9GG32111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32111333fooEv,_ZThn28_N3aaa9GG32111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32111333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32111333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32111333barEv,_ZThn8_N3aaa9GG32111333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111333fooEv,_ZThn20_N3aaa9GG32111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32111333barEv,_ZThn20_N3aaa9GG32111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32111333fooEv,_ZThn28_N3aaa9GG32111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211133E[];
Class_Descriptor cd__ZN3aaa9GG3211133E = {  "_ZN3aaa9GG3211133E", // class name
  bases__ZN3aaa9GG3211133E, 6,
  &(vtc__ZN3aaa9GG3211133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211211  : ::aaa::EE321 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32112113fooEv
  ~GG3211211(); // tgen
  GG3211211(); // tgen
};
//SIG(1 _ZN3aaa9GG3211211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32112113fooEv");}
aaa::GG3211211 ::~GG3211211(){ note_dtor("_ZN3aaa9GG3211211E", this);} // tgen
aaa::GG3211211 ::GG3211211(){ note_ctor("_ZN3aaa9GG3211211E", this);} // tgen
}
static void Test__ZN3aaa9GG3211211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211211E, buf);
    ::aaa::GG3211211 *dp, &lv = *(dp=new (buf) ::aaa::GG3211211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211211E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3211211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3211211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3211211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211211E);
    dp->::aaa::GG3211211::~GG3211211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211211E(Test__ZN3aaa9GG3211211E, "_ZN3aaa9GG3211211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211211C1Ev();
extern void _ZN3aaa9GG3211211D1Ev();
Name_Map name_map__ZN3aaa9GG3211211E[] = {
  NSPAIR(_ZN3aaa9GG3211211C1Ev),
  NSPAIR(_ZN3aaa9GG3211211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3211211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211211E[];
extern void _ZN3aaa9GG32112113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32112113fooEv,_ZThn20_N3aaa9GG32112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32112113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112113fooEv,_ZThn20_N3aaa9GG32112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211211E[];
Class_Descriptor cd__ZN3aaa9GG3211211E = {  "_ZN3aaa9GG3211211E", // class name
  bases__ZN3aaa9GG3211211E, 6,
  &(vtc__ZN3aaa9GG3211211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211212  : ::aaa::EE321 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32112123barEv
  ~GG3211212(); // tgen
  GG3211212(); // tgen
};
//SIG(1 _ZN3aaa9GG3211212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32112123barEv");}
aaa::GG3211212 ::~GG3211212(){ note_dtor("_ZN3aaa9GG3211212E", this);} // tgen
aaa::GG3211212 ::GG3211212(){ note_ctor("_ZN3aaa9GG3211212E", this);} // tgen
}
static void Test__ZN3aaa9GG3211212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211212E, buf);
    ::aaa::GG3211212 *dp, &lv = *(dp=new (buf) ::aaa::GG3211212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211212E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3211212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3211212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3211212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211212E);
    dp->::aaa::GG3211212::~GG3211212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211212E(Test__ZN3aaa9GG3211212E, "_ZN3aaa9GG3211212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211212C1Ev();
extern void _ZN3aaa9GG3211212D1Ev();
Name_Map name_map__ZN3aaa9GG3211212E[] = {
  NSPAIR(_ZN3aaa9GG3211212C1Ev),
  NSPAIR(_ZN3aaa9GG3211212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3211212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211212E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32112123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32112123barEv,_ZThn8_N3aaa9GG32112123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32112123barEv,_ZThn28_N3aaa9GG32112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32112123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32112123barEv,_ZThn8_N3aaa9GG32112123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32112123barEv,_ZThn28_N3aaa9GG32112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211212E[];
Class_Descriptor cd__ZN3aaa9GG3211212E = {  "_ZN3aaa9GG3211212E", // class name
  bases__ZN3aaa9GG3211212E, 6,
  &(vtc__ZN3aaa9GG3211212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211213  : ::aaa::EE321 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32112133fooEv
  virtual void  bar(); // _ZN3aaa9GG32112133barEv
  ~GG3211213(); // tgen
  GG3211213(); // tgen
};
//SIG(1 _ZN3aaa9GG3211213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32112133fooEv");}
void  aaa::GG3211213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32112133barEv");}
aaa::GG3211213 ::~GG3211213(){ note_dtor("_ZN3aaa9GG3211213E", this);} // tgen
aaa::GG3211213 ::GG3211213(){ note_ctor("_ZN3aaa9GG3211213E", this);} // tgen
}
static void Test__ZN3aaa9GG3211213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211213E, buf);
    ::aaa::GG3211213 *dp, &lv = *(dp=new (buf) ::aaa::GG3211213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211213E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3211213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3211213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3211213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211213E);
    dp->::aaa::GG3211213::~GG3211213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211213E(Test__ZN3aaa9GG3211213E, "_ZN3aaa9GG3211213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211213C1Ev();
extern void _ZN3aaa9GG3211213D1Ev();
Name_Map name_map__ZN3aaa9GG3211213E[] = {
  NSPAIR(_ZN3aaa9GG3211213C1Ev),
  NSPAIR(_ZN3aaa9GG3211213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3211213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211213E[];
extern void _ZN3aaa9GG32112133fooEv();
extern void _ZN3aaa9GG32112133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32112133barEv,_ZThn8_N3aaa9GG32112133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32112133fooEv,_ZThn20_N3aaa9GG32112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32112133barEv,_ZThn28_N3aaa9GG32112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32112133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32112133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32112133barEv,_ZThn8_N3aaa9GG32112133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112133fooEv,_ZThn20_N3aaa9GG32112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32112133barEv,_ZThn28_N3aaa9GG32112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211213E[];
Class_Descriptor cd__ZN3aaa9GG3211213E = {  "_ZN3aaa9GG3211213E", // class name
  bases__ZN3aaa9GG3211213E, 6,
  &(vtc__ZN3aaa9GG3211213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211221  : ::aaa::EE321 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32112213fooEv
  ~GG3211221(); // tgen
  GG3211221(); // tgen
};
//SIG(1 _ZN3aaa9GG3211221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32112213fooEv");}
aaa::GG3211221 ::~GG3211221(){ note_dtor("_ZN3aaa9GG3211221E", this);} // tgen
aaa::GG3211221 ::GG3211221(){ note_ctor("_ZN3aaa9GG3211221E", this);} // tgen
}
static void Test__ZN3aaa9GG3211221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211221E, buf);
    ::aaa::GG3211221 *dp, &lv = *(dp=new (buf) ::aaa::GG3211221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211221E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3211221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3211221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3211221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211221E);
    dp->::aaa::GG3211221::~GG3211221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211221E(Test__ZN3aaa9GG3211221E, "_ZN3aaa9GG3211221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211221C1Ev();
extern void _ZN3aaa9GG3211221D1Ev();
Name_Map name_map__ZN3aaa9GG3211221E[] = {
  NSPAIR(_ZN3aaa9GG3211221C1Ev),
  NSPAIR(_ZN3aaa9GG3211221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3211221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211221E[];
extern void _ZN3aaa9GG32112213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32112213fooEv,_ZThn20_N3aaa9GG32112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32112213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112213fooEv,_ZThn20_N3aaa9GG32112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211221E[];
Class_Descriptor cd__ZN3aaa9GG3211221E = {  "_ZN3aaa9GG3211221E", // class name
  bases__ZN3aaa9GG3211221E, 6,
  &(vtc__ZN3aaa9GG3211221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211222  : ::aaa::EE321 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32112223barEv
  ~GG3211222(); // tgen
  GG3211222(); // tgen
};
//SIG(1 _ZN3aaa9GG3211222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32112223barEv");}
aaa::GG3211222 ::~GG3211222(){ note_dtor("_ZN3aaa9GG3211222E", this);} // tgen
aaa::GG3211222 ::GG3211222(){ note_ctor("_ZN3aaa9GG3211222E", this);} // tgen
}
static void Test__ZN3aaa9GG3211222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211222E, buf);
    ::aaa::GG3211222 *dp, &lv = *(dp=new (buf) ::aaa::GG3211222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211222E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3211222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3211222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3211222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211222E);
    dp->::aaa::GG3211222::~GG3211222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211222E(Test__ZN3aaa9GG3211222E, "_ZN3aaa9GG3211222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211222C1Ev();
extern void _ZN3aaa9GG3211222D1Ev();
Name_Map name_map__ZN3aaa9GG3211222E[] = {
  NSPAIR(_ZN3aaa9GG3211222C1Ev),
  NSPAIR(_ZN3aaa9GG3211222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3211222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211222E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32112223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32112223barEv,_ZThn8_N3aaa9GG32112223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32112223barEv,_ZThn20_N3aaa9GG32112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32112223barEv,_ZThn28_N3aaa9GG32112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32112223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32112223barEv,_ZThn8_N3aaa9GG32112223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112223barEv,_ZThn20_N3aaa9GG32112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32112223barEv,_ZThn28_N3aaa9GG32112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211222E[];
Class_Descriptor cd__ZN3aaa9GG3211222E = {  "_ZN3aaa9GG3211222E", // class name
  bases__ZN3aaa9GG3211222E, 6,
  &(vtc__ZN3aaa9GG3211222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211223  : ::aaa::EE321 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32112233fooEv
  virtual void  bar(); // _ZN3aaa9GG32112233barEv
  ~GG3211223(); // tgen
  GG3211223(); // tgen
};
//SIG(1 _ZN3aaa9GG3211223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32112233fooEv");}
void  aaa::GG3211223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32112233barEv");}
aaa::GG3211223 ::~GG3211223(){ note_dtor("_ZN3aaa9GG3211223E", this);} // tgen
aaa::GG3211223 ::GG3211223(){ note_ctor("_ZN3aaa9GG3211223E", this);} // tgen
}
static void Test__ZN3aaa9GG3211223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211223E, buf);
    ::aaa::GG3211223 *dp, &lv = *(dp=new (buf) ::aaa::GG3211223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211223E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3211223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3211223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3211223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211223E);
    dp->::aaa::GG3211223::~GG3211223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211223E(Test__ZN3aaa9GG3211223E, "_ZN3aaa9GG3211223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211223C1Ev();
extern void _ZN3aaa9GG3211223D1Ev();
Name_Map name_map__ZN3aaa9GG3211223E[] = {
  NSPAIR(_ZN3aaa9GG3211223C1Ev),
  NSPAIR(_ZN3aaa9GG3211223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3211223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211223E[];
extern void _ZN3aaa9GG32112233fooEv();
extern void _ZN3aaa9GG32112233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32112233barEv,_ZThn8_N3aaa9GG32112233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32112233fooEv,_ZThn20_N3aaa9GG32112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32112233barEv,_ZThn20_N3aaa9GG32112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32112233barEv,_ZThn28_N3aaa9GG32112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32112233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32112233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32112233barEv,_ZThn8_N3aaa9GG32112233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112233fooEv,_ZThn20_N3aaa9GG32112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112233barEv,_ZThn20_N3aaa9GG32112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32112233barEv,_ZThn28_N3aaa9GG32112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211223E[];
Class_Descriptor cd__ZN3aaa9GG3211223E = {  "_ZN3aaa9GG3211223E", // class name
  bases__ZN3aaa9GG3211223E, 6,
  &(vtc__ZN3aaa9GG3211223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211231  : ::aaa::EE321 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32112313fooEv
  ~GG3211231(); // tgen
  GG3211231(); // tgen
};
//SIG(1 _ZN3aaa9GG3211231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32112313fooEv");}
aaa::GG3211231 ::~GG3211231(){ note_dtor("_ZN3aaa9GG3211231E", this);} // tgen
aaa::GG3211231 ::GG3211231(){ note_ctor("_ZN3aaa9GG3211231E", this);} // tgen
}
static void Test__ZN3aaa9GG3211231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211231E, buf);
    ::aaa::GG3211231 *dp, &lv = *(dp=new (buf) ::aaa::GG3211231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211231E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3211231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3211231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3211231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211231E);
    dp->::aaa::GG3211231::~GG3211231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211231E(Test__ZN3aaa9GG3211231E, "_ZN3aaa9GG3211231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211231C1Ev();
extern void _ZN3aaa9GG3211231D1Ev();
Name_Map name_map__ZN3aaa9GG3211231E[] = {
  NSPAIR(_ZN3aaa9GG3211231C1Ev),
  NSPAIR(_ZN3aaa9GG3211231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3211231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211231E[];
extern void _ZN3aaa9GG32112313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32112313fooEv,_ZThn20_N3aaa9GG32112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32112313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112313fooEv,_ZThn20_N3aaa9GG32112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211231E[];
Class_Descriptor cd__ZN3aaa9GG3211231E = {  "_ZN3aaa9GG3211231E", // class name
  bases__ZN3aaa9GG3211231E, 6,
  &(vtc__ZN3aaa9GG3211231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211232  : ::aaa::EE321 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32112323barEv
  ~GG3211232(); // tgen
  GG3211232(); // tgen
};
//SIG(1 _ZN3aaa9GG3211232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32112323barEv");}
aaa::GG3211232 ::~GG3211232(){ note_dtor("_ZN3aaa9GG3211232E", this);} // tgen
aaa::GG3211232 ::GG3211232(){ note_ctor("_ZN3aaa9GG3211232E", this);} // tgen
}
static void Test__ZN3aaa9GG3211232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211232E, buf);
    ::aaa::GG3211232 *dp, &lv = *(dp=new (buf) ::aaa::GG3211232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211232E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3211232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3211232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3211232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211232E);
    dp->::aaa::GG3211232::~GG3211232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211232E(Test__ZN3aaa9GG3211232E, "_ZN3aaa9GG3211232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211232C1Ev();
extern void _ZN3aaa9GG3211232D1Ev();
Name_Map name_map__ZN3aaa9GG3211232E[] = {
  NSPAIR(_ZN3aaa9GG3211232C1Ev),
  NSPAIR(_ZN3aaa9GG3211232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3211232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211232E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32112323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32112323barEv,_ZThn8_N3aaa9GG32112323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32112323barEv,_ZThn20_N3aaa9GG32112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32112323barEv,_ZThn28_N3aaa9GG32112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32112323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32112323barEv,_ZThn8_N3aaa9GG32112323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112323barEv,_ZThn20_N3aaa9GG32112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32112323barEv,_ZThn28_N3aaa9GG32112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211232E[];
Class_Descriptor cd__ZN3aaa9GG3211232E = {  "_ZN3aaa9GG3211232E", // class name
  bases__ZN3aaa9GG3211232E, 6,
  &(vtc__ZN3aaa9GG3211232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211233  : ::aaa::EE321 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32112333fooEv
  virtual void  bar(); // _ZN3aaa9GG32112333barEv
  ~GG3211233(); // tgen
  GG3211233(); // tgen
};
//SIG(1 _ZN3aaa9GG3211233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32112333fooEv");}
void  aaa::GG3211233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32112333barEv");}
aaa::GG3211233 ::~GG3211233(){ note_dtor("_ZN3aaa9GG3211233E", this);} // tgen
aaa::GG3211233 ::GG3211233(){ note_ctor("_ZN3aaa9GG3211233E", this);} // tgen
}
static void Test__ZN3aaa9GG3211233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211233E, buf);
    ::aaa::GG3211233 *dp, &lv = *(dp=new (buf) ::aaa::GG3211233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211233E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3211233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3211233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3211233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211233E);
    dp->::aaa::GG3211233::~GG3211233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211233E(Test__ZN3aaa9GG3211233E, "_ZN3aaa9GG3211233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211233C1Ev();
extern void _ZN3aaa9GG3211233D1Ev();
Name_Map name_map__ZN3aaa9GG3211233E[] = {
  NSPAIR(_ZN3aaa9GG3211233C1Ev),
  NSPAIR(_ZN3aaa9GG3211233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3211233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211233E[];
extern void _ZN3aaa9GG32112333fooEv();
extern void _ZN3aaa9GG32112333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32112333barEv,_ZThn8_N3aaa9GG32112333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32112333fooEv,_ZThn20_N3aaa9GG32112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32112333barEv,_ZThn20_N3aaa9GG32112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32112333barEv,_ZThn28_N3aaa9GG32112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32112333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32112333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32112333barEv,_ZThn8_N3aaa9GG32112333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112333fooEv,_ZThn20_N3aaa9GG32112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32112333barEv,_ZThn20_N3aaa9GG32112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32112333barEv,_ZThn28_N3aaa9GG32112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211233E[];
Class_Descriptor cd__ZN3aaa9GG3211233E = {  "_ZN3aaa9GG3211233E", // class name
  bases__ZN3aaa9GG3211233E, 6,
  &(vtc__ZN3aaa9GG3211233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211311  : ::aaa::EE321 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32113113fooEv
  ~GG3211311(); // tgen
  GG3211311(); // tgen
};
//SIG(1 _ZN3aaa9GG3211311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32113113fooEv");}
aaa::GG3211311 ::~GG3211311(){ note_dtor("_ZN3aaa9GG3211311E", this);} // tgen
aaa::GG3211311 ::GG3211311(){ note_ctor("_ZN3aaa9GG3211311E", this);} // tgen
}
static void Test__ZN3aaa9GG3211311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211311E, buf);
    ::aaa::GG3211311 *dp, &lv = *(dp=new (buf) ::aaa::GG3211311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211311E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3211311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3211311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3211311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211311E);
    dp->::aaa::GG3211311::~GG3211311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211311E(Test__ZN3aaa9GG3211311E, "_ZN3aaa9GG3211311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211311C1Ev();
extern void _ZN3aaa9GG3211311D1Ev();
Name_Map name_map__ZN3aaa9GG3211311E[] = {
  NSPAIR(_ZN3aaa9GG3211311C1Ev),
  NSPAIR(_ZN3aaa9GG3211311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3211311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211311E[];
extern void _ZN3aaa9GG32113113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32113113fooEv,_ZThn20_N3aaa9GG32113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113113fooEv,_ZThn28_N3aaa9GG32113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32113113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113113fooEv,_ZThn20_N3aaa9GG32113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113113fooEv,_ZThn28_N3aaa9GG32113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211311E[];
Class_Descriptor cd__ZN3aaa9GG3211311E = {  "_ZN3aaa9GG3211311E", // class name
  bases__ZN3aaa9GG3211311E, 6,
  &(vtc__ZN3aaa9GG3211311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211312  : ::aaa::EE321 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32113123barEv
  ~GG3211312(); // tgen
  GG3211312(); // tgen
};
//SIG(1 _ZN3aaa9GG3211312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32113123barEv");}
aaa::GG3211312 ::~GG3211312(){ note_dtor("_ZN3aaa9GG3211312E", this);} // tgen
aaa::GG3211312 ::GG3211312(){ note_ctor("_ZN3aaa9GG3211312E", this);} // tgen
}
static void Test__ZN3aaa9GG3211312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211312E, buf);
    ::aaa::GG3211312 *dp, &lv = *(dp=new (buf) ::aaa::GG3211312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211312E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3211312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3211312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3211312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211312E);
    dp->::aaa::GG3211312::~GG3211312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211312E(Test__ZN3aaa9GG3211312E, "_ZN3aaa9GG3211312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211312C1Ev();
extern void _ZN3aaa9GG3211312D1Ev();
Name_Map name_map__ZN3aaa9GG3211312E[] = {
  NSPAIR(_ZN3aaa9GG3211312C1Ev),
  NSPAIR(_ZN3aaa9GG3211312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3211312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211312E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32113123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32113123barEv,_ZThn8_N3aaa9GG32113123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113123barEv,_ZThn28_N3aaa9GG32113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32113123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32113123barEv,_ZThn8_N3aaa9GG32113123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113123barEv,_ZThn28_N3aaa9GG32113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211312E[];
Class_Descriptor cd__ZN3aaa9GG3211312E = {  "_ZN3aaa9GG3211312E", // class name
  bases__ZN3aaa9GG3211312E, 6,
  &(vtc__ZN3aaa9GG3211312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211313  : ::aaa::EE321 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32113133fooEv
  virtual void  bar(); // _ZN3aaa9GG32113133barEv
  ~GG3211313(); // tgen
  GG3211313(); // tgen
};
//SIG(1 _ZN3aaa9GG3211313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32113133fooEv");}
void  aaa::GG3211313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32113133barEv");}
aaa::GG3211313 ::~GG3211313(){ note_dtor("_ZN3aaa9GG3211313E", this);} // tgen
aaa::GG3211313 ::GG3211313(){ note_ctor("_ZN3aaa9GG3211313E", this);} // tgen
}
static void Test__ZN3aaa9GG3211313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211313E, buf);
    ::aaa::GG3211313 *dp, &lv = *(dp=new (buf) ::aaa::GG3211313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211313E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3211313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3211313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3211313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211313E);
    dp->::aaa::GG3211313::~GG3211313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211313E(Test__ZN3aaa9GG3211313E, "_ZN3aaa9GG3211313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211313C1Ev();
extern void _ZN3aaa9GG3211313D1Ev();
Name_Map name_map__ZN3aaa9GG3211313E[] = {
  NSPAIR(_ZN3aaa9GG3211313C1Ev),
  NSPAIR(_ZN3aaa9GG3211313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3211313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211313E[];
extern void _ZN3aaa9GG32113133fooEv();
extern void _ZN3aaa9GG32113133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32113133barEv,_ZThn8_N3aaa9GG32113133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32113133fooEv,_ZThn20_N3aaa9GG32113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113133fooEv,_ZThn28_N3aaa9GG32113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113133barEv,_ZThn28_N3aaa9GG32113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32113133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32113133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32113133barEv,_ZThn8_N3aaa9GG32113133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113133fooEv,_ZThn20_N3aaa9GG32113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113133fooEv,_ZThn28_N3aaa9GG32113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113133barEv,_ZThn28_N3aaa9GG32113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211313E[];
Class_Descriptor cd__ZN3aaa9GG3211313E = {  "_ZN3aaa9GG3211313E", // class name
  bases__ZN3aaa9GG3211313E, 6,
  &(vtc__ZN3aaa9GG3211313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211321  : ::aaa::EE321 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32113213fooEv
  ~GG3211321(); // tgen
  GG3211321(); // tgen
};
//SIG(1 _ZN3aaa9GG3211321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32113213fooEv");}
aaa::GG3211321 ::~GG3211321(){ note_dtor("_ZN3aaa9GG3211321E", this);} // tgen
aaa::GG3211321 ::GG3211321(){ note_ctor("_ZN3aaa9GG3211321E", this);} // tgen
}
static void Test__ZN3aaa9GG3211321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211321E, buf);
    ::aaa::GG3211321 *dp, &lv = *(dp=new (buf) ::aaa::GG3211321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211321E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3211321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3211321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3211321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211321E);
    dp->::aaa::GG3211321::~GG3211321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211321E(Test__ZN3aaa9GG3211321E, "_ZN3aaa9GG3211321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211321C1Ev();
extern void _ZN3aaa9GG3211321D1Ev();
Name_Map name_map__ZN3aaa9GG3211321E[] = {
  NSPAIR(_ZN3aaa9GG3211321C1Ev),
  NSPAIR(_ZN3aaa9GG3211321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3211321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211321E[];
extern void _ZN3aaa9GG32113213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32113213fooEv,_ZThn20_N3aaa9GG32113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32113213fooEv,_ZThn28_N3aaa9GG32113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32113213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113213fooEv,_ZThn20_N3aaa9GG32113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113213fooEv,_ZThn28_N3aaa9GG32113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211321E[];
Class_Descriptor cd__ZN3aaa9GG3211321E = {  "_ZN3aaa9GG3211321E", // class name
  bases__ZN3aaa9GG3211321E, 6,
  &(vtc__ZN3aaa9GG3211321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211322  : ::aaa::EE321 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32113223barEv
  ~GG3211322(); // tgen
  GG3211322(); // tgen
};
//SIG(1 _ZN3aaa9GG3211322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32113223barEv");}
aaa::GG3211322 ::~GG3211322(){ note_dtor("_ZN3aaa9GG3211322E", this);} // tgen
aaa::GG3211322 ::GG3211322(){ note_ctor("_ZN3aaa9GG3211322E", this);} // tgen
}
static void Test__ZN3aaa9GG3211322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211322E, buf);
    ::aaa::GG3211322 *dp, &lv = *(dp=new (buf) ::aaa::GG3211322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211322E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3211322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3211322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3211322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211322E);
    dp->::aaa::GG3211322::~GG3211322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211322E(Test__ZN3aaa9GG3211322E, "_ZN3aaa9GG3211322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211322C1Ev();
extern void _ZN3aaa9GG3211322D1Ev();
Name_Map name_map__ZN3aaa9GG3211322E[] = {
  NSPAIR(_ZN3aaa9GG3211322C1Ev),
  NSPAIR(_ZN3aaa9GG3211322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3211322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211322E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32113223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32113223barEv,_ZThn8_N3aaa9GG32113223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32113223barEv,_ZThn20_N3aaa9GG32113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32113223barEv,_ZThn28_N3aaa9GG32113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32113223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32113223barEv,_ZThn8_N3aaa9GG32113223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113223barEv,_ZThn20_N3aaa9GG32113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113223barEv,_ZThn28_N3aaa9GG32113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211322E[];
Class_Descriptor cd__ZN3aaa9GG3211322E = {  "_ZN3aaa9GG3211322E", // class name
  bases__ZN3aaa9GG3211322E, 6,
  &(vtc__ZN3aaa9GG3211322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211323  : ::aaa::EE321 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32113233fooEv
  virtual void  bar(); // _ZN3aaa9GG32113233barEv
  ~GG3211323(); // tgen
  GG3211323(); // tgen
};
//SIG(1 _ZN3aaa9GG3211323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32113233fooEv");}
void  aaa::GG3211323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32113233barEv");}
aaa::GG3211323 ::~GG3211323(){ note_dtor("_ZN3aaa9GG3211323E", this);} // tgen
aaa::GG3211323 ::GG3211323(){ note_ctor("_ZN3aaa9GG3211323E", this);} // tgen
}
static void Test__ZN3aaa9GG3211323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211323E, buf);
    ::aaa::GG3211323 *dp, &lv = *(dp=new (buf) ::aaa::GG3211323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211323E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3211323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3211323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3211323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211323E);
    dp->::aaa::GG3211323::~GG3211323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211323E(Test__ZN3aaa9GG3211323E, "_ZN3aaa9GG3211323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211323C1Ev();
extern void _ZN3aaa9GG3211323D1Ev();
Name_Map name_map__ZN3aaa9GG3211323E[] = {
  NSPAIR(_ZN3aaa9GG3211323C1Ev),
  NSPAIR(_ZN3aaa9GG3211323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3211323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211323E[];
extern void _ZN3aaa9GG32113233fooEv();
extern void _ZN3aaa9GG32113233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32113233barEv,_ZThn8_N3aaa9GG32113233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32113233fooEv,_ZThn20_N3aaa9GG32113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32113233barEv,_ZThn20_N3aaa9GG32113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113233fooEv,_ZThn28_N3aaa9GG32113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113233barEv,_ZThn28_N3aaa9GG32113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32113233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32113233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32113233barEv,_ZThn8_N3aaa9GG32113233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113233fooEv,_ZThn20_N3aaa9GG32113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113233barEv,_ZThn20_N3aaa9GG32113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113233fooEv,_ZThn28_N3aaa9GG32113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113233barEv,_ZThn28_N3aaa9GG32113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211323E[];
Class_Descriptor cd__ZN3aaa9GG3211323E = {  "_ZN3aaa9GG3211323E", // class name
  bases__ZN3aaa9GG3211323E, 6,
  &(vtc__ZN3aaa9GG3211323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211331  : ::aaa::EE321 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32113313fooEv
  ~GG3211331(); // tgen
  GG3211331(); // tgen
};
//SIG(1 _ZN3aaa9GG3211331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32113313fooEv");}
aaa::GG3211331 ::~GG3211331(){ note_dtor("_ZN3aaa9GG3211331E", this);} // tgen
aaa::GG3211331 ::GG3211331(){ note_ctor("_ZN3aaa9GG3211331E", this);} // tgen
}
static void Test__ZN3aaa9GG3211331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211331E, buf);
    ::aaa::GG3211331 *dp, &lv = *(dp=new (buf) ::aaa::GG3211331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211331E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3211331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3211331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3211331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211331E);
    dp->::aaa::GG3211331::~GG3211331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211331E(Test__ZN3aaa9GG3211331E, "_ZN3aaa9GG3211331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211331C1Ev();
extern void _ZN3aaa9GG3211331D1Ev();
Name_Map name_map__ZN3aaa9GG3211331E[] = {
  NSPAIR(_ZN3aaa9GG3211331C1Ev),
  NSPAIR(_ZN3aaa9GG3211331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3211331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211331E[];
extern void _ZN3aaa9GG32113313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32113313fooEv,_ZThn20_N3aaa9GG32113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32113313fooEv,_ZThn28_N3aaa9GG32113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32113313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113313fooEv,_ZThn20_N3aaa9GG32113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113313fooEv,_ZThn28_N3aaa9GG32113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211331E[];
Class_Descriptor cd__ZN3aaa9GG3211331E = {  "_ZN3aaa9GG3211331E", // class name
  bases__ZN3aaa9GG3211331E, 6,
  &(vtc__ZN3aaa9GG3211331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211332  : ::aaa::EE321 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32113323barEv
  ~GG3211332(); // tgen
  GG3211332(); // tgen
};
//SIG(1 _ZN3aaa9GG3211332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3211332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32113323barEv");}
aaa::GG3211332 ::~GG3211332(){ note_dtor("_ZN3aaa9GG3211332E", this);} // tgen
aaa::GG3211332 ::GG3211332(){ note_ctor("_ZN3aaa9GG3211332E", this);} // tgen
}
static void Test__ZN3aaa9GG3211332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211332E, buf);
    ::aaa::GG3211332 *dp, &lv = *(dp=new (buf) ::aaa::GG3211332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211332E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3211332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3211332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3211332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211332E);
    dp->::aaa::GG3211332::~GG3211332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211332E(Test__ZN3aaa9GG3211332E, "_ZN3aaa9GG3211332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211332C1Ev();
extern void _ZN3aaa9GG3211332D1Ev();
Name_Map name_map__ZN3aaa9GG3211332E[] = {
  NSPAIR(_ZN3aaa9GG3211332C1Ev),
  NSPAIR(_ZN3aaa9GG3211332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3211332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211332E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32113323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32113323barEv,_ZThn8_N3aaa9GG32113323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32113323barEv,_ZThn20_N3aaa9GG32113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113323barEv,_ZThn28_N3aaa9GG32113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32113323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32113323barEv,_ZThn8_N3aaa9GG32113323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113323barEv,_ZThn20_N3aaa9GG32113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113323barEv,_ZThn28_N3aaa9GG32113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211332E[];
Class_Descriptor cd__ZN3aaa9GG3211332E = {  "_ZN3aaa9GG3211332E", // class name
  bases__ZN3aaa9GG3211332E, 6,
  &(vtc__ZN3aaa9GG3211332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3211333  : ::aaa::EE321 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32113333fooEv
  virtual void  bar(); // _ZN3aaa9GG32113333barEv
  ~GG3211333(); // tgen
  GG3211333(); // tgen
};
//SIG(1 _ZN3aaa9GG3211333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3211333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32113333fooEv");}
void  aaa::GG3211333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32113333barEv");}
aaa::GG3211333 ::~GG3211333(){ note_dtor("_ZN3aaa9GG3211333E", this);} // tgen
aaa::GG3211333 ::GG3211333(){ note_ctor("_ZN3aaa9GG3211333E", this);} // tgen
}
static void Test__ZN3aaa9GG3211333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3211333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3211333E, buf);
    ::aaa::GG3211333 *dp, &lv = *(dp=new (buf) ::aaa::GG3211333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3211333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3211333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3211333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3211333E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3211333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3211333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3211333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3211333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3211333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3211333E);
    dp->::aaa::GG3211333::~GG3211333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3211333E(Test__ZN3aaa9GG3211333E, "_ZN3aaa9GG3211333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3211333C1Ev();
extern void _ZN3aaa9GG3211333D1Ev();
Name_Map name_map__ZN3aaa9GG3211333E[] = {
  NSPAIR(_ZN3aaa9GG3211333C1Ev),
  NSPAIR(_ZN3aaa9GG3211333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3211333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3211333E[];
extern void _ZN3aaa9GG32113333fooEv();
extern void _ZN3aaa9GG32113333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32113333barEv,_ZThn8_N3aaa9GG32113333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32113333fooEv,_ZThn20_N3aaa9GG32113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32113333barEv,_ZThn20_N3aaa9GG32113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113333fooEv,_ZThn28_N3aaa9GG32113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32113333barEv,_ZThn28_N3aaa9GG32113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3211333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32113333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32113333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32113333barEv,_ZThn8_N3aaa9GG32113333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113333fooEv,_ZThn20_N3aaa9GG32113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32113333barEv,_ZThn20_N3aaa9GG32113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3211333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113333fooEv,_ZThn28_N3aaa9GG32113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32113333barEv,_ZThn28_N3aaa9GG32113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3211333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3211333E[];
Class_Descriptor cd__ZN3aaa9GG3211333E = {  "_ZN3aaa9GG3211333E", // class name
  bases__ZN3aaa9GG3211333E, 6,
  &(vtc__ZN3aaa9GG3211333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3211333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3211333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212111  : ::aaa::EE321 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32121113fooEv
  ~GG3212111(); // tgen
  GG3212111(); // tgen
};
//SIG(1 _ZN3aaa9GG3212111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32121113fooEv");}
aaa::GG3212111 ::~GG3212111(){ note_dtor("_ZN3aaa9GG3212111E", this);} // tgen
aaa::GG3212111 ::GG3212111(){ note_ctor("_ZN3aaa9GG3212111E", this);} // tgen
}
static void Test__ZN3aaa9GG3212111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212111E, buf);
    ::aaa::GG3212111 *dp, &lv = *(dp=new (buf) ::aaa::GG3212111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212111E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3212111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3212111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3212111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212111E);
    dp->::aaa::GG3212111::~GG3212111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212111E(Test__ZN3aaa9GG3212111E, "_ZN3aaa9GG3212111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212111C1Ev();
extern void _ZN3aaa9GG3212111D1Ev();
Name_Map name_map__ZN3aaa9GG3212111E[] = {
  NSPAIR(_ZN3aaa9GG3212111C1Ev),
  NSPAIR(_ZN3aaa9GG3212111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3212111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212111E[];
extern void _ZN3aaa9GG32121113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32121113fooEv,_ZThn20_N3aaa9GG32121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32121113fooEv,_ZThn28_N3aaa9GG32121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32121113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121113fooEv,_ZThn20_N3aaa9GG32121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32121113fooEv,_ZThn28_N3aaa9GG32121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212111E[];
Class_Descriptor cd__ZN3aaa9GG3212111E = {  "_ZN3aaa9GG3212111E", // class name
  bases__ZN3aaa9GG3212111E, 6,
  &(vtc__ZN3aaa9GG3212111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212112  : ::aaa::EE321 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32121123barEv
  ~GG3212112(); // tgen
  GG3212112(); // tgen
};
//SIG(1 _ZN3aaa9GG3212112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32121123barEv");}
aaa::GG3212112 ::~GG3212112(){ note_dtor("_ZN3aaa9GG3212112E", this);} // tgen
aaa::GG3212112 ::GG3212112(){ note_ctor("_ZN3aaa9GG3212112E", this);} // tgen
}
static void Test__ZN3aaa9GG3212112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212112E, buf);
    ::aaa::GG3212112 *dp, &lv = *(dp=new (buf) ::aaa::GG3212112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212112E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3212112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3212112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3212112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212112E);
    dp->::aaa::GG3212112::~GG3212112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212112E(Test__ZN3aaa9GG3212112E, "_ZN3aaa9GG3212112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212112C1Ev();
extern void _ZN3aaa9GG3212112D1Ev();
Name_Map name_map__ZN3aaa9GG3212112E[] = {
  NSPAIR(_ZN3aaa9GG3212112C1Ev),
  NSPAIR(_ZN3aaa9GG3212112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3212112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212112E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32121123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32121123barEv,_ZThn8_N3aaa9GG32121123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32121123barEv,_ZThn20_N3aaa9GG32121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32121123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32121123barEv,_ZThn8_N3aaa9GG32121123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121123barEv,_ZThn20_N3aaa9GG32121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212112E[];
Class_Descriptor cd__ZN3aaa9GG3212112E = {  "_ZN3aaa9GG3212112E", // class name
  bases__ZN3aaa9GG3212112E, 6,
  &(vtc__ZN3aaa9GG3212112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212113  : ::aaa::EE321 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32121133fooEv
  virtual void  bar(); // _ZN3aaa9GG32121133barEv
  ~GG3212113(); // tgen
  GG3212113(); // tgen
};
//SIG(1 _ZN3aaa9GG3212113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32121133fooEv");}
void  aaa::GG3212113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32121133barEv");}
aaa::GG3212113 ::~GG3212113(){ note_dtor("_ZN3aaa9GG3212113E", this);} // tgen
aaa::GG3212113 ::GG3212113(){ note_ctor("_ZN3aaa9GG3212113E", this);} // tgen
}
static void Test__ZN3aaa9GG3212113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212113E, buf);
    ::aaa::GG3212113 *dp, &lv = *(dp=new (buf) ::aaa::GG3212113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212113E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3212113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3212113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3212113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212113E);
    dp->::aaa::GG3212113::~GG3212113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212113E(Test__ZN3aaa9GG3212113E, "_ZN3aaa9GG3212113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212113C1Ev();
extern void _ZN3aaa9GG3212113D1Ev();
Name_Map name_map__ZN3aaa9GG3212113E[] = {
  NSPAIR(_ZN3aaa9GG3212113C1Ev),
  NSPAIR(_ZN3aaa9GG3212113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3212113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212113E[];
extern void _ZN3aaa9GG32121133fooEv();
extern void _ZN3aaa9GG32121133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32121133barEv,_ZThn8_N3aaa9GG32121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32121133barEv,_ZThn20_N3aaa9GG32121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32121133fooEv,_ZThn20_N3aaa9GG32121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32121133fooEv,_ZThn28_N3aaa9GG32121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32121133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32121133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32121133barEv,_ZThn8_N3aaa9GG32121133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121133barEv,_ZThn20_N3aaa9GG32121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121133fooEv,_ZThn20_N3aaa9GG32121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32121133fooEv,_ZThn28_N3aaa9GG32121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212113E[];
Class_Descriptor cd__ZN3aaa9GG3212113E = {  "_ZN3aaa9GG3212113E", // class name
  bases__ZN3aaa9GG3212113E, 6,
  &(vtc__ZN3aaa9GG3212113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212121  : ::aaa::EE321 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32121213fooEv
  ~GG3212121(); // tgen
  GG3212121(); // tgen
};
//SIG(1 _ZN3aaa9GG3212121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32121213fooEv");}
aaa::GG3212121 ::~GG3212121(){ note_dtor("_ZN3aaa9GG3212121E", this);} // tgen
aaa::GG3212121 ::GG3212121(){ note_ctor("_ZN3aaa9GG3212121E", this);} // tgen
}
static void Test__ZN3aaa9GG3212121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212121E, buf);
    ::aaa::GG3212121 *dp, &lv = *(dp=new (buf) ::aaa::GG3212121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212121E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3212121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3212121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3212121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212121E);
    dp->::aaa::GG3212121::~GG3212121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212121E(Test__ZN3aaa9GG3212121E, "_ZN3aaa9GG3212121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212121C1Ev();
extern void _ZN3aaa9GG3212121D1Ev();
Name_Map name_map__ZN3aaa9GG3212121E[] = {
  NSPAIR(_ZN3aaa9GG3212121C1Ev),
  NSPAIR(_ZN3aaa9GG3212121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3212121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212121E[];
extern void _ZN3aaa9GG32121213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32121213fooEv,_ZThn28_N3aaa9GG32121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32121213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32121213fooEv,_ZThn28_N3aaa9GG32121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212121E[];
Class_Descriptor cd__ZN3aaa9GG3212121E = {  "_ZN3aaa9GG3212121E", // class name
  bases__ZN3aaa9GG3212121E, 6,
  &(vtc__ZN3aaa9GG3212121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212122  : ::aaa::EE321 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32121223barEv
  ~GG3212122(); // tgen
  GG3212122(); // tgen
};
//SIG(1 _ZN3aaa9GG3212122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32121223barEv");}
aaa::GG3212122 ::~GG3212122(){ note_dtor("_ZN3aaa9GG3212122E", this);} // tgen
aaa::GG3212122 ::GG3212122(){ note_ctor("_ZN3aaa9GG3212122E", this);} // tgen
}
static void Test__ZN3aaa9GG3212122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212122E, buf);
    ::aaa::GG3212122 *dp, &lv = *(dp=new (buf) ::aaa::GG3212122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212122E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3212122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3212122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3212122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212122E);
    dp->::aaa::GG3212122::~GG3212122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212122E(Test__ZN3aaa9GG3212122E, "_ZN3aaa9GG3212122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212122C1Ev();
extern void _ZN3aaa9GG3212122D1Ev();
Name_Map name_map__ZN3aaa9GG3212122E[] = {
  NSPAIR(_ZN3aaa9GG3212122C1Ev),
  NSPAIR(_ZN3aaa9GG3212122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3212122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212122E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32121223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32121223barEv,_ZThn8_N3aaa9GG32121223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32121223barEv,_ZThn20_N3aaa9GG32121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32121223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32121223barEv,_ZThn8_N3aaa9GG32121223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121223barEv,_ZThn20_N3aaa9GG32121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212122E[];
Class_Descriptor cd__ZN3aaa9GG3212122E = {  "_ZN3aaa9GG3212122E", // class name
  bases__ZN3aaa9GG3212122E, 6,
  &(vtc__ZN3aaa9GG3212122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212123  : ::aaa::EE321 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32121233fooEv
  virtual void  bar(); // _ZN3aaa9GG32121233barEv
  ~GG3212123(); // tgen
  GG3212123(); // tgen
};
//SIG(1 _ZN3aaa9GG3212123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32121233fooEv");}
void  aaa::GG3212123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32121233barEv");}
aaa::GG3212123 ::~GG3212123(){ note_dtor("_ZN3aaa9GG3212123E", this);} // tgen
aaa::GG3212123 ::GG3212123(){ note_ctor("_ZN3aaa9GG3212123E", this);} // tgen
}
static void Test__ZN3aaa9GG3212123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212123E, buf);
    ::aaa::GG3212123 *dp, &lv = *(dp=new (buf) ::aaa::GG3212123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212123E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3212123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3212123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3212123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212123E);
    dp->::aaa::GG3212123::~GG3212123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212123E(Test__ZN3aaa9GG3212123E, "_ZN3aaa9GG3212123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212123C1Ev();
extern void _ZN3aaa9GG3212123D1Ev();
Name_Map name_map__ZN3aaa9GG3212123E[] = {
  NSPAIR(_ZN3aaa9GG3212123C1Ev),
  NSPAIR(_ZN3aaa9GG3212123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3212123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212123E[];
extern void _ZN3aaa9GG32121233fooEv();
extern void _ZN3aaa9GG32121233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32121233barEv,_ZThn8_N3aaa9GG32121233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32121233barEv,_ZThn20_N3aaa9GG32121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32121233fooEv,_ZThn28_N3aaa9GG32121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32121233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32121233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32121233barEv,_ZThn8_N3aaa9GG32121233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121233barEv,_ZThn20_N3aaa9GG32121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32121233fooEv,_ZThn28_N3aaa9GG32121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212123E[];
Class_Descriptor cd__ZN3aaa9GG3212123E = {  "_ZN3aaa9GG3212123E", // class name
  bases__ZN3aaa9GG3212123E, 6,
  &(vtc__ZN3aaa9GG3212123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212131  : ::aaa::EE321 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32121313fooEv
  ~GG3212131(); // tgen
  GG3212131(); // tgen
};
//SIG(1 _ZN3aaa9GG3212131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32121313fooEv");}
aaa::GG3212131 ::~GG3212131(){ note_dtor("_ZN3aaa9GG3212131E", this);} // tgen
aaa::GG3212131 ::GG3212131(){ note_ctor("_ZN3aaa9GG3212131E", this);} // tgen
}
static void Test__ZN3aaa9GG3212131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212131E, buf);
    ::aaa::GG3212131 *dp, &lv = *(dp=new (buf) ::aaa::GG3212131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212131E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3212131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3212131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3212131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212131E);
    dp->::aaa::GG3212131::~GG3212131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212131E(Test__ZN3aaa9GG3212131E, "_ZN3aaa9GG3212131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212131C1Ev();
extern void _ZN3aaa9GG3212131D1Ev();
Name_Map name_map__ZN3aaa9GG3212131E[] = {
  NSPAIR(_ZN3aaa9GG3212131C1Ev),
  NSPAIR(_ZN3aaa9GG3212131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3212131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212131E[];
extern void _ZN3aaa9GG32121313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32121313fooEv,_ZThn20_N3aaa9GG32121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32121313fooEv,_ZThn28_N3aaa9GG32121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32121313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121313fooEv,_ZThn20_N3aaa9GG32121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32121313fooEv,_ZThn28_N3aaa9GG32121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212131E[];
Class_Descriptor cd__ZN3aaa9GG3212131E = {  "_ZN3aaa9GG3212131E", // class name
  bases__ZN3aaa9GG3212131E, 6,
  &(vtc__ZN3aaa9GG3212131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212132  : ::aaa::EE321 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32121323barEv
  ~GG3212132(); // tgen
  GG3212132(); // tgen
};
//SIG(1 _ZN3aaa9GG3212132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32121323barEv");}
aaa::GG3212132 ::~GG3212132(){ note_dtor("_ZN3aaa9GG3212132E", this);} // tgen
aaa::GG3212132 ::GG3212132(){ note_ctor("_ZN3aaa9GG3212132E", this);} // tgen
}
static void Test__ZN3aaa9GG3212132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212132E, buf);
    ::aaa::GG3212132 *dp, &lv = *(dp=new (buf) ::aaa::GG3212132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212132E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3212132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3212132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3212132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212132E);
    dp->::aaa::GG3212132::~GG3212132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212132E(Test__ZN3aaa9GG3212132E, "_ZN3aaa9GG3212132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212132C1Ev();
extern void _ZN3aaa9GG3212132D1Ev();
Name_Map name_map__ZN3aaa9GG3212132E[] = {
  NSPAIR(_ZN3aaa9GG3212132C1Ev),
  NSPAIR(_ZN3aaa9GG3212132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3212132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212132E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32121323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32121323barEv,_ZThn8_N3aaa9GG32121323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32121323barEv,_ZThn20_N3aaa9GG32121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32121323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32121323barEv,_ZThn8_N3aaa9GG32121323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121323barEv,_ZThn20_N3aaa9GG32121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212132E[];
Class_Descriptor cd__ZN3aaa9GG3212132E = {  "_ZN3aaa9GG3212132E", // class name
  bases__ZN3aaa9GG3212132E, 6,
  &(vtc__ZN3aaa9GG3212132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212133  : ::aaa::EE321 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32121333fooEv
  virtual void  bar(); // _ZN3aaa9GG32121333barEv
  ~GG3212133(); // tgen
  GG3212133(); // tgen
};
//SIG(1 _ZN3aaa9GG3212133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32121333fooEv");}
void  aaa::GG3212133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32121333barEv");}
aaa::GG3212133 ::~GG3212133(){ note_dtor("_ZN3aaa9GG3212133E", this);} // tgen
aaa::GG3212133 ::GG3212133(){ note_ctor("_ZN3aaa9GG3212133E", this);} // tgen
}
static void Test__ZN3aaa9GG3212133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212133E, buf);
    ::aaa::GG3212133 *dp, &lv = *(dp=new (buf) ::aaa::GG3212133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212133E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3212133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3212133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3212133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212133E);
    dp->::aaa::GG3212133::~GG3212133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212133E(Test__ZN3aaa9GG3212133E, "_ZN3aaa9GG3212133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212133C1Ev();
extern void _ZN3aaa9GG3212133D1Ev();
Name_Map name_map__ZN3aaa9GG3212133E[] = {
  NSPAIR(_ZN3aaa9GG3212133C1Ev),
  NSPAIR(_ZN3aaa9GG3212133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3212133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212133E[];
extern void _ZN3aaa9GG32121333fooEv();
extern void _ZN3aaa9GG32121333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32121333barEv,_ZThn8_N3aaa9GG32121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32121333barEv,_ZThn20_N3aaa9GG32121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32121333fooEv,_ZThn20_N3aaa9GG32121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32121333fooEv,_ZThn28_N3aaa9GG32121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32121333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32121333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32121333barEv,_ZThn8_N3aaa9GG32121333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121333barEv,_ZThn20_N3aaa9GG32121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32121333fooEv,_ZThn20_N3aaa9GG32121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32121333fooEv,_ZThn28_N3aaa9GG32121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212133E[];
Class_Descriptor cd__ZN3aaa9GG3212133E = {  "_ZN3aaa9GG3212133E", // class name
  bases__ZN3aaa9GG3212133E, 6,
  &(vtc__ZN3aaa9GG3212133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212211  : ::aaa::EE321 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32122113fooEv
  ~GG3212211(); // tgen
  GG3212211(); // tgen
};
//SIG(1 _ZN3aaa9GG3212211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32122113fooEv");}
aaa::GG3212211 ::~GG3212211(){ note_dtor("_ZN3aaa9GG3212211E", this);} // tgen
aaa::GG3212211 ::GG3212211(){ note_ctor("_ZN3aaa9GG3212211E", this);} // tgen
}
static void Test__ZN3aaa9GG3212211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212211E, buf);
    ::aaa::GG3212211 *dp, &lv = *(dp=new (buf) ::aaa::GG3212211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212211E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3212211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3212211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3212211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212211E);
    dp->::aaa::GG3212211::~GG3212211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212211E(Test__ZN3aaa9GG3212211E, "_ZN3aaa9GG3212211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212211C1Ev();
extern void _ZN3aaa9GG3212211D1Ev();
Name_Map name_map__ZN3aaa9GG3212211E[] = {
  NSPAIR(_ZN3aaa9GG3212211C1Ev),
  NSPAIR(_ZN3aaa9GG3212211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3212211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212211E[];
extern void _ZN3aaa9GG32122113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32122113fooEv,_ZThn20_N3aaa9GG32122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32122113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122113fooEv,_ZThn20_N3aaa9GG32122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212211E[];
Class_Descriptor cd__ZN3aaa9GG3212211E = {  "_ZN3aaa9GG3212211E", // class name
  bases__ZN3aaa9GG3212211E, 6,
  &(vtc__ZN3aaa9GG3212211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212212  : ::aaa::EE321 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32122123barEv
  ~GG3212212(); // tgen
  GG3212212(); // tgen
};
//SIG(1 _ZN3aaa9GG3212212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32122123barEv");}
aaa::GG3212212 ::~GG3212212(){ note_dtor("_ZN3aaa9GG3212212E", this);} // tgen
aaa::GG3212212 ::GG3212212(){ note_ctor("_ZN3aaa9GG3212212E", this);} // tgen
}
static void Test__ZN3aaa9GG3212212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212212E, buf);
    ::aaa::GG3212212 *dp, &lv = *(dp=new (buf) ::aaa::GG3212212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212212E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3212212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3212212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3212212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212212E);
    dp->::aaa::GG3212212::~GG3212212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212212E(Test__ZN3aaa9GG3212212E, "_ZN3aaa9GG3212212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212212C1Ev();
extern void _ZN3aaa9GG3212212D1Ev();
Name_Map name_map__ZN3aaa9GG3212212E[] = {
  NSPAIR(_ZN3aaa9GG3212212C1Ev),
  NSPAIR(_ZN3aaa9GG3212212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3212212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212212E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32122123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32122123barEv,_ZThn8_N3aaa9GG32122123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32122123barEv,_ZThn20_N3aaa9GG32122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32122123barEv,_ZThn28_N3aaa9GG32122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32122123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32122123barEv,_ZThn8_N3aaa9GG32122123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122123barEv,_ZThn20_N3aaa9GG32122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32122123barEv,_ZThn28_N3aaa9GG32122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212212E[];
Class_Descriptor cd__ZN3aaa9GG3212212E = {  "_ZN3aaa9GG3212212E", // class name
  bases__ZN3aaa9GG3212212E, 6,
  &(vtc__ZN3aaa9GG3212212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212213  : ::aaa::EE321 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32122133fooEv
  virtual void  bar(); // _ZN3aaa9GG32122133barEv
  ~GG3212213(); // tgen
  GG3212213(); // tgen
};
//SIG(1 _ZN3aaa9GG3212213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32122133fooEv");}
void  aaa::GG3212213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32122133barEv");}
aaa::GG3212213 ::~GG3212213(){ note_dtor("_ZN3aaa9GG3212213E", this);} // tgen
aaa::GG3212213 ::GG3212213(){ note_ctor("_ZN3aaa9GG3212213E", this);} // tgen
}
static void Test__ZN3aaa9GG3212213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212213E, buf);
    ::aaa::GG3212213 *dp, &lv = *(dp=new (buf) ::aaa::GG3212213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212213E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3212213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3212213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3212213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212213E);
    dp->::aaa::GG3212213::~GG3212213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212213E(Test__ZN3aaa9GG3212213E, "_ZN3aaa9GG3212213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212213C1Ev();
extern void _ZN3aaa9GG3212213D1Ev();
Name_Map name_map__ZN3aaa9GG3212213E[] = {
  NSPAIR(_ZN3aaa9GG3212213C1Ev),
  NSPAIR(_ZN3aaa9GG3212213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3212213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212213E[];
extern void _ZN3aaa9GG32122133fooEv();
extern void _ZN3aaa9GG32122133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32122133barEv,_ZThn8_N3aaa9GG32122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32122133barEv,_ZThn20_N3aaa9GG32122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32122133fooEv,_ZThn20_N3aaa9GG32122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32122133barEv,_ZThn28_N3aaa9GG32122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32122133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32122133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32122133barEv,_ZThn8_N3aaa9GG32122133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122133barEv,_ZThn20_N3aaa9GG32122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122133fooEv,_ZThn20_N3aaa9GG32122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32122133barEv,_ZThn28_N3aaa9GG32122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212213E[];
Class_Descriptor cd__ZN3aaa9GG3212213E = {  "_ZN3aaa9GG3212213E", // class name
  bases__ZN3aaa9GG3212213E, 6,
  &(vtc__ZN3aaa9GG3212213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212221  : ::aaa::EE321 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32122213fooEv
  ~GG3212221(); // tgen
  GG3212221(); // tgen
};
//SIG(1 _ZN3aaa9GG3212221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32122213fooEv");}
aaa::GG3212221 ::~GG3212221(){ note_dtor("_ZN3aaa9GG3212221E", this);} // tgen
aaa::GG3212221 ::GG3212221(){ note_ctor("_ZN3aaa9GG3212221E", this);} // tgen
}
static void Test__ZN3aaa9GG3212221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212221E, buf);
    ::aaa::GG3212221 *dp, &lv = *(dp=new (buf) ::aaa::GG3212221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212221E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3212221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3212221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3212221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212221E);
    dp->::aaa::GG3212221::~GG3212221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212221E(Test__ZN3aaa9GG3212221E, "_ZN3aaa9GG3212221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212221C1Ev();
extern void _ZN3aaa9GG3212221D1Ev();
Name_Map name_map__ZN3aaa9GG3212221E[] = {
  NSPAIR(_ZN3aaa9GG3212221C1Ev),
  NSPAIR(_ZN3aaa9GG3212221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3212221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212221E[];
extern void _ZN3aaa9GG32122213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32122213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212221E[];
Class_Descriptor cd__ZN3aaa9GG3212221E = {  "_ZN3aaa9GG3212221E", // class name
  bases__ZN3aaa9GG3212221E, 6,
  &(vtc__ZN3aaa9GG3212221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212222  : ::aaa::EE321 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32122223barEv
  ~GG3212222(); // tgen
  GG3212222(); // tgen
};
//SIG(1 _ZN3aaa9GG3212222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32122223barEv");}
aaa::GG3212222 ::~GG3212222(){ note_dtor("_ZN3aaa9GG3212222E", this);} // tgen
aaa::GG3212222 ::GG3212222(){ note_ctor("_ZN3aaa9GG3212222E", this);} // tgen
}
static void Test__ZN3aaa9GG3212222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212222E, buf);
    ::aaa::GG3212222 *dp, &lv = *(dp=new (buf) ::aaa::GG3212222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212222E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3212222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3212222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3212222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212222E);
    dp->::aaa::GG3212222::~GG3212222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212222E(Test__ZN3aaa9GG3212222E, "_ZN3aaa9GG3212222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212222C1Ev();
extern void _ZN3aaa9GG3212222D1Ev();
Name_Map name_map__ZN3aaa9GG3212222E[] = {
  NSPAIR(_ZN3aaa9GG3212222C1Ev),
  NSPAIR(_ZN3aaa9GG3212222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3212222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212222E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32122223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32122223barEv,_ZThn8_N3aaa9GG32122223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32122223barEv,_ZThn20_N3aaa9GG32122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32122223barEv,_ZThn28_N3aaa9GG32122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32122223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32122223barEv,_ZThn8_N3aaa9GG32122223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122223barEv,_ZThn20_N3aaa9GG32122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32122223barEv,_ZThn28_N3aaa9GG32122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212222E[];
Class_Descriptor cd__ZN3aaa9GG3212222E = {  "_ZN3aaa9GG3212222E", // class name
  bases__ZN3aaa9GG3212222E, 6,
  &(vtc__ZN3aaa9GG3212222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212223  : ::aaa::EE321 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32122233fooEv
  virtual void  bar(); // _ZN3aaa9GG32122233barEv
  ~GG3212223(); // tgen
  GG3212223(); // tgen
};
//SIG(1 _ZN3aaa9GG3212223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32122233fooEv");}
void  aaa::GG3212223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32122233barEv");}
aaa::GG3212223 ::~GG3212223(){ note_dtor("_ZN3aaa9GG3212223E", this);} // tgen
aaa::GG3212223 ::GG3212223(){ note_ctor("_ZN3aaa9GG3212223E", this);} // tgen
}
static void Test__ZN3aaa9GG3212223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212223E, buf);
    ::aaa::GG3212223 *dp, &lv = *(dp=new (buf) ::aaa::GG3212223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212223E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3212223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3212223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3212223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212223E);
    dp->::aaa::GG3212223::~GG3212223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212223E(Test__ZN3aaa9GG3212223E, "_ZN3aaa9GG3212223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212223C1Ev();
extern void _ZN3aaa9GG3212223D1Ev();
Name_Map name_map__ZN3aaa9GG3212223E[] = {
  NSPAIR(_ZN3aaa9GG3212223C1Ev),
  NSPAIR(_ZN3aaa9GG3212223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3212223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212223E[];
extern void _ZN3aaa9GG32122233fooEv();
extern void _ZN3aaa9GG32122233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32122233barEv,_ZThn8_N3aaa9GG32122233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32122233barEv,_ZThn20_N3aaa9GG32122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32122233barEv,_ZThn28_N3aaa9GG32122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32122233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32122233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32122233barEv,_ZThn8_N3aaa9GG32122233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122233barEv,_ZThn20_N3aaa9GG32122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32122233barEv,_ZThn28_N3aaa9GG32122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212223E[];
Class_Descriptor cd__ZN3aaa9GG3212223E = {  "_ZN3aaa9GG3212223E", // class name
  bases__ZN3aaa9GG3212223E, 6,
  &(vtc__ZN3aaa9GG3212223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212231  : ::aaa::EE321 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32122313fooEv
  ~GG3212231(); // tgen
  GG3212231(); // tgen
};
//SIG(1 _ZN3aaa9GG3212231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32122313fooEv");}
aaa::GG3212231 ::~GG3212231(){ note_dtor("_ZN3aaa9GG3212231E", this);} // tgen
aaa::GG3212231 ::GG3212231(){ note_ctor("_ZN3aaa9GG3212231E", this);} // tgen
}
static void Test__ZN3aaa9GG3212231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212231E, buf);
    ::aaa::GG3212231 *dp, &lv = *(dp=new (buf) ::aaa::GG3212231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212231E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3212231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3212231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3212231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212231E);
    dp->::aaa::GG3212231::~GG3212231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212231E(Test__ZN3aaa9GG3212231E, "_ZN3aaa9GG3212231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212231C1Ev();
extern void _ZN3aaa9GG3212231D1Ev();
Name_Map name_map__ZN3aaa9GG3212231E[] = {
  NSPAIR(_ZN3aaa9GG3212231C1Ev),
  NSPAIR(_ZN3aaa9GG3212231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3212231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212231E[];
extern void _ZN3aaa9GG32122313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32122313fooEv,_ZThn20_N3aaa9GG32122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32122313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122313fooEv,_ZThn20_N3aaa9GG32122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212231E[];
Class_Descriptor cd__ZN3aaa9GG3212231E = {  "_ZN3aaa9GG3212231E", // class name
  bases__ZN3aaa9GG3212231E, 6,
  &(vtc__ZN3aaa9GG3212231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212232  : ::aaa::EE321 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32122323barEv
  ~GG3212232(); // tgen
  GG3212232(); // tgen
};
//SIG(1 _ZN3aaa9GG3212232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32122323barEv");}
aaa::GG3212232 ::~GG3212232(){ note_dtor("_ZN3aaa9GG3212232E", this);} // tgen
aaa::GG3212232 ::GG3212232(){ note_ctor("_ZN3aaa9GG3212232E", this);} // tgen
}
static void Test__ZN3aaa9GG3212232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212232E, buf);
    ::aaa::GG3212232 *dp, &lv = *(dp=new (buf) ::aaa::GG3212232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212232E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3212232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3212232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3212232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212232E);
    dp->::aaa::GG3212232::~GG3212232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212232E(Test__ZN3aaa9GG3212232E, "_ZN3aaa9GG3212232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212232C1Ev();
extern void _ZN3aaa9GG3212232D1Ev();
Name_Map name_map__ZN3aaa9GG3212232E[] = {
  NSPAIR(_ZN3aaa9GG3212232C1Ev),
  NSPAIR(_ZN3aaa9GG3212232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3212232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212232E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32122323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32122323barEv,_ZThn8_N3aaa9GG32122323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32122323barEv,_ZThn20_N3aaa9GG32122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32122323barEv,_ZThn28_N3aaa9GG32122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32122323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32122323barEv,_ZThn8_N3aaa9GG32122323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122323barEv,_ZThn20_N3aaa9GG32122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32122323barEv,_ZThn28_N3aaa9GG32122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212232E[];
Class_Descriptor cd__ZN3aaa9GG3212232E = {  "_ZN3aaa9GG3212232E", // class name
  bases__ZN3aaa9GG3212232E, 6,
  &(vtc__ZN3aaa9GG3212232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212233  : ::aaa::EE321 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32122333fooEv
  virtual void  bar(); // _ZN3aaa9GG32122333barEv
  ~GG3212233(); // tgen
  GG3212233(); // tgen
};
//SIG(1 _ZN3aaa9GG3212233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32122333fooEv");}
void  aaa::GG3212233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32122333barEv");}
aaa::GG3212233 ::~GG3212233(){ note_dtor("_ZN3aaa9GG3212233E", this);} // tgen
aaa::GG3212233 ::GG3212233(){ note_ctor("_ZN3aaa9GG3212233E", this);} // tgen
}
static void Test__ZN3aaa9GG3212233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212233E, buf);
    ::aaa::GG3212233 *dp, &lv = *(dp=new (buf) ::aaa::GG3212233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212233E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3212233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3212233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3212233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212233E);
    dp->::aaa::GG3212233::~GG3212233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212233E(Test__ZN3aaa9GG3212233E, "_ZN3aaa9GG3212233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212233C1Ev();
extern void _ZN3aaa9GG3212233D1Ev();
Name_Map name_map__ZN3aaa9GG3212233E[] = {
  NSPAIR(_ZN3aaa9GG3212233C1Ev),
  NSPAIR(_ZN3aaa9GG3212233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3212233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212233E[];
extern void _ZN3aaa9GG32122333fooEv();
extern void _ZN3aaa9GG32122333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32122333barEv,_ZThn8_N3aaa9GG32122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32122333barEv,_ZThn20_N3aaa9GG32122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32122333fooEv,_ZThn20_N3aaa9GG32122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32122333barEv,_ZThn28_N3aaa9GG32122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32122333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32122333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32122333barEv,_ZThn8_N3aaa9GG32122333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122333barEv,_ZThn20_N3aaa9GG32122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32122333fooEv,_ZThn20_N3aaa9GG32122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32122333barEv,_ZThn28_N3aaa9GG32122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212233E[];
Class_Descriptor cd__ZN3aaa9GG3212233E = {  "_ZN3aaa9GG3212233E", // class name
  bases__ZN3aaa9GG3212233E, 6,
  &(vtc__ZN3aaa9GG3212233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212311  : ::aaa::EE321 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32123113fooEv
  ~GG3212311(); // tgen
  GG3212311(); // tgen
};
//SIG(1 _ZN3aaa9GG3212311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 v5 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32123113fooEv");}
aaa::GG3212311 ::~GG3212311(){ note_dtor("_ZN3aaa9GG3212311E", this);} // tgen
aaa::GG3212311 ::GG3212311(){ note_ctor("_ZN3aaa9GG3212311E", this);} // tgen
}
static void Test__ZN3aaa9GG3212311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212311E, buf);
    ::aaa::GG3212311 *dp, &lv = *(dp=new (buf) ::aaa::GG3212311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212311E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3212311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3212311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3212311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212311E);
    dp->::aaa::GG3212311::~GG3212311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212311E(Test__ZN3aaa9GG3212311E, "_ZN3aaa9GG3212311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212311C1Ev();
extern void _ZN3aaa9GG3212311D1Ev();
Name_Map name_map__ZN3aaa9GG3212311E[] = {
  NSPAIR(_ZN3aaa9GG3212311C1Ev),
  NSPAIR(_ZN3aaa9GG3212311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3212311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212311E[];
extern void _ZN3aaa9GG32123113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32123113fooEv,_ZThn20_N3aaa9GG32123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123113fooEv,_ZThn28_N3aaa9GG32123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32123113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123113fooEv,_ZThn20_N3aaa9GG32123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123113fooEv,_ZThn28_N3aaa9GG32123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212311E[];
Class_Descriptor cd__ZN3aaa9GG3212311E = {  "_ZN3aaa9GG3212311E", // class name
  bases__ZN3aaa9GG3212311E, 6,
  &(vtc__ZN3aaa9GG3212311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212312  : ::aaa::EE321 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32123123barEv
  ~GG3212312(); // tgen
  GG3212312(); // tgen
};
//SIG(1 _ZN3aaa9GG3212312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32123123barEv");}
aaa::GG3212312 ::~GG3212312(){ note_dtor("_ZN3aaa9GG3212312E", this);} // tgen
aaa::GG3212312 ::GG3212312(){ note_ctor("_ZN3aaa9GG3212312E", this);} // tgen
}
static void Test__ZN3aaa9GG3212312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212312E, buf);
    ::aaa::GG3212312 *dp, &lv = *(dp=new (buf) ::aaa::GG3212312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212312E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3212312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3212312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3212312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212312E);
    dp->::aaa::GG3212312::~GG3212312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212312E(Test__ZN3aaa9GG3212312E, "_ZN3aaa9GG3212312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212312C1Ev();
extern void _ZN3aaa9GG3212312D1Ev();
Name_Map name_map__ZN3aaa9GG3212312E[] = {
  NSPAIR(_ZN3aaa9GG3212312C1Ev),
  NSPAIR(_ZN3aaa9GG3212312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3212312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212312E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32123123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32123123barEv,_ZThn8_N3aaa9GG32123123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32123123barEv,_ZThn20_N3aaa9GG32123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123123barEv,_ZThn28_N3aaa9GG32123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32123123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32123123barEv,_ZThn8_N3aaa9GG32123123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123123barEv,_ZThn20_N3aaa9GG32123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123123barEv,_ZThn28_N3aaa9GG32123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212312E[];
Class_Descriptor cd__ZN3aaa9GG3212312E = {  "_ZN3aaa9GG3212312E", // class name
  bases__ZN3aaa9GG3212312E, 6,
  &(vtc__ZN3aaa9GG3212312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212313  : ::aaa::EE321 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32123133fooEv
  virtual void  bar(); // _ZN3aaa9GG32123133barEv
  ~GG3212313(); // tgen
  GG3212313(); // tgen
};
//SIG(1 _ZN3aaa9GG3212313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32123133fooEv");}
void  aaa::GG3212313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32123133barEv");}
aaa::GG3212313 ::~GG3212313(){ note_dtor("_ZN3aaa9GG3212313E", this);} // tgen
aaa::GG3212313 ::GG3212313(){ note_ctor("_ZN3aaa9GG3212313E", this);} // tgen
}
static void Test__ZN3aaa9GG3212313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212313E, buf);
    ::aaa::GG3212313 *dp, &lv = *(dp=new (buf) ::aaa::GG3212313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212313E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3212313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3212313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3212313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212313E);
    dp->::aaa::GG3212313::~GG3212313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212313E(Test__ZN3aaa9GG3212313E, "_ZN3aaa9GG3212313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212313C1Ev();
extern void _ZN3aaa9GG3212313D1Ev();
Name_Map name_map__ZN3aaa9GG3212313E[] = {
  NSPAIR(_ZN3aaa9GG3212313C1Ev),
  NSPAIR(_ZN3aaa9GG3212313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3212313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212313E[];
extern void _ZN3aaa9GG32123133fooEv();
extern void _ZN3aaa9GG32123133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32123133barEv,_ZThn8_N3aaa9GG32123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32123133barEv,_ZThn20_N3aaa9GG32123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32123133fooEv,_ZThn20_N3aaa9GG32123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123133fooEv,_ZThn28_N3aaa9GG32123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123133barEv,_ZThn28_N3aaa9GG32123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32123133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32123133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32123133barEv,_ZThn8_N3aaa9GG32123133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123133barEv,_ZThn20_N3aaa9GG32123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123133fooEv,_ZThn20_N3aaa9GG32123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123133fooEv,_ZThn28_N3aaa9GG32123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123133barEv,_ZThn28_N3aaa9GG32123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212313E[];
Class_Descriptor cd__ZN3aaa9GG3212313E = {  "_ZN3aaa9GG3212313E", // class name
  bases__ZN3aaa9GG3212313E, 6,
  &(vtc__ZN3aaa9GG3212313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212321  : ::aaa::EE321 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32123213fooEv
  ~GG3212321(); // tgen
  GG3212321(); // tgen
};
//SIG(1 _ZN3aaa9GG3212321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32123213fooEv");}
aaa::GG3212321 ::~GG3212321(){ note_dtor("_ZN3aaa9GG3212321E", this);} // tgen
aaa::GG3212321 ::GG3212321(){ note_ctor("_ZN3aaa9GG3212321E", this);} // tgen
}
static void Test__ZN3aaa9GG3212321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212321E, buf);
    ::aaa::GG3212321 *dp, &lv = *(dp=new (buf) ::aaa::GG3212321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212321E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3212321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3212321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3212321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212321E);
    dp->::aaa::GG3212321::~GG3212321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212321E(Test__ZN3aaa9GG3212321E, "_ZN3aaa9GG3212321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212321C1Ev();
extern void _ZN3aaa9GG3212321D1Ev();
Name_Map name_map__ZN3aaa9GG3212321E[] = {
  NSPAIR(_ZN3aaa9GG3212321C1Ev),
  NSPAIR(_ZN3aaa9GG3212321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3212321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212321E[];
extern void _ZN3aaa9GG32123213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32123213fooEv,_ZThn28_N3aaa9GG32123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32123213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123213fooEv,_ZThn28_N3aaa9GG32123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212321E[];
Class_Descriptor cd__ZN3aaa9GG3212321E = {  "_ZN3aaa9GG3212321E", // class name
  bases__ZN3aaa9GG3212321E, 6,
  &(vtc__ZN3aaa9GG3212321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212322  : ::aaa::EE321 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32123223barEv
  ~GG3212322(); // tgen
  GG3212322(); // tgen
};
//SIG(1 _ZN3aaa9GG3212322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32123223barEv");}
aaa::GG3212322 ::~GG3212322(){ note_dtor("_ZN3aaa9GG3212322E", this);} // tgen
aaa::GG3212322 ::GG3212322(){ note_ctor("_ZN3aaa9GG3212322E", this);} // tgen
}
static void Test__ZN3aaa9GG3212322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212322E, buf);
    ::aaa::GG3212322 *dp, &lv = *(dp=new (buf) ::aaa::GG3212322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212322E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3212322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3212322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3212322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212322E);
    dp->::aaa::GG3212322::~GG3212322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212322E(Test__ZN3aaa9GG3212322E, "_ZN3aaa9GG3212322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212322C1Ev();
extern void _ZN3aaa9GG3212322D1Ev();
Name_Map name_map__ZN3aaa9GG3212322E[] = {
  NSPAIR(_ZN3aaa9GG3212322C1Ev),
  NSPAIR(_ZN3aaa9GG3212322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3212322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212322E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32123223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32123223barEv,_ZThn8_N3aaa9GG32123223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32123223barEv,_ZThn20_N3aaa9GG32123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32123223barEv,_ZThn28_N3aaa9GG32123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32123223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32123223barEv,_ZThn8_N3aaa9GG32123223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123223barEv,_ZThn20_N3aaa9GG32123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123223barEv,_ZThn28_N3aaa9GG32123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212322E[];
Class_Descriptor cd__ZN3aaa9GG3212322E = {  "_ZN3aaa9GG3212322E", // class name
  bases__ZN3aaa9GG3212322E, 6,
  &(vtc__ZN3aaa9GG3212322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212323  : ::aaa::EE321 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32123233fooEv
  virtual void  bar(); // _ZN3aaa9GG32123233barEv
  ~GG3212323(); // tgen
  GG3212323(); // tgen
};
//SIG(1 _ZN3aaa9GG3212323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32123233fooEv");}
void  aaa::GG3212323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32123233barEv");}
aaa::GG3212323 ::~GG3212323(){ note_dtor("_ZN3aaa9GG3212323E", this);} // tgen
aaa::GG3212323 ::GG3212323(){ note_ctor("_ZN3aaa9GG3212323E", this);} // tgen
}
static void Test__ZN3aaa9GG3212323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212323E, buf);
    ::aaa::GG3212323 *dp, &lv = *(dp=new (buf) ::aaa::GG3212323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212323E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3212323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3212323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3212323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212323E);
    dp->::aaa::GG3212323::~GG3212323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212323E(Test__ZN3aaa9GG3212323E, "_ZN3aaa9GG3212323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212323C1Ev();
extern void _ZN3aaa9GG3212323D1Ev();
Name_Map name_map__ZN3aaa9GG3212323E[] = {
  NSPAIR(_ZN3aaa9GG3212323C1Ev),
  NSPAIR(_ZN3aaa9GG3212323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3212323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212323E[];
extern void _ZN3aaa9GG32123233fooEv();
extern void _ZN3aaa9GG32123233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32123233barEv,_ZThn8_N3aaa9GG32123233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32123233barEv,_ZThn20_N3aaa9GG32123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123233fooEv,_ZThn28_N3aaa9GG32123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123233barEv,_ZThn28_N3aaa9GG32123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32123233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32123233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32123233barEv,_ZThn8_N3aaa9GG32123233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123233barEv,_ZThn20_N3aaa9GG32123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123233fooEv,_ZThn28_N3aaa9GG32123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123233barEv,_ZThn28_N3aaa9GG32123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212323E[];
Class_Descriptor cd__ZN3aaa9GG3212323E = {  "_ZN3aaa9GG3212323E", // class name
  bases__ZN3aaa9GG3212323E, 6,
  &(vtc__ZN3aaa9GG3212323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212331  : ::aaa::EE321 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32123313fooEv
  ~GG3212331(); // tgen
  GG3212331(); // tgen
};
//SIG(1 _ZN3aaa9GG3212331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32123313fooEv");}
aaa::GG3212331 ::~GG3212331(){ note_dtor("_ZN3aaa9GG3212331E", this);} // tgen
aaa::GG3212331 ::GG3212331(){ note_ctor("_ZN3aaa9GG3212331E", this);} // tgen
}
static void Test__ZN3aaa9GG3212331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212331E, buf);
    ::aaa::GG3212331 *dp, &lv = *(dp=new (buf) ::aaa::GG3212331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212331E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3212331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3212331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3212331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212331E);
    dp->::aaa::GG3212331::~GG3212331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212331E(Test__ZN3aaa9GG3212331E, "_ZN3aaa9GG3212331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212331C1Ev();
extern void _ZN3aaa9GG3212331D1Ev();
Name_Map name_map__ZN3aaa9GG3212331E[] = {
  NSPAIR(_ZN3aaa9GG3212331C1Ev),
  NSPAIR(_ZN3aaa9GG3212331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3212331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212331E[];
extern void _ZN3aaa9GG32123313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32123313fooEv,_ZThn20_N3aaa9GG32123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123313fooEv,_ZThn28_N3aaa9GG32123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32123313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123313fooEv,_ZThn20_N3aaa9GG32123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123313fooEv,_ZThn28_N3aaa9GG32123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212331E[];
Class_Descriptor cd__ZN3aaa9GG3212331E = {  "_ZN3aaa9GG3212331E", // class name
  bases__ZN3aaa9GG3212331E, 6,
  &(vtc__ZN3aaa9GG3212331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212332  : ::aaa::EE321 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32123323barEv
  ~GG3212332(); // tgen
  GG3212332(); // tgen
};
//SIG(1 _ZN3aaa9GG3212332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3212332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32123323barEv");}
aaa::GG3212332 ::~GG3212332(){ note_dtor("_ZN3aaa9GG3212332E", this);} // tgen
aaa::GG3212332 ::GG3212332(){ note_ctor("_ZN3aaa9GG3212332E", this);} // tgen
}
static void Test__ZN3aaa9GG3212332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212332E, buf);
    ::aaa::GG3212332 *dp, &lv = *(dp=new (buf) ::aaa::GG3212332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212332E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3212332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3212332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3212332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212332E);
    dp->::aaa::GG3212332::~GG3212332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212332E(Test__ZN3aaa9GG3212332E, "_ZN3aaa9GG3212332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212332C1Ev();
extern void _ZN3aaa9GG3212332D1Ev();
Name_Map name_map__ZN3aaa9GG3212332E[] = {
  NSPAIR(_ZN3aaa9GG3212332C1Ev),
  NSPAIR(_ZN3aaa9GG3212332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3212332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212332E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32123323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32123323barEv,_ZThn8_N3aaa9GG32123323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32123323barEv,_ZThn20_N3aaa9GG32123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123323barEv,_ZThn28_N3aaa9GG32123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32123323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32123323barEv,_ZThn8_N3aaa9GG32123323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123323barEv,_ZThn20_N3aaa9GG32123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123323barEv,_ZThn28_N3aaa9GG32123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212332E[];
Class_Descriptor cd__ZN3aaa9GG3212332E = {  "_ZN3aaa9GG3212332E", // class name
  bases__ZN3aaa9GG3212332E, 6,
  &(vtc__ZN3aaa9GG3212332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3212333  : ::aaa::EE321 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32123333fooEv
  virtual void  bar(); // _ZN3aaa9GG32123333barEv
  ~GG3212333(); // tgen
  GG3212333(); // tgen
};
//SIG(1 _ZN3aaa9GG3212333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3212333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32123333fooEv");}
void  aaa::GG3212333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32123333barEv");}
aaa::GG3212333 ::~GG3212333(){ note_dtor("_ZN3aaa9GG3212333E", this);} // tgen
aaa::GG3212333 ::GG3212333(){ note_ctor("_ZN3aaa9GG3212333E", this);} // tgen
}
static void Test__ZN3aaa9GG3212333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3212333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3212333E, buf);
    ::aaa::GG3212333 *dp, &lv = *(dp=new (buf) ::aaa::GG3212333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3212333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3212333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3212333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3212333E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3212333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3212333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3212333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3212333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3212333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3212333E);
    dp->::aaa::GG3212333::~GG3212333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3212333E(Test__ZN3aaa9GG3212333E, "_ZN3aaa9GG3212333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3212333C1Ev();
extern void _ZN3aaa9GG3212333D1Ev();
Name_Map name_map__ZN3aaa9GG3212333E[] = {
  NSPAIR(_ZN3aaa9GG3212333C1Ev),
  NSPAIR(_ZN3aaa9GG3212333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3212333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3212333E[];
extern void _ZN3aaa9GG32123333fooEv();
extern void _ZN3aaa9GG32123333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32123333barEv,_ZThn8_N3aaa9GG32123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32123333barEv,_ZThn20_N3aaa9GG32123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32123333fooEv,_ZThn20_N3aaa9GG32123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123333fooEv,_ZThn28_N3aaa9GG32123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32123333barEv,_ZThn28_N3aaa9GG32123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3212333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32123333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32123333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32123333barEv,_ZThn8_N3aaa9GG32123333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123333barEv,_ZThn20_N3aaa9GG32123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32123333fooEv,_ZThn20_N3aaa9GG32123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3212333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123333fooEv,_ZThn28_N3aaa9GG32123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32123333barEv,_ZThn28_N3aaa9GG32123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3212333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3212333E[];
Class_Descriptor cd__ZN3aaa9GG3212333E = {  "_ZN3aaa9GG3212333E", // class name
  bases__ZN3aaa9GG3212333E, 6,
  &(vtc__ZN3aaa9GG3212333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3212333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3212333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213111  : ::aaa::EE321 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32131113fooEv
  ~GG3213111(); // tgen
  GG3213111(); // tgen
};
//SIG(1 _ZN3aaa9GG3213111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32131113fooEv");}
aaa::GG3213111 ::~GG3213111(){ note_dtor("_ZN3aaa9GG3213111E", this);} // tgen
aaa::GG3213111 ::GG3213111(){ note_ctor("_ZN3aaa9GG3213111E", this);} // tgen
}
static void Test__ZN3aaa9GG3213111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213111E, buf);
    ::aaa::GG3213111 *dp, &lv = *(dp=new (buf) ::aaa::GG3213111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213111E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3213111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3213111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3213111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213111E);
    dp->::aaa::GG3213111::~GG3213111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213111E(Test__ZN3aaa9GG3213111E, "_ZN3aaa9GG3213111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213111C1Ev();
extern void _ZN3aaa9GG3213111D1Ev();
Name_Map name_map__ZN3aaa9GG3213111E[] = {
  NSPAIR(_ZN3aaa9GG3213111C1Ev),
  NSPAIR(_ZN3aaa9GG3213111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3213111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213111E[];
extern void _ZN3aaa9GG32131113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32131113fooEv,_ZThn20_N3aaa9GG32131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32131113fooEv,_ZThn28_N3aaa9GG32131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32131113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131113fooEv,_ZThn20_N3aaa9GG32131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32131113fooEv,_ZThn28_N3aaa9GG32131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213111E[];
Class_Descriptor cd__ZN3aaa9GG3213111E = {  "_ZN3aaa9GG3213111E", // class name
  bases__ZN3aaa9GG3213111E, 6,
  &(vtc__ZN3aaa9GG3213111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213112  : ::aaa::EE321 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32131123barEv
  ~GG3213112(); // tgen
  GG3213112(); // tgen
};
//SIG(1 _ZN3aaa9GG3213112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32131123barEv");}
aaa::GG3213112 ::~GG3213112(){ note_dtor("_ZN3aaa9GG3213112E", this);} // tgen
aaa::GG3213112 ::GG3213112(){ note_ctor("_ZN3aaa9GG3213112E", this);} // tgen
}
static void Test__ZN3aaa9GG3213112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213112E, buf);
    ::aaa::GG3213112 *dp, &lv = *(dp=new (buf) ::aaa::GG3213112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213112E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3213112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3213112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3213112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213112E);
    dp->::aaa::GG3213112::~GG3213112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213112E(Test__ZN3aaa9GG3213112E, "_ZN3aaa9GG3213112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213112C1Ev();
extern void _ZN3aaa9GG3213112D1Ev();
Name_Map name_map__ZN3aaa9GG3213112E[] = {
  NSPAIR(_ZN3aaa9GG3213112C1Ev),
  NSPAIR(_ZN3aaa9GG3213112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3213112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213112E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32131123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32131123barEv,_ZThn8_N3aaa9GG32131123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32131123barEv,_ZThn20_N3aaa9GG32131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32131123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32131123barEv,_ZThn8_N3aaa9GG32131123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131123barEv,_ZThn20_N3aaa9GG32131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213112E[];
Class_Descriptor cd__ZN3aaa9GG3213112E = {  "_ZN3aaa9GG3213112E", // class name
  bases__ZN3aaa9GG3213112E, 6,
  &(vtc__ZN3aaa9GG3213112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213113  : ::aaa::EE321 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32131133fooEv
  virtual void  bar(); // _ZN3aaa9GG32131133barEv
  ~GG3213113(); // tgen
  GG3213113(); // tgen
};
//SIG(1 _ZN3aaa9GG3213113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32131133fooEv");}
void  aaa::GG3213113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32131133barEv");}
aaa::GG3213113 ::~GG3213113(){ note_dtor("_ZN3aaa9GG3213113E", this);} // tgen
aaa::GG3213113 ::GG3213113(){ note_ctor("_ZN3aaa9GG3213113E", this);} // tgen
}
static void Test__ZN3aaa9GG3213113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213113E, buf);
    ::aaa::GG3213113 *dp, &lv = *(dp=new (buf) ::aaa::GG3213113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213113E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3213113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3213113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3213113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213113E);
    dp->::aaa::GG3213113::~GG3213113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213113E(Test__ZN3aaa9GG3213113E, "_ZN3aaa9GG3213113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213113C1Ev();
extern void _ZN3aaa9GG3213113D1Ev();
Name_Map name_map__ZN3aaa9GG3213113E[] = {
  NSPAIR(_ZN3aaa9GG3213113C1Ev),
  NSPAIR(_ZN3aaa9GG3213113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3213113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213113E[];
extern void _ZN3aaa9GG32131133fooEv();
extern void _ZN3aaa9GG32131133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32131133barEv,_ZThn8_N3aaa9GG32131133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32131133fooEv,_ZThn20_N3aaa9GG32131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32131133barEv,_ZThn20_N3aaa9GG32131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32131133fooEv,_ZThn28_N3aaa9GG32131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32131133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32131133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32131133barEv,_ZThn8_N3aaa9GG32131133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131133fooEv,_ZThn20_N3aaa9GG32131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131133barEv,_ZThn20_N3aaa9GG32131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32131133fooEv,_ZThn28_N3aaa9GG32131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213113E[];
Class_Descriptor cd__ZN3aaa9GG3213113E = {  "_ZN3aaa9GG3213113E", // class name
  bases__ZN3aaa9GG3213113E, 6,
  &(vtc__ZN3aaa9GG3213113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213121  : ::aaa::EE321 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32131213fooEv
  ~GG3213121(); // tgen
  GG3213121(); // tgen
};
//SIG(1 _ZN3aaa9GG3213121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32131213fooEv");}
aaa::GG3213121 ::~GG3213121(){ note_dtor("_ZN3aaa9GG3213121E", this);} // tgen
aaa::GG3213121 ::GG3213121(){ note_ctor("_ZN3aaa9GG3213121E", this);} // tgen
}
static void Test__ZN3aaa9GG3213121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213121E, buf);
    ::aaa::GG3213121 *dp, &lv = *(dp=new (buf) ::aaa::GG3213121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213121E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3213121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3213121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3213121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213121E);
    dp->::aaa::GG3213121::~GG3213121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213121E(Test__ZN3aaa9GG3213121E, "_ZN3aaa9GG3213121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213121C1Ev();
extern void _ZN3aaa9GG3213121D1Ev();
Name_Map name_map__ZN3aaa9GG3213121E[] = {
  NSPAIR(_ZN3aaa9GG3213121C1Ev),
  NSPAIR(_ZN3aaa9GG3213121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3213121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213121E[];
extern void _ZN3aaa9GG32131213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32131213fooEv,_ZThn20_N3aaa9GG32131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32131213fooEv,_ZThn28_N3aaa9GG32131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32131213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213121E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131213fooEv,_ZThn20_N3aaa9GG32131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32131213fooEv,_ZThn28_N3aaa9GG32131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213121E[];
Class_Descriptor cd__ZN3aaa9GG3213121E = {  "_ZN3aaa9GG3213121E", // class name
  bases__ZN3aaa9GG3213121E, 6,
  &(vtc__ZN3aaa9GG3213121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213122  : ::aaa::EE321 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32131223barEv
  ~GG3213122(); // tgen
  GG3213122(); // tgen
};
//SIG(1 _ZN3aaa9GG3213122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32131223barEv");}
aaa::GG3213122 ::~GG3213122(){ note_dtor("_ZN3aaa9GG3213122E", this);} // tgen
aaa::GG3213122 ::GG3213122(){ note_ctor("_ZN3aaa9GG3213122E", this);} // tgen
}
static void Test__ZN3aaa9GG3213122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213122E, buf);
    ::aaa::GG3213122 *dp, &lv = *(dp=new (buf) ::aaa::GG3213122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213122E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3213122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3213122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3213122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213122E);
    dp->::aaa::GG3213122::~GG3213122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213122E(Test__ZN3aaa9GG3213122E, "_ZN3aaa9GG3213122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213122C1Ev();
extern void _ZN3aaa9GG3213122D1Ev();
Name_Map name_map__ZN3aaa9GG3213122E[] = {
  NSPAIR(_ZN3aaa9GG3213122C1Ev),
  NSPAIR(_ZN3aaa9GG3213122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3213122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213122E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32131223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32131223barEv,_ZThn8_N3aaa9GG32131223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32131223barEv,_ZThn20_N3aaa9GG32131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32131223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32131223barEv,_ZThn8_N3aaa9GG32131223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131223barEv,_ZThn20_N3aaa9GG32131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213122E[];
Class_Descriptor cd__ZN3aaa9GG3213122E = {  "_ZN3aaa9GG3213122E", // class name
  bases__ZN3aaa9GG3213122E, 6,
  &(vtc__ZN3aaa9GG3213122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213123  : ::aaa::EE321 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32131233fooEv
  virtual void  bar(); // _ZN3aaa9GG32131233barEv
  ~GG3213123(); // tgen
  GG3213123(); // tgen
};
//SIG(1 _ZN3aaa9GG3213123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32131233fooEv");}
void  aaa::GG3213123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32131233barEv");}
aaa::GG3213123 ::~GG3213123(){ note_dtor("_ZN3aaa9GG3213123E", this);} // tgen
aaa::GG3213123 ::GG3213123(){ note_ctor("_ZN3aaa9GG3213123E", this);} // tgen
}
static void Test__ZN3aaa9GG3213123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213123E, buf);
    ::aaa::GG3213123 *dp, &lv = *(dp=new (buf) ::aaa::GG3213123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213123E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3213123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3213123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3213123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213123E);
    dp->::aaa::GG3213123::~GG3213123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213123E(Test__ZN3aaa9GG3213123E, "_ZN3aaa9GG3213123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213123C1Ev();
extern void _ZN3aaa9GG3213123D1Ev();
Name_Map name_map__ZN3aaa9GG3213123E[] = {
  NSPAIR(_ZN3aaa9GG3213123C1Ev),
  NSPAIR(_ZN3aaa9GG3213123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3213123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213123E[];
extern void _ZN3aaa9GG32131233fooEv();
extern void _ZN3aaa9GG32131233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32131233barEv,_ZThn8_N3aaa9GG32131233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32131233fooEv,_ZThn20_N3aaa9GG32131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32131233barEv,_ZThn20_N3aaa9GG32131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32131233fooEv,_ZThn28_N3aaa9GG32131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32131233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32131233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32131233barEv,_ZThn8_N3aaa9GG32131233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131233fooEv,_ZThn20_N3aaa9GG32131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131233barEv,_ZThn20_N3aaa9GG32131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32131233fooEv,_ZThn28_N3aaa9GG32131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213123E[];
Class_Descriptor cd__ZN3aaa9GG3213123E = {  "_ZN3aaa9GG3213123E", // class name
  bases__ZN3aaa9GG3213123E, 6,
  &(vtc__ZN3aaa9GG3213123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213131  : ::aaa::EE321 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32131313fooEv
  ~GG3213131(); // tgen
  GG3213131(); // tgen
};
//SIG(1 _ZN3aaa9GG3213131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32131313fooEv");}
aaa::GG3213131 ::~GG3213131(){ note_dtor("_ZN3aaa9GG3213131E", this);} // tgen
aaa::GG3213131 ::GG3213131(){ note_ctor("_ZN3aaa9GG3213131E", this);} // tgen
}
static void Test__ZN3aaa9GG3213131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213131E, buf);
    ::aaa::GG3213131 *dp, &lv = *(dp=new (buf) ::aaa::GG3213131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213131E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3213131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3213131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3213131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213131E);
    dp->::aaa::GG3213131::~GG3213131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213131E(Test__ZN3aaa9GG3213131E, "_ZN3aaa9GG3213131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213131C1Ev();
extern void _ZN3aaa9GG3213131D1Ev();
Name_Map name_map__ZN3aaa9GG3213131E[] = {
  NSPAIR(_ZN3aaa9GG3213131C1Ev),
  NSPAIR(_ZN3aaa9GG3213131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3213131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213131E[];
extern void _ZN3aaa9GG32131313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32131313fooEv,_ZThn20_N3aaa9GG32131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32131313fooEv,_ZThn28_N3aaa9GG32131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32131313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213131E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131313fooEv,_ZThn20_N3aaa9GG32131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32131313fooEv,_ZThn28_N3aaa9GG32131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213131E[];
Class_Descriptor cd__ZN3aaa9GG3213131E = {  "_ZN3aaa9GG3213131E", // class name
  bases__ZN3aaa9GG3213131E, 6,
  &(vtc__ZN3aaa9GG3213131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213132  : ::aaa::EE321 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32131323barEv
  ~GG3213132(); // tgen
  GG3213132(); // tgen
};
//SIG(1 _ZN3aaa9GG3213132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32131323barEv");}
aaa::GG3213132 ::~GG3213132(){ note_dtor("_ZN3aaa9GG3213132E", this);} // tgen
aaa::GG3213132 ::GG3213132(){ note_ctor("_ZN3aaa9GG3213132E", this);} // tgen
}
static void Test__ZN3aaa9GG3213132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213132E, buf);
    ::aaa::GG3213132 *dp, &lv = *(dp=new (buf) ::aaa::GG3213132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213132E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3213132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3213132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3213132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213132E);
    dp->::aaa::GG3213132::~GG3213132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213132E(Test__ZN3aaa9GG3213132E, "_ZN3aaa9GG3213132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213132C1Ev();
extern void _ZN3aaa9GG3213132D1Ev();
Name_Map name_map__ZN3aaa9GG3213132E[] = {
  NSPAIR(_ZN3aaa9GG3213132C1Ev),
  NSPAIR(_ZN3aaa9GG3213132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3213132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213132E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32131323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32131323barEv,_ZThn8_N3aaa9GG32131323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32131323barEv,_ZThn20_N3aaa9GG32131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32131323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32131323barEv,_ZThn8_N3aaa9GG32131323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131323barEv,_ZThn20_N3aaa9GG32131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213132E[];
Class_Descriptor cd__ZN3aaa9GG3213132E = {  "_ZN3aaa9GG3213132E", // class name
  bases__ZN3aaa9GG3213132E, 6,
  &(vtc__ZN3aaa9GG3213132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213133  : ::aaa::EE321 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32131333fooEv
  virtual void  bar(); // _ZN3aaa9GG32131333barEv
  ~GG3213133(); // tgen
  GG3213133(); // tgen
};
//SIG(1 _ZN3aaa9GG3213133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32131333fooEv");}
void  aaa::GG3213133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32131333barEv");}
aaa::GG3213133 ::~GG3213133(){ note_dtor("_ZN3aaa9GG3213133E", this);} // tgen
aaa::GG3213133 ::GG3213133(){ note_ctor("_ZN3aaa9GG3213133E", this);} // tgen
}
static void Test__ZN3aaa9GG3213133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213133E, buf);
    ::aaa::GG3213133 *dp, &lv = *(dp=new (buf) ::aaa::GG3213133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213133E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3213133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3213133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3213133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213133E);
    dp->::aaa::GG3213133::~GG3213133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213133E(Test__ZN3aaa9GG3213133E, "_ZN3aaa9GG3213133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213133C1Ev();
extern void _ZN3aaa9GG3213133D1Ev();
Name_Map name_map__ZN3aaa9GG3213133E[] = {
  NSPAIR(_ZN3aaa9GG3213133C1Ev),
  NSPAIR(_ZN3aaa9GG3213133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3213133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213133E[];
extern void _ZN3aaa9GG32131333fooEv();
extern void _ZN3aaa9GG32131333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32131333barEv,_ZThn8_N3aaa9GG32131333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32131333fooEv,_ZThn20_N3aaa9GG32131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32131333barEv,_ZThn20_N3aaa9GG32131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32131333fooEv,_ZThn28_N3aaa9GG32131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32131333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32131333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32131333barEv,_ZThn8_N3aaa9GG32131333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131333fooEv,_ZThn20_N3aaa9GG32131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32131333barEv,_ZThn20_N3aaa9GG32131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32131333fooEv,_ZThn28_N3aaa9GG32131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213133E[];
Class_Descriptor cd__ZN3aaa9GG3213133E = {  "_ZN3aaa9GG3213133E", // class name
  bases__ZN3aaa9GG3213133E, 6,
  &(vtc__ZN3aaa9GG3213133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213211  : ::aaa::EE321 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32132113fooEv
  ~GG3213211(); // tgen
  GG3213211(); // tgen
};
//SIG(1 _ZN3aaa9GG3213211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32132113fooEv");}
aaa::GG3213211 ::~GG3213211(){ note_dtor("_ZN3aaa9GG3213211E", this);} // tgen
aaa::GG3213211 ::GG3213211(){ note_ctor("_ZN3aaa9GG3213211E", this);} // tgen
}
static void Test__ZN3aaa9GG3213211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213211E, buf);
    ::aaa::GG3213211 *dp, &lv = *(dp=new (buf) ::aaa::GG3213211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213211E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3213211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3213211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3213211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213211E);
    dp->::aaa::GG3213211::~GG3213211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213211E(Test__ZN3aaa9GG3213211E, "_ZN3aaa9GG3213211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213211C1Ev();
extern void _ZN3aaa9GG3213211D1Ev();
Name_Map name_map__ZN3aaa9GG3213211E[] = {
  NSPAIR(_ZN3aaa9GG3213211C1Ev),
  NSPAIR(_ZN3aaa9GG3213211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3213211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213211E[];
extern void _ZN3aaa9GG32132113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32132113fooEv,_ZThn20_N3aaa9GG32132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32132113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132113fooEv,_ZThn20_N3aaa9GG32132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213211E[];
Class_Descriptor cd__ZN3aaa9GG3213211E = {  "_ZN3aaa9GG3213211E", // class name
  bases__ZN3aaa9GG3213211E, 6,
  &(vtc__ZN3aaa9GG3213211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213212  : ::aaa::EE321 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32132123barEv
  ~GG3213212(); // tgen
  GG3213212(); // tgen
};
//SIG(1 _ZN3aaa9GG3213212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32132123barEv");}
aaa::GG3213212 ::~GG3213212(){ note_dtor("_ZN3aaa9GG3213212E", this);} // tgen
aaa::GG3213212 ::GG3213212(){ note_ctor("_ZN3aaa9GG3213212E", this);} // tgen
}
static void Test__ZN3aaa9GG3213212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213212E, buf);
    ::aaa::GG3213212 *dp, &lv = *(dp=new (buf) ::aaa::GG3213212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213212E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3213212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3213212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3213212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213212E);
    dp->::aaa::GG3213212::~GG3213212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213212E(Test__ZN3aaa9GG3213212E, "_ZN3aaa9GG3213212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213212C1Ev();
extern void _ZN3aaa9GG3213212D1Ev();
Name_Map name_map__ZN3aaa9GG3213212E[] = {
  NSPAIR(_ZN3aaa9GG3213212C1Ev),
  NSPAIR(_ZN3aaa9GG3213212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3213212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213212E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32132123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32132123barEv,_ZThn8_N3aaa9GG32132123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32132123barEv,_ZThn20_N3aaa9GG32132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32132123barEv,_ZThn28_N3aaa9GG32132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32132123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32132123barEv,_ZThn8_N3aaa9GG32132123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132123barEv,_ZThn20_N3aaa9GG32132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32132123barEv,_ZThn28_N3aaa9GG32132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213212E[];
Class_Descriptor cd__ZN3aaa9GG3213212E = {  "_ZN3aaa9GG3213212E", // class name
  bases__ZN3aaa9GG3213212E, 6,
  &(vtc__ZN3aaa9GG3213212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213213  : ::aaa::EE321 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32132133fooEv
  virtual void  bar(); // _ZN3aaa9GG32132133barEv
  ~GG3213213(); // tgen
  GG3213213(); // tgen
};
//SIG(1 _ZN3aaa9GG3213213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32132133fooEv");}
void  aaa::GG3213213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32132133barEv");}
aaa::GG3213213 ::~GG3213213(){ note_dtor("_ZN3aaa9GG3213213E", this);} // tgen
aaa::GG3213213 ::GG3213213(){ note_ctor("_ZN3aaa9GG3213213E", this);} // tgen
}
static void Test__ZN3aaa9GG3213213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213213E, buf);
    ::aaa::GG3213213 *dp, &lv = *(dp=new (buf) ::aaa::GG3213213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213213E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3213213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3213213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3213213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213213E);
    dp->::aaa::GG3213213::~GG3213213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213213E(Test__ZN3aaa9GG3213213E, "_ZN3aaa9GG3213213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213213C1Ev();
extern void _ZN3aaa9GG3213213D1Ev();
Name_Map name_map__ZN3aaa9GG3213213E[] = {
  NSPAIR(_ZN3aaa9GG3213213C1Ev),
  NSPAIR(_ZN3aaa9GG3213213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3213213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213213E[];
extern void _ZN3aaa9GG32132133fooEv();
extern void _ZN3aaa9GG32132133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32132133barEv,_ZThn8_N3aaa9GG32132133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32132133fooEv,_ZThn20_N3aaa9GG32132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32132133barEv,_ZThn20_N3aaa9GG32132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32132133barEv,_ZThn28_N3aaa9GG32132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32132133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32132133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32132133barEv,_ZThn8_N3aaa9GG32132133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132133fooEv,_ZThn20_N3aaa9GG32132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132133barEv,_ZThn20_N3aaa9GG32132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32132133barEv,_ZThn28_N3aaa9GG32132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213213E[];
Class_Descriptor cd__ZN3aaa9GG3213213E = {  "_ZN3aaa9GG3213213E", // class name
  bases__ZN3aaa9GG3213213E, 6,
  &(vtc__ZN3aaa9GG3213213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213221  : ::aaa::EE321 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32132213fooEv
  ~GG3213221(); // tgen
  GG3213221(); // tgen
};
//SIG(1 _ZN3aaa9GG3213221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32132213fooEv");}
aaa::GG3213221 ::~GG3213221(){ note_dtor("_ZN3aaa9GG3213221E", this);} // tgen
aaa::GG3213221 ::GG3213221(){ note_ctor("_ZN3aaa9GG3213221E", this);} // tgen
}
static void Test__ZN3aaa9GG3213221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213221E, buf);
    ::aaa::GG3213221 *dp, &lv = *(dp=new (buf) ::aaa::GG3213221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213221E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3213221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3213221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3213221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213221E);
    dp->::aaa::GG3213221::~GG3213221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213221E(Test__ZN3aaa9GG3213221E, "_ZN3aaa9GG3213221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213221C1Ev();
extern void _ZN3aaa9GG3213221D1Ev();
Name_Map name_map__ZN3aaa9GG3213221E[] = {
  NSPAIR(_ZN3aaa9GG3213221C1Ev),
  NSPAIR(_ZN3aaa9GG3213221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3213221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213221E[];
extern void _ZN3aaa9GG32132213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32132213fooEv,_ZThn20_N3aaa9GG32132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32132213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213221E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132213fooEv,_ZThn20_N3aaa9GG32132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213221E[];
Class_Descriptor cd__ZN3aaa9GG3213221E = {  "_ZN3aaa9GG3213221E", // class name
  bases__ZN3aaa9GG3213221E, 6,
  &(vtc__ZN3aaa9GG3213221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213222  : ::aaa::EE321 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32132223barEv
  ~GG3213222(); // tgen
  GG3213222(); // tgen
};
//SIG(1 _ZN3aaa9GG3213222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32132223barEv");}
aaa::GG3213222 ::~GG3213222(){ note_dtor("_ZN3aaa9GG3213222E", this);} // tgen
aaa::GG3213222 ::GG3213222(){ note_ctor("_ZN3aaa9GG3213222E", this);} // tgen
}
static void Test__ZN3aaa9GG3213222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213222E, buf);
    ::aaa::GG3213222 *dp, &lv = *(dp=new (buf) ::aaa::GG3213222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213222E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3213222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3213222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3213222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213222E);
    dp->::aaa::GG3213222::~GG3213222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213222E(Test__ZN3aaa9GG3213222E, "_ZN3aaa9GG3213222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213222C1Ev();
extern void _ZN3aaa9GG3213222D1Ev();
Name_Map name_map__ZN3aaa9GG3213222E[] = {
  NSPAIR(_ZN3aaa9GG3213222C1Ev),
  NSPAIR(_ZN3aaa9GG3213222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3213222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213222E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32132223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32132223barEv,_ZThn8_N3aaa9GG32132223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32132223barEv,_ZThn20_N3aaa9GG32132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32132223barEv,_ZThn28_N3aaa9GG32132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32132223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32132223barEv,_ZThn8_N3aaa9GG32132223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132223barEv,_ZThn20_N3aaa9GG32132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32132223barEv,_ZThn28_N3aaa9GG32132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213222E[];
Class_Descriptor cd__ZN3aaa9GG3213222E = {  "_ZN3aaa9GG3213222E", // class name
  bases__ZN3aaa9GG3213222E, 6,
  &(vtc__ZN3aaa9GG3213222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213223  : ::aaa::EE321 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32132233fooEv
  virtual void  bar(); // _ZN3aaa9GG32132233barEv
  ~GG3213223(); // tgen
  GG3213223(); // tgen
};
//SIG(1 _ZN3aaa9GG3213223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32132233fooEv");}
void  aaa::GG3213223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32132233barEv");}
aaa::GG3213223 ::~GG3213223(){ note_dtor("_ZN3aaa9GG3213223E", this);} // tgen
aaa::GG3213223 ::GG3213223(){ note_ctor("_ZN3aaa9GG3213223E", this);} // tgen
}
static void Test__ZN3aaa9GG3213223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213223E, buf);
    ::aaa::GG3213223 *dp, &lv = *(dp=new (buf) ::aaa::GG3213223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213223E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3213223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3213223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3213223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213223E);
    dp->::aaa::GG3213223::~GG3213223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213223E(Test__ZN3aaa9GG3213223E, "_ZN3aaa9GG3213223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213223C1Ev();
extern void _ZN3aaa9GG3213223D1Ev();
Name_Map name_map__ZN3aaa9GG3213223E[] = {
  NSPAIR(_ZN3aaa9GG3213223C1Ev),
  NSPAIR(_ZN3aaa9GG3213223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3213223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213223E[];
extern void _ZN3aaa9GG32132233fooEv();
extern void _ZN3aaa9GG32132233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32132233barEv,_ZThn8_N3aaa9GG32132233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32132233fooEv,_ZThn20_N3aaa9GG32132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32132233barEv,_ZThn20_N3aaa9GG32132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32132233barEv,_ZThn28_N3aaa9GG32132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32132233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32132233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32132233barEv,_ZThn8_N3aaa9GG32132233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132233fooEv,_ZThn20_N3aaa9GG32132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132233barEv,_ZThn20_N3aaa9GG32132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32132233barEv,_ZThn28_N3aaa9GG32132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213223E[];
Class_Descriptor cd__ZN3aaa9GG3213223E = {  "_ZN3aaa9GG3213223E", // class name
  bases__ZN3aaa9GG3213223E, 6,
  &(vtc__ZN3aaa9GG3213223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213231  : ::aaa::EE321 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32132313fooEv
  ~GG3213231(); // tgen
  GG3213231(); // tgen
};
//SIG(1 _ZN3aaa9GG3213231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32132313fooEv");}
aaa::GG3213231 ::~GG3213231(){ note_dtor("_ZN3aaa9GG3213231E", this);} // tgen
aaa::GG3213231 ::GG3213231(){ note_ctor("_ZN3aaa9GG3213231E", this);} // tgen
}
static void Test__ZN3aaa9GG3213231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213231E, buf);
    ::aaa::GG3213231 *dp, &lv = *(dp=new (buf) ::aaa::GG3213231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213231E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3213231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3213231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3213231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213231E);
    dp->::aaa::GG3213231::~GG3213231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213231E(Test__ZN3aaa9GG3213231E, "_ZN3aaa9GG3213231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213231C1Ev();
extern void _ZN3aaa9GG3213231D1Ev();
Name_Map name_map__ZN3aaa9GG3213231E[] = {
  NSPAIR(_ZN3aaa9GG3213231C1Ev),
  NSPAIR(_ZN3aaa9GG3213231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3213231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213231E[];
extern void _ZN3aaa9GG32132313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32132313fooEv,_ZThn20_N3aaa9GG32132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32132313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213231E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132313fooEv,_ZThn20_N3aaa9GG32132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213231E[];
Class_Descriptor cd__ZN3aaa9GG3213231E = {  "_ZN3aaa9GG3213231E", // class name
  bases__ZN3aaa9GG3213231E, 6,
  &(vtc__ZN3aaa9GG3213231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213232  : ::aaa::EE321 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32132323barEv
  ~GG3213232(); // tgen
  GG3213232(); // tgen
};
//SIG(1 _ZN3aaa9GG3213232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32132323barEv");}
aaa::GG3213232 ::~GG3213232(){ note_dtor("_ZN3aaa9GG3213232E", this);} // tgen
aaa::GG3213232 ::GG3213232(){ note_ctor("_ZN3aaa9GG3213232E", this);} // tgen
}
static void Test__ZN3aaa9GG3213232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213232E, buf);
    ::aaa::GG3213232 *dp, &lv = *(dp=new (buf) ::aaa::GG3213232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213232E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3213232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3213232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3213232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213232E);
    dp->::aaa::GG3213232::~GG3213232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213232E(Test__ZN3aaa9GG3213232E, "_ZN3aaa9GG3213232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213232C1Ev();
extern void _ZN3aaa9GG3213232D1Ev();
Name_Map name_map__ZN3aaa9GG3213232E[] = {
  NSPAIR(_ZN3aaa9GG3213232C1Ev),
  NSPAIR(_ZN3aaa9GG3213232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3213232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213232E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32132323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32132323barEv,_ZThn8_N3aaa9GG32132323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32132323barEv,_ZThn20_N3aaa9GG32132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32132323barEv,_ZThn28_N3aaa9GG32132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32132323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32132323barEv,_ZThn8_N3aaa9GG32132323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132323barEv,_ZThn20_N3aaa9GG32132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32132323barEv,_ZThn28_N3aaa9GG32132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213232E[];
Class_Descriptor cd__ZN3aaa9GG3213232E = {  "_ZN3aaa9GG3213232E", // class name
  bases__ZN3aaa9GG3213232E, 6,
  &(vtc__ZN3aaa9GG3213232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213233  : ::aaa::EE321 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32132333fooEv
  virtual void  bar(); // _ZN3aaa9GG32132333barEv
  ~GG3213233(); // tgen
  GG3213233(); // tgen
};
//SIG(1 _ZN3aaa9GG3213233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32132333fooEv");}
void  aaa::GG3213233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32132333barEv");}
aaa::GG3213233 ::~GG3213233(){ note_dtor("_ZN3aaa9GG3213233E", this);} // tgen
aaa::GG3213233 ::GG3213233(){ note_ctor("_ZN3aaa9GG3213233E", this);} // tgen
}
static void Test__ZN3aaa9GG3213233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213233E, buf);
    ::aaa::GG3213233 *dp, &lv = *(dp=new (buf) ::aaa::GG3213233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213233E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3213233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3213233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3213233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213233E);
    dp->::aaa::GG3213233::~GG3213233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213233E(Test__ZN3aaa9GG3213233E, "_ZN3aaa9GG3213233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213233C1Ev();
extern void _ZN3aaa9GG3213233D1Ev();
Name_Map name_map__ZN3aaa9GG3213233E[] = {
  NSPAIR(_ZN3aaa9GG3213233C1Ev),
  NSPAIR(_ZN3aaa9GG3213233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3213233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213233E[];
extern void _ZN3aaa9GG32132333fooEv();
extern void _ZN3aaa9GG32132333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32132333barEv,_ZThn8_N3aaa9GG32132333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32132333fooEv,_ZThn20_N3aaa9GG32132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32132333barEv,_ZThn20_N3aaa9GG32132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32132333barEv,_ZThn28_N3aaa9GG32132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32132333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32132333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32132333barEv,_ZThn8_N3aaa9GG32132333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132333fooEv,_ZThn20_N3aaa9GG32132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32132333barEv,_ZThn20_N3aaa9GG32132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32132333barEv,_ZThn28_N3aaa9GG32132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213233E[];
Class_Descriptor cd__ZN3aaa9GG3213233E = {  "_ZN3aaa9GG3213233E", // class name
  bases__ZN3aaa9GG3213233E, 6,
  &(vtc__ZN3aaa9GG3213233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213311  : ::aaa::EE321 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32133113fooEv
  ~GG3213311(); // tgen
  GG3213311(); // tgen
};
//SIG(1 _ZN3aaa9GG3213311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32133113fooEv");}
aaa::GG3213311 ::~GG3213311(){ note_dtor("_ZN3aaa9GG3213311E", this);} // tgen
aaa::GG3213311 ::GG3213311(){ note_ctor("_ZN3aaa9GG3213311E", this);} // tgen
}
static void Test__ZN3aaa9GG3213311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213311E, buf);
    ::aaa::GG3213311 *dp, &lv = *(dp=new (buf) ::aaa::GG3213311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213311E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3213311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3213311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3213311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213311E);
    dp->::aaa::GG3213311::~GG3213311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213311E(Test__ZN3aaa9GG3213311E, "_ZN3aaa9GG3213311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213311C1Ev();
extern void _ZN3aaa9GG3213311D1Ev();
Name_Map name_map__ZN3aaa9GG3213311E[] = {
  NSPAIR(_ZN3aaa9GG3213311C1Ev),
  NSPAIR(_ZN3aaa9GG3213311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3213311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213311E[];
extern void _ZN3aaa9GG32133113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32133113fooEv,_ZThn20_N3aaa9GG32133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32133113fooEv,_ZThn28_N3aaa9GG32133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32133113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133113fooEv,_ZThn20_N3aaa9GG32133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133113fooEv,_ZThn28_N3aaa9GG32133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213311E[];
Class_Descriptor cd__ZN3aaa9GG3213311E = {  "_ZN3aaa9GG3213311E", // class name
  bases__ZN3aaa9GG3213311E, 6,
  &(vtc__ZN3aaa9GG3213311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213312  : ::aaa::EE321 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32133123barEv
  ~GG3213312(); // tgen
  GG3213312(); // tgen
};
//SIG(1 _ZN3aaa9GG3213312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32133123barEv");}
aaa::GG3213312 ::~GG3213312(){ note_dtor("_ZN3aaa9GG3213312E", this);} // tgen
aaa::GG3213312 ::GG3213312(){ note_ctor("_ZN3aaa9GG3213312E", this);} // tgen
}
static void Test__ZN3aaa9GG3213312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213312E, buf);
    ::aaa::GG3213312 *dp, &lv = *(dp=new (buf) ::aaa::GG3213312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213312E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3213312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3213312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3213312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213312E);
    dp->::aaa::GG3213312::~GG3213312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213312E(Test__ZN3aaa9GG3213312E, "_ZN3aaa9GG3213312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213312C1Ev();
extern void _ZN3aaa9GG3213312D1Ev();
Name_Map name_map__ZN3aaa9GG3213312E[] = {
  NSPAIR(_ZN3aaa9GG3213312C1Ev),
  NSPAIR(_ZN3aaa9GG3213312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3213312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213312E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32133123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32133123barEv,_ZThn8_N3aaa9GG32133123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32133123barEv,_ZThn20_N3aaa9GG32133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32133123barEv,_ZThn28_N3aaa9GG32133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32133123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32133123barEv,_ZThn8_N3aaa9GG32133123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133123barEv,_ZThn20_N3aaa9GG32133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133123barEv,_ZThn28_N3aaa9GG32133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213312E[];
Class_Descriptor cd__ZN3aaa9GG3213312E = {  "_ZN3aaa9GG3213312E", // class name
  bases__ZN3aaa9GG3213312E, 6,
  &(vtc__ZN3aaa9GG3213312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213313  : ::aaa::EE321 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32133133fooEv
  virtual void  bar(); // _ZN3aaa9GG32133133barEv
  ~GG3213313(); // tgen
  GG3213313(); // tgen
};
//SIG(1 _ZN3aaa9GG3213313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32133133fooEv");}
void  aaa::GG3213313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32133133barEv");}
aaa::GG3213313 ::~GG3213313(){ note_dtor("_ZN3aaa9GG3213313E", this);} // tgen
aaa::GG3213313 ::GG3213313(){ note_ctor("_ZN3aaa9GG3213313E", this);} // tgen
}
static void Test__ZN3aaa9GG3213313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213313E, buf);
    ::aaa::GG3213313 *dp, &lv = *(dp=new (buf) ::aaa::GG3213313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213313E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3213313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3213313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3213313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213313E);
    dp->::aaa::GG3213313::~GG3213313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213313E(Test__ZN3aaa9GG3213313E, "_ZN3aaa9GG3213313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213313C1Ev();
extern void _ZN3aaa9GG3213313D1Ev();
Name_Map name_map__ZN3aaa9GG3213313E[] = {
  NSPAIR(_ZN3aaa9GG3213313C1Ev),
  NSPAIR(_ZN3aaa9GG3213313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3213313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213313E[];
extern void _ZN3aaa9GG32133133fooEv();
extern void _ZN3aaa9GG32133133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32133133barEv,_ZThn8_N3aaa9GG32133133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32133133fooEv,_ZThn20_N3aaa9GG32133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32133133barEv,_ZThn20_N3aaa9GG32133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32133133fooEv,_ZThn28_N3aaa9GG32133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32133133barEv,_ZThn28_N3aaa9GG32133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32133133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32133133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32133133barEv,_ZThn8_N3aaa9GG32133133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133133fooEv,_ZThn20_N3aaa9GG32133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133133barEv,_ZThn20_N3aaa9GG32133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133133fooEv,_ZThn28_N3aaa9GG32133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133133barEv,_ZThn28_N3aaa9GG32133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213313E[];
Class_Descriptor cd__ZN3aaa9GG3213313E = {  "_ZN3aaa9GG3213313E", // class name
  bases__ZN3aaa9GG3213313E, 6,
  &(vtc__ZN3aaa9GG3213313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213321  : ::aaa::EE321 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32133213fooEv
  ~GG3213321(); // tgen
  GG3213321(); // tgen
};
//SIG(1 _ZN3aaa9GG3213321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32133213fooEv");}
aaa::GG3213321 ::~GG3213321(){ note_dtor("_ZN3aaa9GG3213321E", this);} // tgen
aaa::GG3213321 ::GG3213321(){ note_ctor("_ZN3aaa9GG3213321E", this);} // tgen
}
static void Test__ZN3aaa9GG3213321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213321E, buf);
    ::aaa::GG3213321 *dp, &lv = *(dp=new (buf) ::aaa::GG3213321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213321E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3213321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3213321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3213321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213321E);
    dp->::aaa::GG3213321::~GG3213321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213321E(Test__ZN3aaa9GG3213321E, "_ZN3aaa9GG3213321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213321C1Ev();
extern void _ZN3aaa9GG3213321D1Ev();
Name_Map name_map__ZN3aaa9GG3213321E[] = {
  NSPAIR(_ZN3aaa9GG3213321C1Ev),
  NSPAIR(_ZN3aaa9GG3213321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3213321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213321E[];
extern void _ZN3aaa9GG32133213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32133213fooEv,_ZThn20_N3aaa9GG32133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32133213fooEv,_ZThn28_N3aaa9GG32133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32133213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213321E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133213fooEv,_ZThn20_N3aaa9GG32133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133213fooEv,_ZThn28_N3aaa9GG32133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213321E[];
Class_Descriptor cd__ZN3aaa9GG3213321E = {  "_ZN3aaa9GG3213321E", // class name
  bases__ZN3aaa9GG3213321E, 6,
  &(vtc__ZN3aaa9GG3213321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213322  : ::aaa::EE321 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32133223barEv
  ~GG3213322(); // tgen
  GG3213322(); // tgen
};
//SIG(1 _ZN3aaa9GG3213322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32133223barEv");}
aaa::GG3213322 ::~GG3213322(){ note_dtor("_ZN3aaa9GG3213322E", this);} // tgen
aaa::GG3213322 ::GG3213322(){ note_ctor("_ZN3aaa9GG3213322E", this);} // tgen
}
static void Test__ZN3aaa9GG3213322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213322E, buf);
    ::aaa::GG3213322 *dp, &lv = *(dp=new (buf) ::aaa::GG3213322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213322E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3213322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3213322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3213322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213322E);
    dp->::aaa::GG3213322::~GG3213322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213322E(Test__ZN3aaa9GG3213322E, "_ZN3aaa9GG3213322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213322C1Ev();
extern void _ZN3aaa9GG3213322D1Ev();
Name_Map name_map__ZN3aaa9GG3213322E[] = {
  NSPAIR(_ZN3aaa9GG3213322C1Ev),
  NSPAIR(_ZN3aaa9GG3213322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3213322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213322E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32133223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32133223barEv,_ZThn8_N3aaa9GG32133223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32133223barEv,_ZThn20_N3aaa9GG32133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32133223barEv,_ZThn28_N3aaa9GG32133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32133223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32133223barEv,_ZThn8_N3aaa9GG32133223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133223barEv,_ZThn20_N3aaa9GG32133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133223barEv,_ZThn28_N3aaa9GG32133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213322E[];
Class_Descriptor cd__ZN3aaa9GG3213322E = {  "_ZN3aaa9GG3213322E", // class name
  bases__ZN3aaa9GG3213322E, 6,
  &(vtc__ZN3aaa9GG3213322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213323  : ::aaa::EE321 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32133233fooEv
  virtual void  bar(); // _ZN3aaa9GG32133233barEv
  ~GG3213323(); // tgen
  GG3213323(); // tgen
};
//SIG(1 _ZN3aaa9GG3213323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32133233fooEv");}
void  aaa::GG3213323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32133233barEv");}
aaa::GG3213323 ::~GG3213323(){ note_dtor("_ZN3aaa9GG3213323E", this);} // tgen
aaa::GG3213323 ::GG3213323(){ note_ctor("_ZN3aaa9GG3213323E", this);} // tgen
}
static void Test__ZN3aaa9GG3213323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213323E, buf);
    ::aaa::GG3213323 *dp, &lv = *(dp=new (buf) ::aaa::GG3213323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213323E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3213323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3213323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3213323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213323E);
    dp->::aaa::GG3213323::~GG3213323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213323E(Test__ZN3aaa9GG3213323E, "_ZN3aaa9GG3213323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213323C1Ev();
extern void _ZN3aaa9GG3213323D1Ev();
Name_Map name_map__ZN3aaa9GG3213323E[] = {
  NSPAIR(_ZN3aaa9GG3213323C1Ev),
  NSPAIR(_ZN3aaa9GG3213323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3213323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213323E[];
extern void _ZN3aaa9GG32133233fooEv();
extern void _ZN3aaa9GG32133233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32133233barEv,_ZThn8_N3aaa9GG32133233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32133233fooEv,_ZThn20_N3aaa9GG32133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32133233barEv,_ZThn20_N3aaa9GG32133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32133233fooEv,_ZThn28_N3aaa9GG32133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32133233barEv,_ZThn28_N3aaa9GG32133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32133233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32133233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32133233barEv,_ZThn8_N3aaa9GG32133233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133233fooEv,_ZThn20_N3aaa9GG32133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133233barEv,_ZThn20_N3aaa9GG32133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133233fooEv,_ZThn28_N3aaa9GG32133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133233barEv,_ZThn28_N3aaa9GG32133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213323E[];
Class_Descriptor cd__ZN3aaa9GG3213323E = {  "_ZN3aaa9GG3213323E", // class name
  bases__ZN3aaa9GG3213323E, 6,
  &(vtc__ZN3aaa9GG3213323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213331  : ::aaa::EE321 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32133313fooEv
  ~GG3213331(); // tgen
  GG3213331(); // tgen
};
//SIG(1 _ZN3aaa9GG3213331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32133313fooEv");}
aaa::GG3213331 ::~GG3213331(){ note_dtor("_ZN3aaa9GG3213331E", this);} // tgen
aaa::GG3213331 ::GG3213331(){ note_ctor("_ZN3aaa9GG3213331E", this);} // tgen
}
static void Test__ZN3aaa9GG3213331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213331E, buf);
    ::aaa::GG3213331 *dp, &lv = *(dp=new (buf) ::aaa::GG3213331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213331E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3213331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3213331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3213331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213331E);
    dp->::aaa::GG3213331::~GG3213331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213331E(Test__ZN3aaa9GG3213331E, "_ZN3aaa9GG3213331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213331C1Ev();
extern void _ZN3aaa9GG3213331D1Ev();
Name_Map name_map__ZN3aaa9GG3213331E[] = {
  NSPAIR(_ZN3aaa9GG3213331C1Ev),
  NSPAIR(_ZN3aaa9GG3213331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3213331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213331E[];
extern void _ZN3aaa9GG32133313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32133313fooEv,_ZThn20_N3aaa9GG32133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32133313fooEv,_ZThn28_N3aaa9GG32133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32133313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213331E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133313fooEv,_ZThn20_N3aaa9GG32133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133313fooEv,_ZThn28_N3aaa9GG32133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213331E[];
Class_Descriptor cd__ZN3aaa9GG3213331E = {  "_ZN3aaa9GG3213331E", // class name
  bases__ZN3aaa9GG3213331E, 6,
  &(vtc__ZN3aaa9GG3213331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213332  : ::aaa::EE321 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32133323barEv
  ~GG3213332(); // tgen
  GG3213332(); // tgen
};
//SIG(1 _ZN3aaa9GG3213332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3213332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32133323barEv");}
aaa::GG3213332 ::~GG3213332(){ note_dtor("_ZN3aaa9GG3213332E", this);} // tgen
aaa::GG3213332 ::GG3213332(){ note_ctor("_ZN3aaa9GG3213332E", this);} // tgen
}
static void Test__ZN3aaa9GG3213332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213332E, buf);
    ::aaa::GG3213332 *dp, &lv = *(dp=new (buf) ::aaa::GG3213332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213332E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3213332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3213332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3213332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213332E);
    dp->::aaa::GG3213332::~GG3213332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213332E(Test__ZN3aaa9GG3213332E, "_ZN3aaa9GG3213332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213332C1Ev();
extern void _ZN3aaa9GG3213332D1Ev();
Name_Map name_map__ZN3aaa9GG3213332E[] = {
  NSPAIR(_ZN3aaa9GG3213332C1Ev),
  NSPAIR(_ZN3aaa9GG3213332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3213332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213332E[];
extern void _ZN3aaa5EE3213fooEv();
extern void _ZN3aaa9GG32133323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32133323barEv,_ZThn8_N3aaa9GG32133323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32133323barEv,_ZThn20_N3aaa9GG32133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32133323barEv,_ZThn28_N3aaa9GG32133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3213fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32133323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32133323barEv,_ZThn8_N3aaa9GG32133323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133323barEv,_ZThn20_N3aaa9GG32133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133323barEv,_ZThn28_N3aaa9GG32133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213332E[];
Class_Descriptor cd__ZN3aaa9GG3213332E = {  "_ZN3aaa9GG3213332E", // class name
  bases__ZN3aaa9GG3213332E, 6,
  &(vtc__ZN3aaa9GG3213332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3213333  : ::aaa::EE321 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32133333fooEv
  virtual void  bar(); // _ZN3aaa9GG32133333barEv
  ~GG3213333(); // tgen
  GG3213333(); // tgen
};
//SIG(1 _ZN3aaa9GG3213333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3213333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32133333fooEv");}
void  aaa::GG3213333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32133333barEv");}
aaa::GG3213333 ::~GG3213333(){ note_dtor("_ZN3aaa9GG3213333E", this);} // tgen
aaa::GG3213333 ::GG3213333(){ note_ctor("_ZN3aaa9GG3213333E", this);} // tgen
}
static void Test__ZN3aaa9GG3213333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3213333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3213333E, buf);
    ::aaa::GG3213333 *dp, &lv = *(dp=new (buf) ::aaa::GG3213333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3213333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3213333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE321*), 0, "_ZN3aaa9GG3213333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE321*), ABISELECT(16,8), "_ZN3aaa9GG3213333E");
    check_base_class_offset(lv, (::aaa::EE321*), 0, "_ZN3aaa9GG3213333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3213333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3213333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3213333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3213333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3213333E);
    dp->::aaa::GG3213333::~GG3213333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3213333E(Test__ZN3aaa9GG3213333E, "_ZN3aaa9GG3213333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3213333C1Ev();
extern void _ZN3aaa9GG3213333D1Ev();
Name_Map name_map__ZN3aaa9GG3213333E[] = {
  NSPAIR(_ZN3aaa9GG3213333C1Ev),
  NSPAIR(_ZN3aaa9GG3213333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE321E;
extern VTBL_ENTRY _ZTIN3aaa5EE321E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE321E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3213333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE321E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3213333E[];
extern void _ZN3aaa9GG32133333fooEv();
extern void _ZN3aaa9GG32133333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32133333barEv,_ZThn8_N3aaa9GG32133333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32133333fooEv,_ZThn20_N3aaa9GG32133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32133333barEv,_ZThn20_N3aaa9GG32133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32133333fooEv,_ZThn28_N3aaa9GG32133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32133333barEv,_ZThn28_N3aaa9GG32133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3213333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32133333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32133333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32133333barEv,_ZThn8_N3aaa9GG32133333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133333fooEv,_ZThn20_N3aaa9GG32133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32133333barEv,_ZThn20_N3aaa9GG32133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3213333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133333fooEv,_ZThn28_N3aaa9GG32133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32133333barEv,_ZThn28_N3aaa9GG32133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3213333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3213333E[];
Class_Descriptor cd__ZN3aaa9GG3213333E = {  "_ZN3aaa9GG3213333E", // class name
  bases__ZN3aaa9GG3213333E, 6,
  &(vtc__ZN3aaa9GG3213333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3213333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3213333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221111  : ::aaa::EE322 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32211113fooEv
  ~GG3221111(); // tgen
  GG3221111(); // tgen
};
//SIG(1 _ZN3aaa9GG3221111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32211113fooEv");}
aaa::GG3221111 ::~GG3221111(){ note_dtor("_ZN3aaa9GG3221111E", this);} // tgen
aaa::GG3221111 ::GG3221111(){ note_ctor("_ZN3aaa9GG3221111E", this);} // tgen
}
static void Test__ZN3aaa9GG3221111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221111E, buf);
    ::aaa::GG3221111 *dp, &lv = *(dp=new (buf) ::aaa::GG3221111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221111E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3221111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3221111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3221111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221111E);
    dp->::aaa::GG3221111::~GG3221111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221111E(Test__ZN3aaa9GG3221111E, "_ZN3aaa9GG3221111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221111C1Ev();
extern void _ZN3aaa9GG3221111D1Ev();
Name_Map name_map__ZN3aaa9GG3221111E[] = {
  NSPAIR(_ZN3aaa9GG3221111C1Ev),
  NSPAIR(_ZN3aaa9GG3221111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3221111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221111E[];
extern void _ZN3aaa9GG32211113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32211113fooEv,_ZThn20_N3aaa9GG32211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32211113fooEv,_ZThn28_N3aaa9GG32211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32211113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211113fooEv,_ZThn20_N3aaa9GG32211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32211113fooEv,_ZThn28_N3aaa9GG32211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221111E[];
Class_Descriptor cd__ZN3aaa9GG3221111E = {  "_ZN3aaa9GG3221111E", // class name
  bases__ZN3aaa9GG3221111E, 6,
  &(vtc__ZN3aaa9GG3221111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221112  : ::aaa::EE322 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32211123barEv
  ~GG3221112(); // tgen
  GG3221112(); // tgen
};
//SIG(1 _ZN3aaa9GG3221112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32211123barEv");}
aaa::GG3221112 ::~GG3221112(){ note_dtor("_ZN3aaa9GG3221112E", this);} // tgen
aaa::GG3221112 ::GG3221112(){ note_ctor("_ZN3aaa9GG3221112E", this);} // tgen
}
static void Test__ZN3aaa9GG3221112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221112E, buf);
    ::aaa::GG3221112 *dp, &lv = *(dp=new (buf) ::aaa::GG3221112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221112E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3221112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3221112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3221112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221112E);
    dp->::aaa::GG3221112::~GG3221112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221112E(Test__ZN3aaa9GG3221112E, "_ZN3aaa9GG3221112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221112C1Ev();
extern void _ZN3aaa9GG3221112D1Ev();
Name_Map name_map__ZN3aaa9GG3221112E[] = {
  NSPAIR(_ZN3aaa9GG3221112C1Ev),
  NSPAIR(_ZN3aaa9GG3221112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3221112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32211123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32211123barEv,_ZThn8_N3aaa9GG32211123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32211123barEv,_ZThn8_N3aaa9GG32211123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221112E[];
Class_Descriptor cd__ZN3aaa9GG3221112E = {  "_ZN3aaa9GG3221112E", // class name
  bases__ZN3aaa9GG3221112E, 6,
  &(vtc__ZN3aaa9GG3221112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221113  : ::aaa::EE322 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32211133fooEv
  virtual void  bar(); // _ZN3aaa9GG32211133barEv
  ~GG3221113(); // tgen
  GG3221113(); // tgen
};
//SIG(1 _ZN3aaa9GG3221113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32211133fooEv");}
void  aaa::GG3221113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32211133barEv");}
aaa::GG3221113 ::~GG3221113(){ note_dtor("_ZN3aaa9GG3221113E", this);} // tgen
aaa::GG3221113 ::GG3221113(){ note_ctor("_ZN3aaa9GG3221113E", this);} // tgen
}
static void Test__ZN3aaa9GG3221113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221113E, buf);
    ::aaa::GG3221113 *dp, &lv = *(dp=new (buf) ::aaa::GG3221113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221113E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3221113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3221113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3221113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221113E);
    dp->::aaa::GG3221113::~GG3221113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221113E(Test__ZN3aaa9GG3221113E, "_ZN3aaa9GG3221113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221113C1Ev();
extern void _ZN3aaa9GG3221113D1Ev();
Name_Map name_map__ZN3aaa9GG3221113E[] = {
  NSPAIR(_ZN3aaa9GG3221113C1Ev),
  NSPAIR(_ZN3aaa9GG3221113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3221113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221113E[];
extern void _ZN3aaa9GG32211133fooEv();
extern void _ZN3aaa9GG32211133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32211133barEv,_ZThn8_N3aaa9GG32211133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32211133fooEv,_ZThn20_N3aaa9GG32211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32211133fooEv,_ZThn28_N3aaa9GG32211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32211133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32211133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32211133barEv,_ZThn8_N3aaa9GG32211133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211133fooEv,_ZThn20_N3aaa9GG32211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32211133fooEv,_ZThn28_N3aaa9GG32211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221113E[];
Class_Descriptor cd__ZN3aaa9GG3221113E = {  "_ZN3aaa9GG3221113E", // class name
  bases__ZN3aaa9GG3221113E, 6,
  &(vtc__ZN3aaa9GG3221113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221121  : ::aaa::EE322 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32211213fooEv
  ~GG3221121(); // tgen
  GG3221121(); // tgen
};
//SIG(1 _ZN3aaa9GG3221121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32211213fooEv");}
aaa::GG3221121 ::~GG3221121(){ note_dtor("_ZN3aaa9GG3221121E", this);} // tgen
aaa::GG3221121 ::GG3221121(){ note_ctor("_ZN3aaa9GG3221121E", this);} // tgen
}
static void Test__ZN3aaa9GG3221121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221121E, buf);
    ::aaa::GG3221121 *dp, &lv = *(dp=new (buf) ::aaa::GG3221121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221121E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3221121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3221121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3221121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221121E);
    dp->::aaa::GG3221121::~GG3221121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221121E(Test__ZN3aaa9GG3221121E, "_ZN3aaa9GG3221121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221121C1Ev();
extern void _ZN3aaa9GG3221121D1Ev();
Name_Map name_map__ZN3aaa9GG3221121E[] = {
  NSPAIR(_ZN3aaa9GG3221121C1Ev),
  NSPAIR(_ZN3aaa9GG3221121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3221121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221121E[];
extern void _ZN3aaa9GG32211213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32211213fooEv,_ZThn20_N3aaa9GG32211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32211213fooEv,_ZThn28_N3aaa9GG32211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32211213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211213fooEv,_ZThn20_N3aaa9GG32211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32211213fooEv,_ZThn28_N3aaa9GG32211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221121E[];
Class_Descriptor cd__ZN3aaa9GG3221121E = {  "_ZN3aaa9GG3221121E", // class name
  bases__ZN3aaa9GG3221121E, 6,
  &(vtc__ZN3aaa9GG3221121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221122  : ::aaa::EE322 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32211223barEv
  ~GG3221122(); // tgen
  GG3221122(); // tgen
};
//SIG(1 _ZN3aaa9GG3221122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32211223barEv");}
aaa::GG3221122 ::~GG3221122(){ note_dtor("_ZN3aaa9GG3221122E", this);} // tgen
aaa::GG3221122 ::GG3221122(){ note_ctor("_ZN3aaa9GG3221122E", this);} // tgen
}
static void Test__ZN3aaa9GG3221122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221122E, buf);
    ::aaa::GG3221122 *dp, &lv = *(dp=new (buf) ::aaa::GG3221122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221122E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3221122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3221122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3221122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221122E);
    dp->::aaa::GG3221122::~GG3221122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221122E(Test__ZN3aaa9GG3221122E, "_ZN3aaa9GG3221122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221122C1Ev();
extern void _ZN3aaa9GG3221122D1Ev();
Name_Map name_map__ZN3aaa9GG3221122E[] = {
  NSPAIR(_ZN3aaa9GG3221122C1Ev),
  NSPAIR(_ZN3aaa9GG3221122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3221122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32211223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32211223barEv,_ZThn8_N3aaa9GG32211223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32211223barEv,_ZThn20_N3aaa9GG32211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32211223barEv,_ZThn8_N3aaa9GG32211223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211223barEv,_ZThn20_N3aaa9GG32211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221122E[];
Class_Descriptor cd__ZN3aaa9GG3221122E = {  "_ZN3aaa9GG3221122E", // class name
  bases__ZN3aaa9GG3221122E, 6,
  &(vtc__ZN3aaa9GG3221122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221123  : ::aaa::EE322 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32211233fooEv
  virtual void  bar(); // _ZN3aaa9GG32211233barEv
  ~GG3221123(); // tgen
  GG3221123(); // tgen
};
//SIG(1 _ZN3aaa9GG3221123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32211233fooEv");}
void  aaa::GG3221123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32211233barEv");}
aaa::GG3221123 ::~GG3221123(){ note_dtor("_ZN3aaa9GG3221123E", this);} // tgen
aaa::GG3221123 ::GG3221123(){ note_ctor("_ZN3aaa9GG3221123E", this);} // tgen
}
static void Test__ZN3aaa9GG3221123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221123E, buf);
    ::aaa::GG3221123 *dp, &lv = *(dp=new (buf) ::aaa::GG3221123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221123E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3221123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3221123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3221123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221123E);
    dp->::aaa::GG3221123::~GG3221123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221123E(Test__ZN3aaa9GG3221123E, "_ZN3aaa9GG3221123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221123C1Ev();
extern void _ZN3aaa9GG3221123D1Ev();
Name_Map name_map__ZN3aaa9GG3221123E[] = {
  NSPAIR(_ZN3aaa9GG3221123C1Ev),
  NSPAIR(_ZN3aaa9GG3221123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3221123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221123E[];
extern void _ZN3aaa9GG32211233fooEv();
extern void _ZN3aaa9GG32211233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32211233barEv,_ZThn8_N3aaa9GG32211233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32211233fooEv,_ZThn20_N3aaa9GG32211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32211233barEv,_ZThn20_N3aaa9GG32211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32211233fooEv,_ZThn28_N3aaa9GG32211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32211233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32211233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32211233barEv,_ZThn8_N3aaa9GG32211233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211233fooEv,_ZThn20_N3aaa9GG32211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211233barEv,_ZThn20_N3aaa9GG32211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32211233fooEv,_ZThn28_N3aaa9GG32211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221123E[];
Class_Descriptor cd__ZN3aaa9GG3221123E = {  "_ZN3aaa9GG3221123E", // class name
  bases__ZN3aaa9GG3221123E, 6,
  &(vtc__ZN3aaa9GG3221123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221131  : ::aaa::EE322 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32211313fooEv
  ~GG3221131(); // tgen
  GG3221131(); // tgen
};
//SIG(1 _ZN3aaa9GG3221131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32211313fooEv");}
aaa::GG3221131 ::~GG3221131(){ note_dtor("_ZN3aaa9GG3221131E", this);} // tgen
aaa::GG3221131 ::GG3221131(){ note_ctor("_ZN3aaa9GG3221131E", this);} // tgen
}
static void Test__ZN3aaa9GG3221131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221131E, buf);
    ::aaa::GG3221131 *dp, &lv = *(dp=new (buf) ::aaa::GG3221131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221131E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3221131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3221131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3221131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221131E);
    dp->::aaa::GG3221131::~GG3221131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221131E(Test__ZN3aaa9GG3221131E, "_ZN3aaa9GG3221131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221131C1Ev();
extern void _ZN3aaa9GG3221131D1Ev();
Name_Map name_map__ZN3aaa9GG3221131E[] = {
  NSPAIR(_ZN3aaa9GG3221131C1Ev),
  NSPAIR(_ZN3aaa9GG3221131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3221131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221131E[];
extern void _ZN3aaa9GG32211313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32211313fooEv,_ZThn20_N3aaa9GG32211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32211313fooEv,_ZThn28_N3aaa9GG32211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32211313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211313fooEv,_ZThn20_N3aaa9GG32211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32211313fooEv,_ZThn28_N3aaa9GG32211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221131E[];
Class_Descriptor cd__ZN3aaa9GG3221131E = {  "_ZN3aaa9GG3221131E", // class name
  bases__ZN3aaa9GG3221131E, 6,
  &(vtc__ZN3aaa9GG3221131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221132  : ::aaa::EE322 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32211323barEv
  ~GG3221132(); // tgen
  GG3221132(); // tgen
};
//SIG(1 _ZN3aaa9GG3221132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32211323barEv");}
aaa::GG3221132 ::~GG3221132(){ note_dtor("_ZN3aaa9GG3221132E", this);} // tgen
aaa::GG3221132 ::GG3221132(){ note_ctor("_ZN3aaa9GG3221132E", this);} // tgen
}
static void Test__ZN3aaa9GG3221132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221132E, buf);
    ::aaa::GG3221132 *dp, &lv = *(dp=new (buf) ::aaa::GG3221132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221132E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3221132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3221132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3221132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221132E);
    dp->::aaa::GG3221132::~GG3221132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221132E(Test__ZN3aaa9GG3221132E, "_ZN3aaa9GG3221132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221132C1Ev();
extern void _ZN3aaa9GG3221132D1Ev();
Name_Map name_map__ZN3aaa9GG3221132E[] = {
  NSPAIR(_ZN3aaa9GG3221132C1Ev),
  NSPAIR(_ZN3aaa9GG3221132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3221132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32211323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32211323barEv,_ZThn8_N3aaa9GG32211323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32211323barEv,_ZThn20_N3aaa9GG32211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32211323barEv,_ZThn8_N3aaa9GG32211323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211323barEv,_ZThn20_N3aaa9GG32211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221132E[];
Class_Descriptor cd__ZN3aaa9GG3221132E = {  "_ZN3aaa9GG3221132E", // class name
  bases__ZN3aaa9GG3221132E, 6,
  &(vtc__ZN3aaa9GG3221132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221133  : ::aaa::EE322 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32211333fooEv
  virtual void  bar(); // _ZN3aaa9GG32211333barEv
  ~GG3221133(); // tgen
  GG3221133(); // tgen
};
//SIG(1 _ZN3aaa9GG3221133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32211333fooEv");}
void  aaa::GG3221133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32211333barEv");}
aaa::GG3221133 ::~GG3221133(){ note_dtor("_ZN3aaa9GG3221133E", this);} // tgen
aaa::GG3221133 ::GG3221133(){ note_ctor("_ZN3aaa9GG3221133E", this);} // tgen
}
static void Test__ZN3aaa9GG3221133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221133E, buf);
    ::aaa::GG3221133 *dp, &lv = *(dp=new (buf) ::aaa::GG3221133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221133E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3221133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3221133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3221133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221133E);
    dp->::aaa::GG3221133::~GG3221133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221133E(Test__ZN3aaa9GG3221133E, "_ZN3aaa9GG3221133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221133C1Ev();
extern void _ZN3aaa9GG3221133D1Ev();
Name_Map name_map__ZN3aaa9GG3221133E[] = {
  NSPAIR(_ZN3aaa9GG3221133C1Ev),
  NSPAIR(_ZN3aaa9GG3221133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3221133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221133E[];
extern void _ZN3aaa9GG32211333fooEv();
extern void _ZN3aaa9GG32211333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32211333barEv,_ZThn8_N3aaa9GG32211333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32211333fooEv,_ZThn20_N3aaa9GG32211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32211333barEv,_ZThn20_N3aaa9GG32211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32211333fooEv,_ZThn28_N3aaa9GG32211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32211333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32211333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32211333barEv,_ZThn8_N3aaa9GG32211333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211333fooEv,_ZThn20_N3aaa9GG32211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32211333barEv,_ZThn20_N3aaa9GG32211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32211333fooEv,_ZThn28_N3aaa9GG32211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221133E[];
Class_Descriptor cd__ZN3aaa9GG3221133E = {  "_ZN3aaa9GG3221133E", // class name
  bases__ZN3aaa9GG3221133E, 6,
  &(vtc__ZN3aaa9GG3221133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221211  : ::aaa::EE322 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32212113fooEv
  ~GG3221211(); // tgen
  GG3221211(); // tgen
};
//SIG(1 _ZN3aaa9GG3221211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32212113fooEv");}
aaa::GG3221211 ::~GG3221211(){ note_dtor("_ZN3aaa9GG3221211E", this);} // tgen
aaa::GG3221211 ::GG3221211(){ note_ctor("_ZN3aaa9GG3221211E", this);} // tgen
}
static void Test__ZN3aaa9GG3221211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221211E, buf);
    ::aaa::GG3221211 *dp, &lv = *(dp=new (buf) ::aaa::GG3221211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221211E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3221211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3221211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3221211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221211E);
    dp->::aaa::GG3221211::~GG3221211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221211E(Test__ZN3aaa9GG3221211E, "_ZN3aaa9GG3221211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221211C1Ev();
extern void _ZN3aaa9GG3221211D1Ev();
Name_Map name_map__ZN3aaa9GG3221211E[] = {
  NSPAIR(_ZN3aaa9GG3221211C1Ev),
  NSPAIR(_ZN3aaa9GG3221211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3221211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221211E[];
extern void _ZN3aaa9GG32212113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32212113fooEv,_ZThn20_N3aaa9GG32212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32212113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212113fooEv,_ZThn20_N3aaa9GG32212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221211E[];
Class_Descriptor cd__ZN3aaa9GG3221211E = {  "_ZN3aaa9GG3221211E", // class name
  bases__ZN3aaa9GG3221211E, 6,
  &(vtc__ZN3aaa9GG3221211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221212  : ::aaa::EE322 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32212123barEv
  ~GG3221212(); // tgen
  GG3221212(); // tgen
};
//SIG(1 _ZN3aaa9GG3221212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32212123barEv");}
aaa::GG3221212 ::~GG3221212(){ note_dtor("_ZN3aaa9GG3221212E", this);} // tgen
aaa::GG3221212 ::GG3221212(){ note_ctor("_ZN3aaa9GG3221212E", this);} // tgen
}
static void Test__ZN3aaa9GG3221212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221212E, buf);
    ::aaa::GG3221212 *dp, &lv = *(dp=new (buf) ::aaa::GG3221212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221212E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3221212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3221212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3221212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221212E);
    dp->::aaa::GG3221212::~GG3221212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221212E(Test__ZN3aaa9GG3221212E, "_ZN3aaa9GG3221212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221212C1Ev();
extern void _ZN3aaa9GG3221212D1Ev();
Name_Map name_map__ZN3aaa9GG3221212E[] = {
  NSPAIR(_ZN3aaa9GG3221212C1Ev),
  NSPAIR(_ZN3aaa9GG3221212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3221212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32212123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32212123barEv,_ZThn8_N3aaa9GG32212123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32212123barEv,_ZThn28_N3aaa9GG32212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32212123barEv,_ZThn8_N3aaa9GG32212123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32212123barEv,_ZThn28_N3aaa9GG32212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221212E[];
Class_Descriptor cd__ZN3aaa9GG3221212E = {  "_ZN3aaa9GG3221212E", // class name
  bases__ZN3aaa9GG3221212E, 6,
  &(vtc__ZN3aaa9GG3221212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221213  : ::aaa::EE322 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32212133fooEv
  virtual void  bar(); // _ZN3aaa9GG32212133barEv
  ~GG3221213(); // tgen
  GG3221213(); // tgen
};
//SIG(1 _ZN3aaa9GG3221213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32212133fooEv");}
void  aaa::GG3221213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32212133barEv");}
aaa::GG3221213 ::~GG3221213(){ note_dtor("_ZN3aaa9GG3221213E", this);} // tgen
aaa::GG3221213 ::GG3221213(){ note_ctor("_ZN3aaa9GG3221213E", this);} // tgen
}
static void Test__ZN3aaa9GG3221213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221213E, buf);
    ::aaa::GG3221213 *dp, &lv = *(dp=new (buf) ::aaa::GG3221213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221213E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3221213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3221213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3221213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221213E);
    dp->::aaa::GG3221213::~GG3221213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221213E(Test__ZN3aaa9GG3221213E, "_ZN3aaa9GG3221213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221213C1Ev();
extern void _ZN3aaa9GG3221213D1Ev();
Name_Map name_map__ZN3aaa9GG3221213E[] = {
  NSPAIR(_ZN3aaa9GG3221213C1Ev),
  NSPAIR(_ZN3aaa9GG3221213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3221213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221213E[];
extern void _ZN3aaa9GG32212133fooEv();
extern void _ZN3aaa9GG32212133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32212133barEv,_ZThn8_N3aaa9GG32212133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32212133fooEv,_ZThn20_N3aaa9GG32212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32212133barEv,_ZThn28_N3aaa9GG32212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32212133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32212133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32212133barEv,_ZThn8_N3aaa9GG32212133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212133fooEv,_ZThn20_N3aaa9GG32212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32212133barEv,_ZThn28_N3aaa9GG32212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221213E[];
Class_Descriptor cd__ZN3aaa9GG3221213E = {  "_ZN3aaa9GG3221213E", // class name
  bases__ZN3aaa9GG3221213E, 6,
  &(vtc__ZN3aaa9GG3221213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221221  : ::aaa::EE322 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32212213fooEv
  ~GG3221221(); // tgen
  GG3221221(); // tgen
};
//SIG(1 _ZN3aaa9GG3221221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32212213fooEv");}
aaa::GG3221221 ::~GG3221221(){ note_dtor("_ZN3aaa9GG3221221E", this);} // tgen
aaa::GG3221221 ::GG3221221(){ note_ctor("_ZN3aaa9GG3221221E", this);} // tgen
}
static void Test__ZN3aaa9GG3221221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221221E, buf);
    ::aaa::GG3221221 *dp, &lv = *(dp=new (buf) ::aaa::GG3221221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221221E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3221221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3221221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3221221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221221E);
    dp->::aaa::GG3221221::~GG3221221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221221E(Test__ZN3aaa9GG3221221E, "_ZN3aaa9GG3221221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221221C1Ev();
extern void _ZN3aaa9GG3221221D1Ev();
Name_Map name_map__ZN3aaa9GG3221221E[] = {
  NSPAIR(_ZN3aaa9GG3221221C1Ev),
  NSPAIR(_ZN3aaa9GG3221221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3221221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221221E[];
extern void _ZN3aaa9GG32212213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32212213fooEv,_ZThn20_N3aaa9GG32212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32212213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212213fooEv,_ZThn20_N3aaa9GG32212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221221E[];
Class_Descriptor cd__ZN3aaa9GG3221221E = {  "_ZN3aaa9GG3221221E", // class name
  bases__ZN3aaa9GG3221221E, 6,
  &(vtc__ZN3aaa9GG3221221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221222  : ::aaa::EE322 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32212223barEv
  ~GG3221222(); // tgen
  GG3221222(); // tgen
};
//SIG(1 _ZN3aaa9GG3221222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32212223barEv");}
aaa::GG3221222 ::~GG3221222(){ note_dtor("_ZN3aaa9GG3221222E", this);} // tgen
aaa::GG3221222 ::GG3221222(){ note_ctor("_ZN3aaa9GG3221222E", this);} // tgen
}
static void Test__ZN3aaa9GG3221222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221222E, buf);
    ::aaa::GG3221222 *dp, &lv = *(dp=new (buf) ::aaa::GG3221222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221222E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3221222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3221222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3221222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221222E);
    dp->::aaa::GG3221222::~GG3221222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221222E(Test__ZN3aaa9GG3221222E, "_ZN3aaa9GG3221222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221222C1Ev();
extern void _ZN3aaa9GG3221222D1Ev();
Name_Map name_map__ZN3aaa9GG3221222E[] = {
  NSPAIR(_ZN3aaa9GG3221222C1Ev),
  NSPAIR(_ZN3aaa9GG3221222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3221222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32212223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32212223barEv,_ZThn8_N3aaa9GG32212223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32212223barEv,_ZThn20_N3aaa9GG32212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32212223barEv,_ZThn28_N3aaa9GG32212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32212223barEv,_ZThn8_N3aaa9GG32212223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212223barEv,_ZThn20_N3aaa9GG32212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32212223barEv,_ZThn28_N3aaa9GG32212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221222E[];
Class_Descriptor cd__ZN3aaa9GG3221222E = {  "_ZN3aaa9GG3221222E", // class name
  bases__ZN3aaa9GG3221222E, 6,
  &(vtc__ZN3aaa9GG3221222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221223  : ::aaa::EE322 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32212233fooEv
  virtual void  bar(); // _ZN3aaa9GG32212233barEv
  ~GG3221223(); // tgen
  GG3221223(); // tgen
};
//SIG(1 _ZN3aaa9GG3221223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32212233fooEv");}
void  aaa::GG3221223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32212233barEv");}
aaa::GG3221223 ::~GG3221223(){ note_dtor("_ZN3aaa9GG3221223E", this);} // tgen
aaa::GG3221223 ::GG3221223(){ note_ctor("_ZN3aaa9GG3221223E", this);} // tgen
}
static void Test__ZN3aaa9GG3221223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221223E, buf);
    ::aaa::GG3221223 *dp, &lv = *(dp=new (buf) ::aaa::GG3221223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221223E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3221223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3221223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3221223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221223E);
    dp->::aaa::GG3221223::~GG3221223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221223E(Test__ZN3aaa9GG3221223E, "_ZN3aaa9GG3221223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221223C1Ev();
extern void _ZN3aaa9GG3221223D1Ev();
Name_Map name_map__ZN3aaa9GG3221223E[] = {
  NSPAIR(_ZN3aaa9GG3221223C1Ev),
  NSPAIR(_ZN3aaa9GG3221223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3221223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221223E[];
extern void _ZN3aaa9GG32212233fooEv();
extern void _ZN3aaa9GG32212233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32212233barEv,_ZThn8_N3aaa9GG32212233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32212233fooEv,_ZThn20_N3aaa9GG32212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32212233barEv,_ZThn20_N3aaa9GG32212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32212233barEv,_ZThn28_N3aaa9GG32212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32212233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32212233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32212233barEv,_ZThn8_N3aaa9GG32212233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212233fooEv,_ZThn20_N3aaa9GG32212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212233barEv,_ZThn20_N3aaa9GG32212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32212233barEv,_ZThn28_N3aaa9GG32212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221223E[];
Class_Descriptor cd__ZN3aaa9GG3221223E = {  "_ZN3aaa9GG3221223E", // class name
  bases__ZN3aaa9GG3221223E, 6,
  &(vtc__ZN3aaa9GG3221223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221231  : ::aaa::EE322 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32212313fooEv
  ~GG3221231(); // tgen
  GG3221231(); // tgen
};
//SIG(1 _ZN3aaa9GG3221231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32212313fooEv");}
aaa::GG3221231 ::~GG3221231(){ note_dtor("_ZN3aaa9GG3221231E", this);} // tgen
aaa::GG3221231 ::GG3221231(){ note_ctor("_ZN3aaa9GG3221231E", this);} // tgen
}
static void Test__ZN3aaa9GG3221231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221231E, buf);
    ::aaa::GG3221231 *dp, &lv = *(dp=new (buf) ::aaa::GG3221231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221231E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3221231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3221231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3221231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221231E);
    dp->::aaa::GG3221231::~GG3221231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221231E(Test__ZN3aaa9GG3221231E, "_ZN3aaa9GG3221231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221231C1Ev();
extern void _ZN3aaa9GG3221231D1Ev();
Name_Map name_map__ZN3aaa9GG3221231E[] = {
  NSPAIR(_ZN3aaa9GG3221231C1Ev),
  NSPAIR(_ZN3aaa9GG3221231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3221231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221231E[];
extern void _ZN3aaa9GG32212313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32212313fooEv,_ZThn20_N3aaa9GG32212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32212313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212313fooEv,_ZThn20_N3aaa9GG32212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221231E[];
Class_Descriptor cd__ZN3aaa9GG3221231E = {  "_ZN3aaa9GG3221231E", // class name
  bases__ZN3aaa9GG3221231E, 6,
  &(vtc__ZN3aaa9GG3221231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221232  : ::aaa::EE322 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32212323barEv
  ~GG3221232(); // tgen
  GG3221232(); // tgen
};
//SIG(1 _ZN3aaa9GG3221232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32212323barEv");}
aaa::GG3221232 ::~GG3221232(){ note_dtor("_ZN3aaa9GG3221232E", this);} // tgen
aaa::GG3221232 ::GG3221232(){ note_ctor("_ZN3aaa9GG3221232E", this);} // tgen
}
static void Test__ZN3aaa9GG3221232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221232E, buf);
    ::aaa::GG3221232 *dp, &lv = *(dp=new (buf) ::aaa::GG3221232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221232E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3221232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3221232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3221232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221232E);
    dp->::aaa::GG3221232::~GG3221232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221232E(Test__ZN3aaa9GG3221232E, "_ZN3aaa9GG3221232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221232C1Ev();
extern void _ZN3aaa9GG3221232D1Ev();
Name_Map name_map__ZN3aaa9GG3221232E[] = {
  NSPAIR(_ZN3aaa9GG3221232C1Ev),
  NSPAIR(_ZN3aaa9GG3221232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3221232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32212323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32212323barEv,_ZThn8_N3aaa9GG32212323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32212323barEv,_ZThn20_N3aaa9GG32212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32212323barEv,_ZThn28_N3aaa9GG32212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32212323barEv,_ZThn8_N3aaa9GG32212323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212323barEv,_ZThn20_N3aaa9GG32212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32212323barEv,_ZThn28_N3aaa9GG32212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221232E[];
Class_Descriptor cd__ZN3aaa9GG3221232E = {  "_ZN3aaa9GG3221232E", // class name
  bases__ZN3aaa9GG3221232E, 6,
  &(vtc__ZN3aaa9GG3221232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221233  : ::aaa::EE322 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32212333fooEv
  virtual void  bar(); // _ZN3aaa9GG32212333barEv
  ~GG3221233(); // tgen
  GG3221233(); // tgen
};
//SIG(1 _ZN3aaa9GG3221233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32212333fooEv");}
void  aaa::GG3221233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32212333barEv");}
aaa::GG3221233 ::~GG3221233(){ note_dtor("_ZN3aaa9GG3221233E", this);} // tgen
aaa::GG3221233 ::GG3221233(){ note_ctor("_ZN3aaa9GG3221233E", this);} // tgen
}
static void Test__ZN3aaa9GG3221233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221233E, buf);
    ::aaa::GG3221233 *dp, &lv = *(dp=new (buf) ::aaa::GG3221233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221233E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3221233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3221233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3221233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221233E);
    dp->::aaa::GG3221233::~GG3221233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221233E(Test__ZN3aaa9GG3221233E, "_ZN3aaa9GG3221233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221233C1Ev();
extern void _ZN3aaa9GG3221233D1Ev();
Name_Map name_map__ZN3aaa9GG3221233E[] = {
  NSPAIR(_ZN3aaa9GG3221233C1Ev),
  NSPAIR(_ZN3aaa9GG3221233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3221233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221233E[];
extern void _ZN3aaa9GG32212333fooEv();
extern void _ZN3aaa9GG32212333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32212333barEv,_ZThn8_N3aaa9GG32212333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32212333fooEv,_ZThn20_N3aaa9GG32212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32212333barEv,_ZThn20_N3aaa9GG32212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32212333barEv,_ZThn28_N3aaa9GG32212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32212333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32212333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32212333barEv,_ZThn8_N3aaa9GG32212333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212333fooEv,_ZThn20_N3aaa9GG32212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32212333barEv,_ZThn20_N3aaa9GG32212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32212333barEv,_ZThn28_N3aaa9GG32212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221233E[];
Class_Descriptor cd__ZN3aaa9GG3221233E = {  "_ZN3aaa9GG3221233E", // class name
  bases__ZN3aaa9GG3221233E, 6,
  &(vtc__ZN3aaa9GG3221233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221311  : ::aaa::EE322 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32213113fooEv
  ~GG3221311(); // tgen
  GG3221311(); // tgen
};
//SIG(1 _ZN3aaa9GG3221311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32213113fooEv");}
aaa::GG3221311 ::~GG3221311(){ note_dtor("_ZN3aaa9GG3221311E", this);} // tgen
aaa::GG3221311 ::GG3221311(){ note_ctor("_ZN3aaa9GG3221311E", this);} // tgen
}
static void Test__ZN3aaa9GG3221311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221311E, buf);
    ::aaa::GG3221311 *dp, &lv = *(dp=new (buf) ::aaa::GG3221311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221311E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3221311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3221311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3221311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221311E);
    dp->::aaa::GG3221311::~GG3221311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221311E(Test__ZN3aaa9GG3221311E, "_ZN3aaa9GG3221311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221311C1Ev();
extern void _ZN3aaa9GG3221311D1Ev();
Name_Map name_map__ZN3aaa9GG3221311E[] = {
  NSPAIR(_ZN3aaa9GG3221311C1Ev),
  NSPAIR(_ZN3aaa9GG3221311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3221311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221311E[];
extern void _ZN3aaa9GG32213113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32213113fooEv,_ZThn20_N3aaa9GG32213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213113fooEv,_ZThn28_N3aaa9GG32213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32213113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213113fooEv,_ZThn20_N3aaa9GG32213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213113fooEv,_ZThn28_N3aaa9GG32213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221311E[];
Class_Descriptor cd__ZN3aaa9GG3221311E = {  "_ZN3aaa9GG3221311E", // class name
  bases__ZN3aaa9GG3221311E, 6,
  &(vtc__ZN3aaa9GG3221311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221312  : ::aaa::EE322 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32213123barEv
  ~GG3221312(); // tgen
  GG3221312(); // tgen
};
//SIG(1 _ZN3aaa9GG3221312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32213123barEv");}
aaa::GG3221312 ::~GG3221312(){ note_dtor("_ZN3aaa9GG3221312E", this);} // tgen
aaa::GG3221312 ::GG3221312(){ note_ctor("_ZN3aaa9GG3221312E", this);} // tgen
}
static void Test__ZN3aaa9GG3221312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221312E, buf);
    ::aaa::GG3221312 *dp, &lv = *(dp=new (buf) ::aaa::GG3221312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221312E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3221312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3221312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3221312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221312E);
    dp->::aaa::GG3221312::~GG3221312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221312E(Test__ZN3aaa9GG3221312E, "_ZN3aaa9GG3221312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221312C1Ev();
extern void _ZN3aaa9GG3221312D1Ev();
Name_Map name_map__ZN3aaa9GG3221312E[] = {
  NSPAIR(_ZN3aaa9GG3221312C1Ev),
  NSPAIR(_ZN3aaa9GG3221312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3221312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32213123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32213123barEv,_ZThn8_N3aaa9GG32213123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213123barEv,_ZThn28_N3aaa9GG32213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32213123barEv,_ZThn8_N3aaa9GG32213123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213123barEv,_ZThn28_N3aaa9GG32213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221312E[];
Class_Descriptor cd__ZN3aaa9GG3221312E = {  "_ZN3aaa9GG3221312E", // class name
  bases__ZN3aaa9GG3221312E, 6,
  &(vtc__ZN3aaa9GG3221312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221313  : ::aaa::EE322 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32213133fooEv
  virtual void  bar(); // _ZN3aaa9GG32213133barEv
  ~GG3221313(); // tgen
  GG3221313(); // tgen
};
//SIG(1 _ZN3aaa9GG3221313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32213133fooEv");}
void  aaa::GG3221313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32213133barEv");}
aaa::GG3221313 ::~GG3221313(){ note_dtor("_ZN3aaa9GG3221313E", this);} // tgen
aaa::GG3221313 ::GG3221313(){ note_ctor("_ZN3aaa9GG3221313E", this);} // tgen
}
static void Test__ZN3aaa9GG3221313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221313E, buf);
    ::aaa::GG3221313 *dp, &lv = *(dp=new (buf) ::aaa::GG3221313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221313E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3221313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3221313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3221313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221313E);
    dp->::aaa::GG3221313::~GG3221313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221313E(Test__ZN3aaa9GG3221313E, "_ZN3aaa9GG3221313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221313C1Ev();
extern void _ZN3aaa9GG3221313D1Ev();
Name_Map name_map__ZN3aaa9GG3221313E[] = {
  NSPAIR(_ZN3aaa9GG3221313C1Ev),
  NSPAIR(_ZN3aaa9GG3221313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3221313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221313E[];
extern void _ZN3aaa9GG32213133fooEv();
extern void _ZN3aaa9GG32213133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32213133barEv,_ZThn8_N3aaa9GG32213133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32213133fooEv,_ZThn20_N3aaa9GG32213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213133fooEv,_ZThn28_N3aaa9GG32213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213133barEv,_ZThn28_N3aaa9GG32213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32213133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32213133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32213133barEv,_ZThn8_N3aaa9GG32213133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213133fooEv,_ZThn20_N3aaa9GG32213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213133fooEv,_ZThn28_N3aaa9GG32213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213133barEv,_ZThn28_N3aaa9GG32213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221313E[];
Class_Descriptor cd__ZN3aaa9GG3221313E = {  "_ZN3aaa9GG3221313E", // class name
  bases__ZN3aaa9GG3221313E, 6,
  &(vtc__ZN3aaa9GG3221313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221321  : ::aaa::EE322 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32213213fooEv
  ~GG3221321(); // tgen
  GG3221321(); // tgen
};
//SIG(1 _ZN3aaa9GG3221321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32213213fooEv");}
aaa::GG3221321 ::~GG3221321(){ note_dtor("_ZN3aaa9GG3221321E", this);} // tgen
aaa::GG3221321 ::GG3221321(){ note_ctor("_ZN3aaa9GG3221321E", this);} // tgen
}
static void Test__ZN3aaa9GG3221321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221321E, buf);
    ::aaa::GG3221321 *dp, &lv = *(dp=new (buf) ::aaa::GG3221321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221321E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3221321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3221321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3221321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221321E);
    dp->::aaa::GG3221321::~GG3221321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221321E(Test__ZN3aaa9GG3221321E, "_ZN3aaa9GG3221321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221321C1Ev();
extern void _ZN3aaa9GG3221321D1Ev();
Name_Map name_map__ZN3aaa9GG3221321E[] = {
  NSPAIR(_ZN3aaa9GG3221321C1Ev),
  NSPAIR(_ZN3aaa9GG3221321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3221321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221321E[];
extern void _ZN3aaa9GG32213213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32213213fooEv,_ZThn20_N3aaa9GG32213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32213213fooEv,_ZThn28_N3aaa9GG32213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32213213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213213fooEv,_ZThn20_N3aaa9GG32213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213213fooEv,_ZThn28_N3aaa9GG32213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221321E[];
Class_Descriptor cd__ZN3aaa9GG3221321E = {  "_ZN3aaa9GG3221321E", // class name
  bases__ZN3aaa9GG3221321E, 6,
  &(vtc__ZN3aaa9GG3221321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221322  : ::aaa::EE322 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32213223barEv
  ~GG3221322(); // tgen
  GG3221322(); // tgen
};
//SIG(1 _ZN3aaa9GG3221322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32213223barEv");}
aaa::GG3221322 ::~GG3221322(){ note_dtor("_ZN3aaa9GG3221322E", this);} // tgen
aaa::GG3221322 ::GG3221322(){ note_ctor("_ZN3aaa9GG3221322E", this);} // tgen
}
static void Test__ZN3aaa9GG3221322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221322E, buf);
    ::aaa::GG3221322 *dp, &lv = *(dp=new (buf) ::aaa::GG3221322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221322E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3221322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3221322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3221322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221322E);
    dp->::aaa::GG3221322::~GG3221322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221322E(Test__ZN3aaa9GG3221322E, "_ZN3aaa9GG3221322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221322C1Ev();
extern void _ZN3aaa9GG3221322D1Ev();
Name_Map name_map__ZN3aaa9GG3221322E[] = {
  NSPAIR(_ZN3aaa9GG3221322C1Ev),
  NSPAIR(_ZN3aaa9GG3221322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3221322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32213223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32213223barEv,_ZThn8_N3aaa9GG32213223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32213223barEv,_ZThn20_N3aaa9GG32213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32213223barEv,_ZThn28_N3aaa9GG32213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32213223barEv,_ZThn8_N3aaa9GG32213223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213223barEv,_ZThn20_N3aaa9GG32213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213223barEv,_ZThn28_N3aaa9GG32213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221322E[];
Class_Descriptor cd__ZN3aaa9GG3221322E = {  "_ZN3aaa9GG3221322E", // class name
  bases__ZN3aaa9GG3221322E, 6,
  &(vtc__ZN3aaa9GG3221322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221323  : ::aaa::EE322 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32213233fooEv
  virtual void  bar(); // _ZN3aaa9GG32213233barEv
  ~GG3221323(); // tgen
  GG3221323(); // tgen
};
//SIG(1 _ZN3aaa9GG3221323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32213233fooEv");}
void  aaa::GG3221323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32213233barEv");}
aaa::GG3221323 ::~GG3221323(){ note_dtor("_ZN3aaa9GG3221323E", this);} // tgen
aaa::GG3221323 ::GG3221323(){ note_ctor("_ZN3aaa9GG3221323E", this);} // tgen
}
static void Test__ZN3aaa9GG3221323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221323E, buf);
    ::aaa::GG3221323 *dp, &lv = *(dp=new (buf) ::aaa::GG3221323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221323E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3221323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3221323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3221323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221323E);
    dp->::aaa::GG3221323::~GG3221323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221323E(Test__ZN3aaa9GG3221323E, "_ZN3aaa9GG3221323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221323C1Ev();
extern void _ZN3aaa9GG3221323D1Ev();
Name_Map name_map__ZN3aaa9GG3221323E[] = {
  NSPAIR(_ZN3aaa9GG3221323C1Ev),
  NSPAIR(_ZN3aaa9GG3221323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3221323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221323E[];
extern void _ZN3aaa9GG32213233fooEv();
extern void _ZN3aaa9GG32213233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32213233barEv,_ZThn8_N3aaa9GG32213233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32213233fooEv,_ZThn20_N3aaa9GG32213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32213233barEv,_ZThn20_N3aaa9GG32213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213233fooEv,_ZThn28_N3aaa9GG32213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213233barEv,_ZThn28_N3aaa9GG32213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32213233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32213233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32213233barEv,_ZThn8_N3aaa9GG32213233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213233fooEv,_ZThn20_N3aaa9GG32213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213233barEv,_ZThn20_N3aaa9GG32213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213233fooEv,_ZThn28_N3aaa9GG32213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213233barEv,_ZThn28_N3aaa9GG32213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221323E[];
Class_Descriptor cd__ZN3aaa9GG3221323E = {  "_ZN3aaa9GG3221323E", // class name
  bases__ZN3aaa9GG3221323E, 6,
  &(vtc__ZN3aaa9GG3221323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221331  : ::aaa::EE322 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32213313fooEv
  ~GG3221331(); // tgen
  GG3221331(); // tgen
};
//SIG(1 _ZN3aaa9GG3221331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32213313fooEv");}
aaa::GG3221331 ::~GG3221331(){ note_dtor("_ZN3aaa9GG3221331E", this);} // tgen
aaa::GG3221331 ::GG3221331(){ note_ctor("_ZN3aaa9GG3221331E", this);} // tgen
}
static void Test__ZN3aaa9GG3221331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221331E, buf);
    ::aaa::GG3221331 *dp, &lv = *(dp=new (buf) ::aaa::GG3221331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221331E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3221331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3221331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3221331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221331E);
    dp->::aaa::GG3221331::~GG3221331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221331E(Test__ZN3aaa9GG3221331E, "_ZN3aaa9GG3221331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221331C1Ev();
extern void _ZN3aaa9GG3221331D1Ev();
Name_Map name_map__ZN3aaa9GG3221331E[] = {
  NSPAIR(_ZN3aaa9GG3221331C1Ev),
  NSPAIR(_ZN3aaa9GG3221331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3221331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221331E[];
extern void _ZN3aaa9GG32213313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32213313fooEv,_ZThn20_N3aaa9GG32213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32213313fooEv,_ZThn28_N3aaa9GG32213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32213313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213313fooEv,_ZThn20_N3aaa9GG32213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213313fooEv,_ZThn28_N3aaa9GG32213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221331E[];
Class_Descriptor cd__ZN3aaa9GG3221331E = {  "_ZN3aaa9GG3221331E", // class name
  bases__ZN3aaa9GG3221331E, 6,
  &(vtc__ZN3aaa9GG3221331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221332  : ::aaa::EE322 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32213323barEv
  ~GG3221332(); // tgen
  GG3221332(); // tgen
};
//SIG(1 _ZN3aaa9GG3221332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3221332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32213323barEv");}
aaa::GG3221332 ::~GG3221332(){ note_dtor("_ZN3aaa9GG3221332E", this);} // tgen
aaa::GG3221332 ::GG3221332(){ note_ctor("_ZN3aaa9GG3221332E", this);} // tgen
}
static void Test__ZN3aaa9GG3221332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221332E, buf);
    ::aaa::GG3221332 *dp, &lv = *(dp=new (buf) ::aaa::GG3221332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221332E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3221332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3221332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3221332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221332E);
    dp->::aaa::GG3221332::~GG3221332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221332E(Test__ZN3aaa9GG3221332E, "_ZN3aaa9GG3221332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221332C1Ev();
extern void _ZN3aaa9GG3221332D1Ev();
Name_Map name_map__ZN3aaa9GG3221332E[] = {
  NSPAIR(_ZN3aaa9GG3221332C1Ev),
  NSPAIR(_ZN3aaa9GG3221332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3221332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32213323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32213323barEv,_ZThn8_N3aaa9GG32213323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32213323barEv,_ZThn20_N3aaa9GG32213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213323barEv,_ZThn28_N3aaa9GG32213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32213323barEv,_ZThn8_N3aaa9GG32213323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213323barEv,_ZThn20_N3aaa9GG32213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213323barEv,_ZThn28_N3aaa9GG32213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221332E[];
Class_Descriptor cd__ZN3aaa9GG3221332E = {  "_ZN3aaa9GG3221332E", // class name
  bases__ZN3aaa9GG3221332E, 6,
  &(vtc__ZN3aaa9GG3221332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3221333  : ::aaa::EE322 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32213333fooEv
  virtual void  bar(); // _ZN3aaa9GG32213333barEv
  ~GG3221333(); // tgen
  GG3221333(); // tgen
};
//SIG(1 _ZN3aaa9GG3221333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3221333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32213333fooEv");}
void  aaa::GG3221333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32213333barEv");}
aaa::GG3221333 ::~GG3221333(){ note_dtor("_ZN3aaa9GG3221333E", this);} // tgen
aaa::GG3221333 ::GG3221333(){ note_ctor("_ZN3aaa9GG3221333E", this);} // tgen
}
static void Test__ZN3aaa9GG3221333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3221333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3221333E, buf);
    ::aaa::GG3221333 *dp, &lv = *(dp=new (buf) ::aaa::GG3221333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3221333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3221333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3221333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3221333E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3221333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3221333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3221333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3221333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3221333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3221333E);
    dp->::aaa::GG3221333::~GG3221333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3221333E(Test__ZN3aaa9GG3221333E, "_ZN3aaa9GG3221333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3221333C1Ev();
extern void _ZN3aaa9GG3221333D1Ev();
Name_Map name_map__ZN3aaa9GG3221333E[] = {
  NSPAIR(_ZN3aaa9GG3221333C1Ev),
  NSPAIR(_ZN3aaa9GG3221333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3221333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3221333E[];
extern void _ZN3aaa9GG32213333fooEv();
extern void _ZN3aaa9GG32213333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32213333barEv,_ZThn8_N3aaa9GG32213333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32213333fooEv,_ZThn20_N3aaa9GG32213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32213333barEv,_ZThn20_N3aaa9GG32213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213333fooEv,_ZThn28_N3aaa9GG32213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32213333barEv,_ZThn28_N3aaa9GG32213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3221333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32213333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32213333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32213333barEv,_ZThn8_N3aaa9GG32213333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213333fooEv,_ZThn20_N3aaa9GG32213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32213333barEv,_ZThn20_N3aaa9GG32213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3221333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213333fooEv,_ZThn28_N3aaa9GG32213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32213333barEv,_ZThn28_N3aaa9GG32213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3221333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3221333E[];
Class_Descriptor cd__ZN3aaa9GG3221333E = {  "_ZN3aaa9GG3221333E", // class name
  bases__ZN3aaa9GG3221333E, 6,
  &(vtc__ZN3aaa9GG3221333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3221333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3221333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222111  : ::aaa::EE322 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32221113fooEv
  ~GG3222111(); // tgen
  GG3222111(); // tgen
};
//SIG(1 _ZN3aaa9GG3222111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32221113fooEv");}
aaa::GG3222111 ::~GG3222111(){ note_dtor("_ZN3aaa9GG3222111E", this);} // tgen
aaa::GG3222111 ::GG3222111(){ note_ctor("_ZN3aaa9GG3222111E", this);} // tgen
}
static void Test__ZN3aaa9GG3222111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222111E, buf);
    ::aaa::GG3222111 *dp, &lv = *(dp=new (buf) ::aaa::GG3222111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222111E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3222111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3222111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3222111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222111E);
    dp->::aaa::GG3222111::~GG3222111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222111E(Test__ZN3aaa9GG3222111E, "_ZN3aaa9GG3222111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222111C1Ev();
extern void _ZN3aaa9GG3222111D1Ev();
Name_Map name_map__ZN3aaa9GG3222111E[] = {
  NSPAIR(_ZN3aaa9GG3222111C1Ev),
  NSPAIR(_ZN3aaa9GG3222111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3222111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222111E[];
extern void _ZN3aaa9GG32221113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32221113fooEv,_ZThn20_N3aaa9GG32221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32221113fooEv,_ZThn28_N3aaa9GG32221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32221113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221113fooEv,_ZThn20_N3aaa9GG32221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32221113fooEv,_ZThn28_N3aaa9GG32221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222111E[];
Class_Descriptor cd__ZN3aaa9GG3222111E = {  "_ZN3aaa9GG3222111E", // class name
  bases__ZN3aaa9GG3222111E, 6,
  &(vtc__ZN3aaa9GG3222111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222112  : ::aaa::EE322 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32221123barEv
  ~GG3222112(); // tgen
  GG3222112(); // tgen
};
//SIG(1 _ZN3aaa9GG3222112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32221123barEv");}
aaa::GG3222112 ::~GG3222112(){ note_dtor("_ZN3aaa9GG3222112E", this);} // tgen
aaa::GG3222112 ::GG3222112(){ note_ctor("_ZN3aaa9GG3222112E", this);} // tgen
}
static void Test__ZN3aaa9GG3222112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222112E, buf);
    ::aaa::GG3222112 *dp, &lv = *(dp=new (buf) ::aaa::GG3222112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222112E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3222112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3222112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3222112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222112E);
    dp->::aaa::GG3222112::~GG3222112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222112E(Test__ZN3aaa9GG3222112E, "_ZN3aaa9GG3222112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222112C1Ev();
extern void _ZN3aaa9GG3222112D1Ev();
Name_Map name_map__ZN3aaa9GG3222112E[] = {
  NSPAIR(_ZN3aaa9GG3222112C1Ev),
  NSPAIR(_ZN3aaa9GG3222112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3222112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32221123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32221123barEv,_ZThn8_N3aaa9GG32221123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32221123barEv,_ZThn20_N3aaa9GG32221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32221123barEv,_ZThn8_N3aaa9GG32221123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221123barEv,_ZThn20_N3aaa9GG32221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222112E[];
Class_Descriptor cd__ZN3aaa9GG3222112E = {  "_ZN3aaa9GG3222112E", // class name
  bases__ZN3aaa9GG3222112E, 6,
  &(vtc__ZN3aaa9GG3222112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222113  : ::aaa::EE322 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32221133fooEv
  virtual void  bar(); // _ZN3aaa9GG32221133barEv
  ~GG3222113(); // tgen
  GG3222113(); // tgen
};
//SIG(1 _ZN3aaa9GG3222113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32221133fooEv");}
void  aaa::GG3222113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32221133barEv");}
aaa::GG3222113 ::~GG3222113(){ note_dtor("_ZN3aaa9GG3222113E", this);} // tgen
aaa::GG3222113 ::GG3222113(){ note_ctor("_ZN3aaa9GG3222113E", this);} // tgen
}
static void Test__ZN3aaa9GG3222113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222113E, buf);
    ::aaa::GG3222113 *dp, &lv = *(dp=new (buf) ::aaa::GG3222113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222113E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3222113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3222113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3222113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222113E);
    dp->::aaa::GG3222113::~GG3222113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222113E(Test__ZN3aaa9GG3222113E, "_ZN3aaa9GG3222113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222113C1Ev();
extern void _ZN3aaa9GG3222113D1Ev();
Name_Map name_map__ZN3aaa9GG3222113E[] = {
  NSPAIR(_ZN3aaa9GG3222113C1Ev),
  NSPAIR(_ZN3aaa9GG3222113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3222113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222113E[];
extern void _ZN3aaa9GG32221133fooEv();
extern void _ZN3aaa9GG32221133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32221133barEv,_ZThn8_N3aaa9GG32221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32221133barEv,_ZThn20_N3aaa9GG32221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32221133fooEv,_ZThn20_N3aaa9GG32221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32221133fooEv,_ZThn28_N3aaa9GG32221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32221133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32221133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32221133barEv,_ZThn8_N3aaa9GG32221133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221133barEv,_ZThn20_N3aaa9GG32221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221133fooEv,_ZThn20_N3aaa9GG32221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32221133fooEv,_ZThn28_N3aaa9GG32221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222113E[];
Class_Descriptor cd__ZN3aaa9GG3222113E = {  "_ZN3aaa9GG3222113E", // class name
  bases__ZN3aaa9GG3222113E, 6,
  &(vtc__ZN3aaa9GG3222113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222121  : ::aaa::EE322 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32221213fooEv
  ~GG3222121(); // tgen
  GG3222121(); // tgen
};
//SIG(1 _ZN3aaa9GG3222121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32221213fooEv");}
aaa::GG3222121 ::~GG3222121(){ note_dtor("_ZN3aaa9GG3222121E", this);} // tgen
aaa::GG3222121 ::GG3222121(){ note_ctor("_ZN3aaa9GG3222121E", this);} // tgen
}
static void Test__ZN3aaa9GG3222121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222121E, buf);
    ::aaa::GG3222121 *dp, &lv = *(dp=new (buf) ::aaa::GG3222121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222121E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3222121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3222121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3222121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222121E);
    dp->::aaa::GG3222121::~GG3222121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222121E(Test__ZN3aaa9GG3222121E, "_ZN3aaa9GG3222121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222121C1Ev();
extern void _ZN3aaa9GG3222121D1Ev();
Name_Map name_map__ZN3aaa9GG3222121E[] = {
  NSPAIR(_ZN3aaa9GG3222121C1Ev),
  NSPAIR(_ZN3aaa9GG3222121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3222121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222121E[];
extern void _ZN3aaa9GG32221213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32221213fooEv,_ZThn28_N3aaa9GG32221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32221213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32221213fooEv,_ZThn28_N3aaa9GG32221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222121E[];
Class_Descriptor cd__ZN3aaa9GG3222121E = {  "_ZN3aaa9GG3222121E", // class name
  bases__ZN3aaa9GG3222121E, 6,
  &(vtc__ZN3aaa9GG3222121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222122  : ::aaa::EE322 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32221223barEv
  ~GG3222122(); // tgen
  GG3222122(); // tgen
};
//SIG(1 _ZN3aaa9GG3222122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32221223barEv");}
aaa::GG3222122 ::~GG3222122(){ note_dtor("_ZN3aaa9GG3222122E", this);} // tgen
aaa::GG3222122 ::GG3222122(){ note_ctor("_ZN3aaa9GG3222122E", this);} // tgen
}
static void Test__ZN3aaa9GG3222122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222122E, buf);
    ::aaa::GG3222122 *dp, &lv = *(dp=new (buf) ::aaa::GG3222122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222122E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3222122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3222122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3222122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222122E);
    dp->::aaa::GG3222122::~GG3222122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222122E(Test__ZN3aaa9GG3222122E, "_ZN3aaa9GG3222122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222122C1Ev();
extern void _ZN3aaa9GG3222122D1Ev();
Name_Map name_map__ZN3aaa9GG3222122E[] = {
  NSPAIR(_ZN3aaa9GG3222122C1Ev),
  NSPAIR(_ZN3aaa9GG3222122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3222122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32221223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32221223barEv,_ZThn8_N3aaa9GG32221223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32221223barEv,_ZThn20_N3aaa9GG32221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32221223barEv,_ZThn8_N3aaa9GG32221223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221223barEv,_ZThn20_N3aaa9GG32221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222122E[];
Class_Descriptor cd__ZN3aaa9GG3222122E = {  "_ZN3aaa9GG3222122E", // class name
  bases__ZN3aaa9GG3222122E, 6,
  &(vtc__ZN3aaa9GG3222122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222123  : ::aaa::EE322 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32221233fooEv
  virtual void  bar(); // _ZN3aaa9GG32221233barEv
  ~GG3222123(); // tgen
  GG3222123(); // tgen
};
//SIG(1 _ZN3aaa9GG3222123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32221233fooEv");}
void  aaa::GG3222123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32221233barEv");}
aaa::GG3222123 ::~GG3222123(){ note_dtor("_ZN3aaa9GG3222123E", this);} // tgen
aaa::GG3222123 ::GG3222123(){ note_ctor("_ZN3aaa9GG3222123E", this);} // tgen
}
static void Test__ZN3aaa9GG3222123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222123E, buf);
    ::aaa::GG3222123 *dp, &lv = *(dp=new (buf) ::aaa::GG3222123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222123E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3222123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3222123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3222123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222123E);
    dp->::aaa::GG3222123::~GG3222123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222123E(Test__ZN3aaa9GG3222123E, "_ZN3aaa9GG3222123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222123C1Ev();
extern void _ZN3aaa9GG3222123D1Ev();
Name_Map name_map__ZN3aaa9GG3222123E[] = {
  NSPAIR(_ZN3aaa9GG3222123C1Ev),
  NSPAIR(_ZN3aaa9GG3222123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3222123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222123E[];
extern void _ZN3aaa9GG32221233fooEv();
extern void _ZN3aaa9GG32221233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32221233barEv,_ZThn8_N3aaa9GG32221233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32221233barEv,_ZThn20_N3aaa9GG32221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32221233fooEv,_ZThn28_N3aaa9GG32221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32221233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32221233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32221233barEv,_ZThn8_N3aaa9GG32221233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221233barEv,_ZThn20_N3aaa9GG32221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32221233fooEv,_ZThn28_N3aaa9GG32221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222123E[];
Class_Descriptor cd__ZN3aaa9GG3222123E = {  "_ZN3aaa9GG3222123E", // class name
  bases__ZN3aaa9GG3222123E, 6,
  &(vtc__ZN3aaa9GG3222123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222131  : ::aaa::EE322 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32221313fooEv
  ~GG3222131(); // tgen
  GG3222131(); // tgen
};
//SIG(1 _ZN3aaa9GG3222131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32221313fooEv");}
aaa::GG3222131 ::~GG3222131(){ note_dtor("_ZN3aaa9GG3222131E", this);} // tgen
aaa::GG3222131 ::GG3222131(){ note_ctor("_ZN3aaa9GG3222131E", this);} // tgen
}
static void Test__ZN3aaa9GG3222131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222131E, buf);
    ::aaa::GG3222131 *dp, &lv = *(dp=new (buf) ::aaa::GG3222131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222131E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3222131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3222131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3222131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222131E);
    dp->::aaa::GG3222131::~GG3222131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222131E(Test__ZN3aaa9GG3222131E, "_ZN3aaa9GG3222131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222131C1Ev();
extern void _ZN3aaa9GG3222131D1Ev();
Name_Map name_map__ZN3aaa9GG3222131E[] = {
  NSPAIR(_ZN3aaa9GG3222131C1Ev),
  NSPAIR(_ZN3aaa9GG3222131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3222131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222131E[];
extern void _ZN3aaa9GG32221313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32221313fooEv,_ZThn20_N3aaa9GG32221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32221313fooEv,_ZThn28_N3aaa9GG32221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32221313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221313fooEv,_ZThn20_N3aaa9GG32221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32221313fooEv,_ZThn28_N3aaa9GG32221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222131E[];
Class_Descriptor cd__ZN3aaa9GG3222131E = {  "_ZN3aaa9GG3222131E", // class name
  bases__ZN3aaa9GG3222131E, 6,
  &(vtc__ZN3aaa9GG3222131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222132  : ::aaa::EE322 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32221323barEv
  ~GG3222132(); // tgen
  GG3222132(); // tgen
};
//SIG(1 _ZN3aaa9GG3222132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32221323barEv");}
aaa::GG3222132 ::~GG3222132(){ note_dtor("_ZN3aaa9GG3222132E", this);} // tgen
aaa::GG3222132 ::GG3222132(){ note_ctor("_ZN3aaa9GG3222132E", this);} // tgen
}
static void Test__ZN3aaa9GG3222132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222132E, buf);
    ::aaa::GG3222132 *dp, &lv = *(dp=new (buf) ::aaa::GG3222132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222132E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3222132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3222132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3222132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222132E);
    dp->::aaa::GG3222132::~GG3222132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222132E(Test__ZN3aaa9GG3222132E, "_ZN3aaa9GG3222132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222132C1Ev();
extern void _ZN3aaa9GG3222132D1Ev();
Name_Map name_map__ZN3aaa9GG3222132E[] = {
  NSPAIR(_ZN3aaa9GG3222132C1Ev),
  NSPAIR(_ZN3aaa9GG3222132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3222132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32221323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32221323barEv,_ZThn8_N3aaa9GG32221323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32221323barEv,_ZThn20_N3aaa9GG32221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32221323barEv,_ZThn8_N3aaa9GG32221323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221323barEv,_ZThn20_N3aaa9GG32221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222132E[];
Class_Descriptor cd__ZN3aaa9GG3222132E = {  "_ZN3aaa9GG3222132E", // class name
  bases__ZN3aaa9GG3222132E, 6,
  &(vtc__ZN3aaa9GG3222132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222133  : ::aaa::EE322 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32221333fooEv
  virtual void  bar(); // _ZN3aaa9GG32221333barEv
  ~GG3222133(); // tgen
  GG3222133(); // tgen
};
//SIG(1 _ZN3aaa9GG3222133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32221333fooEv");}
void  aaa::GG3222133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32221333barEv");}
aaa::GG3222133 ::~GG3222133(){ note_dtor("_ZN3aaa9GG3222133E", this);} // tgen
aaa::GG3222133 ::GG3222133(){ note_ctor("_ZN3aaa9GG3222133E", this);} // tgen
}
static void Test__ZN3aaa9GG3222133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222133E, buf);
    ::aaa::GG3222133 *dp, &lv = *(dp=new (buf) ::aaa::GG3222133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222133E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3222133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3222133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3222133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222133E);
    dp->::aaa::GG3222133::~GG3222133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222133E(Test__ZN3aaa9GG3222133E, "_ZN3aaa9GG3222133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222133C1Ev();
extern void _ZN3aaa9GG3222133D1Ev();
Name_Map name_map__ZN3aaa9GG3222133E[] = {
  NSPAIR(_ZN3aaa9GG3222133C1Ev),
  NSPAIR(_ZN3aaa9GG3222133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3222133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222133E[];
extern void _ZN3aaa9GG32221333fooEv();
extern void _ZN3aaa9GG32221333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32221333barEv,_ZThn8_N3aaa9GG32221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32221333barEv,_ZThn20_N3aaa9GG32221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32221333fooEv,_ZThn20_N3aaa9GG32221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32221333fooEv,_ZThn28_N3aaa9GG32221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32221333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32221333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32221333barEv,_ZThn8_N3aaa9GG32221333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221333barEv,_ZThn20_N3aaa9GG32221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32221333fooEv,_ZThn20_N3aaa9GG32221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32221333fooEv,_ZThn28_N3aaa9GG32221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222133E[];
Class_Descriptor cd__ZN3aaa9GG3222133E = {  "_ZN3aaa9GG3222133E", // class name
  bases__ZN3aaa9GG3222133E, 6,
  &(vtc__ZN3aaa9GG3222133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222211  : ::aaa::EE322 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32222113fooEv
  ~GG3222211(); // tgen
  GG3222211(); // tgen
};
//SIG(1 _ZN3aaa9GG3222211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32222113fooEv");}
aaa::GG3222211 ::~GG3222211(){ note_dtor("_ZN3aaa9GG3222211E", this);} // tgen
aaa::GG3222211 ::GG3222211(){ note_ctor("_ZN3aaa9GG3222211E", this);} // tgen
}
static void Test__ZN3aaa9GG3222211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222211E, buf);
    ::aaa::GG3222211 *dp, &lv = *(dp=new (buf) ::aaa::GG3222211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222211E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3222211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3222211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3222211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222211E);
    dp->::aaa::GG3222211::~GG3222211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222211E(Test__ZN3aaa9GG3222211E, "_ZN3aaa9GG3222211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222211C1Ev();
extern void _ZN3aaa9GG3222211D1Ev();
Name_Map name_map__ZN3aaa9GG3222211E[] = {
  NSPAIR(_ZN3aaa9GG3222211C1Ev),
  NSPAIR(_ZN3aaa9GG3222211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3222211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222211E[];
extern void _ZN3aaa9GG32222113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32222113fooEv,_ZThn20_N3aaa9GG32222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32222113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222113fooEv,_ZThn20_N3aaa9GG32222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222211E[];
Class_Descriptor cd__ZN3aaa9GG3222211E = {  "_ZN3aaa9GG3222211E", // class name
  bases__ZN3aaa9GG3222211E, 6,
  &(vtc__ZN3aaa9GG3222211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222212  : ::aaa::EE322 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32222123barEv
  ~GG3222212(); // tgen
  GG3222212(); // tgen
};
//SIG(1 _ZN3aaa9GG3222212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32222123barEv");}
aaa::GG3222212 ::~GG3222212(){ note_dtor("_ZN3aaa9GG3222212E", this);} // tgen
aaa::GG3222212 ::GG3222212(){ note_ctor("_ZN3aaa9GG3222212E", this);} // tgen
}
static void Test__ZN3aaa9GG3222212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222212E, buf);
    ::aaa::GG3222212 *dp, &lv = *(dp=new (buf) ::aaa::GG3222212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222212E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3222212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3222212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3222212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222212E);
    dp->::aaa::GG3222212::~GG3222212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222212E(Test__ZN3aaa9GG3222212E, "_ZN3aaa9GG3222212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222212C1Ev();
extern void _ZN3aaa9GG3222212D1Ev();
Name_Map name_map__ZN3aaa9GG3222212E[] = {
  NSPAIR(_ZN3aaa9GG3222212C1Ev),
  NSPAIR(_ZN3aaa9GG3222212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3222212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32222123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32222123barEv,_ZThn8_N3aaa9GG32222123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32222123barEv,_ZThn20_N3aaa9GG32222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32222123barEv,_ZThn28_N3aaa9GG32222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32222123barEv,_ZThn8_N3aaa9GG32222123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222123barEv,_ZThn20_N3aaa9GG32222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32222123barEv,_ZThn28_N3aaa9GG32222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222212E[];
Class_Descriptor cd__ZN3aaa9GG3222212E = {  "_ZN3aaa9GG3222212E", // class name
  bases__ZN3aaa9GG3222212E, 6,
  &(vtc__ZN3aaa9GG3222212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222213  : ::aaa::EE322 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32222133fooEv
  virtual void  bar(); // _ZN3aaa9GG32222133barEv
  ~GG3222213(); // tgen
  GG3222213(); // tgen
};
//SIG(1 _ZN3aaa9GG3222213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32222133fooEv");}
void  aaa::GG3222213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32222133barEv");}
aaa::GG3222213 ::~GG3222213(){ note_dtor("_ZN3aaa9GG3222213E", this);} // tgen
aaa::GG3222213 ::GG3222213(){ note_ctor("_ZN3aaa9GG3222213E", this);} // tgen
}
static void Test__ZN3aaa9GG3222213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222213E, buf);
    ::aaa::GG3222213 *dp, &lv = *(dp=new (buf) ::aaa::GG3222213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222213E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3222213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3222213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3222213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222213E);
    dp->::aaa::GG3222213::~GG3222213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222213E(Test__ZN3aaa9GG3222213E, "_ZN3aaa9GG3222213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222213C1Ev();
extern void _ZN3aaa9GG3222213D1Ev();
Name_Map name_map__ZN3aaa9GG3222213E[] = {
  NSPAIR(_ZN3aaa9GG3222213C1Ev),
  NSPAIR(_ZN3aaa9GG3222213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3222213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222213E[];
extern void _ZN3aaa9GG32222133fooEv();
extern void _ZN3aaa9GG32222133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32222133barEv,_ZThn8_N3aaa9GG32222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32222133barEv,_ZThn20_N3aaa9GG32222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32222133fooEv,_ZThn20_N3aaa9GG32222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32222133barEv,_ZThn28_N3aaa9GG32222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32222133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32222133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32222133barEv,_ZThn8_N3aaa9GG32222133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222133barEv,_ZThn20_N3aaa9GG32222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222133fooEv,_ZThn20_N3aaa9GG32222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32222133barEv,_ZThn28_N3aaa9GG32222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222213E[];
Class_Descriptor cd__ZN3aaa9GG3222213E = {  "_ZN3aaa9GG3222213E", // class name
  bases__ZN3aaa9GG3222213E, 6,
  &(vtc__ZN3aaa9GG3222213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222221  : ::aaa::EE322 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32222213fooEv
  ~GG3222221(); // tgen
  GG3222221(); // tgen
};
//SIG(1 _ZN3aaa9GG3222221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32222213fooEv");}
aaa::GG3222221 ::~GG3222221(){ note_dtor("_ZN3aaa9GG3222221E", this);} // tgen
aaa::GG3222221 ::GG3222221(){ note_ctor("_ZN3aaa9GG3222221E", this);} // tgen
}
static void Test__ZN3aaa9GG3222221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222221E, buf);
    ::aaa::GG3222221 *dp, &lv = *(dp=new (buf) ::aaa::GG3222221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222221E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3222221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3222221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3222221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222221E);
    dp->::aaa::GG3222221::~GG3222221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222221E(Test__ZN3aaa9GG3222221E, "_ZN3aaa9GG3222221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222221C1Ev();
extern void _ZN3aaa9GG3222221D1Ev();
Name_Map name_map__ZN3aaa9GG3222221E[] = {
  NSPAIR(_ZN3aaa9GG3222221C1Ev),
  NSPAIR(_ZN3aaa9GG3222221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3222221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222221E[];
extern void _ZN3aaa9GG32222213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32222213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222221E[];
Class_Descriptor cd__ZN3aaa9GG3222221E = {  "_ZN3aaa9GG3222221E", // class name
  bases__ZN3aaa9GG3222221E, 6,
  &(vtc__ZN3aaa9GG3222221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222222  : ::aaa::EE322 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32222223barEv
  ~GG3222222(); // tgen
  GG3222222(); // tgen
};
//SIG(1 _ZN3aaa9GG3222222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32222223barEv");}
aaa::GG3222222 ::~GG3222222(){ note_dtor("_ZN3aaa9GG3222222E", this);} // tgen
aaa::GG3222222 ::GG3222222(){ note_ctor("_ZN3aaa9GG3222222E", this);} // tgen
}
static void Test__ZN3aaa9GG3222222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222222E, buf);
    ::aaa::GG3222222 *dp, &lv = *(dp=new (buf) ::aaa::GG3222222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222222E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3222222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3222222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3222222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222222E);
    dp->::aaa::GG3222222::~GG3222222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222222E(Test__ZN3aaa9GG3222222E, "_ZN3aaa9GG3222222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222222C1Ev();
extern void _ZN3aaa9GG3222222D1Ev();
Name_Map name_map__ZN3aaa9GG3222222E[] = {
  NSPAIR(_ZN3aaa9GG3222222C1Ev),
  NSPAIR(_ZN3aaa9GG3222222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3222222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32222223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32222223barEv,_ZThn8_N3aaa9GG32222223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32222223barEv,_ZThn20_N3aaa9GG32222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32222223barEv,_ZThn28_N3aaa9GG32222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32222223barEv,_ZThn8_N3aaa9GG32222223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222223barEv,_ZThn20_N3aaa9GG32222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32222223barEv,_ZThn28_N3aaa9GG32222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222222E[];
Class_Descriptor cd__ZN3aaa9GG3222222E = {  "_ZN3aaa9GG3222222E", // class name
  bases__ZN3aaa9GG3222222E, 6,
  &(vtc__ZN3aaa9GG3222222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222223  : ::aaa::EE322 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32222233fooEv
  virtual void  bar(); // _ZN3aaa9GG32222233barEv
  ~GG3222223(); // tgen
  GG3222223(); // tgen
};
//SIG(1 _ZN3aaa9GG3222223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32222233fooEv");}
void  aaa::GG3222223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32222233barEv");}
aaa::GG3222223 ::~GG3222223(){ note_dtor("_ZN3aaa9GG3222223E", this);} // tgen
aaa::GG3222223 ::GG3222223(){ note_ctor("_ZN3aaa9GG3222223E", this);} // tgen
}
static void Test__ZN3aaa9GG3222223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222223E, buf);
    ::aaa::GG3222223 *dp, &lv = *(dp=new (buf) ::aaa::GG3222223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222223E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3222223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3222223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3222223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222223E);
    dp->::aaa::GG3222223::~GG3222223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222223E(Test__ZN3aaa9GG3222223E, "_ZN3aaa9GG3222223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222223C1Ev();
extern void _ZN3aaa9GG3222223D1Ev();
Name_Map name_map__ZN3aaa9GG3222223E[] = {
  NSPAIR(_ZN3aaa9GG3222223C1Ev),
  NSPAIR(_ZN3aaa9GG3222223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3222223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222223E[];
extern void _ZN3aaa9GG32222233fooEv();
extern void _ZN3aaa9GG32222233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32222233barEv,_ZThn8_N3aaa9GG32222233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32222233barEv,_ZThn20_N3aaa9GG32222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32222233barEv,_ZThn28_N3aaa9GG32222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32222233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32222233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32222233barEv,_ZThn8_N3aaa9GG32222233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222233barEv,_ZThn20_N3aaa9GG32222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32222233barEv,_ZThn28_N3aaa9GG32222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222223E[];
Class_Descriptor cd__ZN3aaa9GG3222223E = {  "_ZN3aaa9GG3222223E", // class name
  bases__ZN3aaa9GG3222223E, 6,
  &(vtc__ZN3aaa9GG3222223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222231  : ::aaa::EE322 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32222313fooEv
  ~GG3222231(); // tgen
  GG3222231(); // tgen
};
//SIG(1 _ZN3aaa9GG3222231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32222313fooEv");}
aaa::GG3222231 ::~GG3222231(){ note_dtor("_ZN3aaa9GG3222231E", this);} // tgen
aaa::GG3222231 ::GG3222231(){ note_ctor("_ZN3aaa9GG3222231E", this);} // tgen
}
static void Test__ZN3aaa9GG3222231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222231E, buf);
    ::aaa::GG3222231 *dp, &lv = *(dp=new (buf) ::aaa::GG3222231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222231E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3222231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3222231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3222231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222231E);
    dp->::aaa::GG3222231::~GG3222231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222231E(Test__ZN3aaa9GG3222231E, "_ZN3aaa9GG3222231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222231C1Ev();
extern void _ZN3aaa9GG3222231D1Ev();
Name_Map name_map__ZN3aaa9GG3222231E[] = {
  NSPAIR(_ZN3aaa9GG3222231C1Ev),
  NSPAIR(_ZN3aaa9GG3222231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3222231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222231E[];
extern void _ZN3aaa9GG32222313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32222313fooEv,_ZThn20_N3aaa9GG32222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32222313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222313fooEv,_ZThn20_N3aaa9GG32222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222231E[];
Class_Descriptor cd__ZN3aaa9GG3222231E = {  "_ZN3aaa9GG3222231E", // class name
  bases__ZN3aaa9GG3222231E, 6,
  &(vtc__ZN3aaa9GG3222231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222232  : ::aaa::EE322 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32222323barEv
  ~GG3222232(); // tgen
  GG3222232(); // tgen
};
//SIG(1 _ZN3aaa9GG3222232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32222323barEv");}
aaa::GG3222232 ::~GG3222232(){ note_dtor("_ZN3aaa9GG3222232E", this);} // tgen
aaa::GG3222232 ::GG3222232(){ note_ctor("_ZN3aaa9GG3222232E", this);} // tgen
}
static void Test__ZN3aaa9GG3222232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222232E, buf);
    ::aaa::GG3222232 *dp, &lv = *(dp=new (buf) ::aaa::GG3222232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222232E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3222232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3222232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3222232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222232E);
    dp->::aaa::GG3222232::~GG3222232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222232E(Test__ZN3aaa9GG3222232E, "_ZN3aaa9GG3222232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222232C1Ev();
extern void _ZN3aaa9GG3222232D1Ev();
Name_Map name_map__ZN3aaa9GG3222232E[] = {
  NSPAIR(_ZN3aaa9GG3222232C1Ev),
  NSPAIR(_ZN3aaa9GG3222232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3222232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32222323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32222323barEv,_ZThn8_N3aaa9GG32222323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32222323barEv,_ZThn20_N3aaa9GG32222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32222323barEv,_ZThn28_N3aaa9GG32222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32222323barEv,_ZThn8_N3aaa9GG32222323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222323barEv,_ZThn20_N3aaa9GG32222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32222323barEv,_ZThn28_N3aaa9GG32222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222232E[];
Class_Descriptor cd__ZN3aaa9GG3222232E = {  "_ZN3aaa9GG3222232E", // class name
  bases__ZN3aaa9GG3222232E, 6,
  &(vtc__ZN3aaa9GG3222232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222233  : ::aaa::EE322 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32222333fooEv
  virtual void  bar(); // _ZN3aaa9GG32222333barEv
  ~GG3222233(); // tgen
  GG3222233(); // tgen
};
//SIG(1 _ZN3aaa9GG3222233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32222333fooEv");}
void  aaa::GG3222233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32222333barEv");}
aaa::GG3222233 ::~GG3222233(){ note_dtor("_ZN3aaa9GG3222233E", this);} // tgen
aaa::GG3222233 ::GG3222233(){ note_ctor("_ZN3aaa9GG3222233E", this);} // tgen
}
static void Test__ZN3aaa9GG3222233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222233E, buf);
    ::aaa::GG3222233 *dp, &lv = *(dp=new (buf) ::aaa::GG3222233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222233E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3222233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3222233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3222233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222233E);
    dp->::aaa::GG3222233::~GG3222233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222233E(Test__ZN3aaa9GG3222233E, "_ZN3aaa9GG3222233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222233C1Ev();
extern void _ZN3aaa9GG3222233D1Ev();
Name_Map name_map__ZN3aaa9GG3222233E[] = {
  NSPAIR(_ZN3aaa9GG3222233C1Ev),
  NSPAIR(_ZN3aaa9GG3222233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3222233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222233E[];
extern void _ZN3aaa9GG32222333fooEv();
extern void _ZN3aaa9GG32222333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32222333barEv,_ZThn8_N3aaa9GG32222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32222333barEv,_ZThn20_N3aaa9GG32222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32222333fooEv,_ZThn20_N3aaa9GG32222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32222333barEv,_ZThn28_N3aaa9GG32222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32222333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32222333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32222333barEv,_ZThn8_N3aaa9GG32222333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222333barEv,_ZThn20_N3aaa9GG32222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32222333fooEv,_ZThn20_N3aaa9GG32222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32222333barEv,_ZThn28_N3aaa9GG32222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222233E[];
Class_Descriptor cd__ZN3aaa9GG3222233E = {  "_ZN3aaa9GG3222233E", // class name
  bases__ZN3aaa9GG3222233E, 6,
  &(vtc__ZN3aaa9GG3222233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222311  : ::aaa::EE322 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32223113fooEv
  ~GG3222311(); // tgen
  GG3222311(); // tgen
};
//SIG(1 _ZN3aaa9GG3222311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32223113fooEv");}
aaa::GG3222311 ::~GG3222311(){ note_dtor("_ZN3aaa9GG3222311E", this);} // tgen
aaa::GG3222311 ::GG3222311(){ note_ctor("_ZN3aaa9GG3222311E", this);} // tgen
}
static void Test__ZN3aaa9GG3222311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222311E, buf);
    ::aaa::GG3222311 *dp, &lv = *(dp=new (buf) ::aaa::GG3222311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222311E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3222311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3222311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3222311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222311E);
    dp->::aaa::GG3222311::~GG3222311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222311E(Test__ZN3aaa9GG3222311E, "_ZN3aaa9GG3222311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222311C1Ev();
extern void _ZN3aaa9GG3222311D1Ev();
Name_Map name_map__ZN3aaa9GG3222311E[] = {
  NSPAIR(_ZN3aaa9GG3222311C1Ev),
  NSPAIR(_ZN3aaa9GG3222311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3222311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222311E[];
extern void _ZN3aaa9GG32223113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32223113fooEv,_ZThn20_N3aaa9GG32223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223113fooEv,_ZThn28_N3aaa9GG32223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32223113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223113fooEv,_ZThn20_N3aaa9GG32223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223113fooEv,_ZThn28_N3aaa9GG32223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222311E[];
Class_Descriptor cd__ZN3aaa9GG3222311E = {  "_ZN3aaa9GG3222311E", // class name
  bases__ZN3aaa9GG3222311E, 6,
  &(vtc__ZN3aaa9GG3222311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222312  : ::aaa::EE322 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32223123barEv
  ~GG3222312(); // tgen
  GG3222312(); // tgen
};
//SIG(1 _ZN3aaa9GG3222312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32223123barEv");}
aaa::GG3222312 ::~GG3222312(){ note_dtor("_ZN3aaa9GG3222312E", this);} // tgen
aaa::GG3222312 ::GG3222312(){ note_ctor("_ZN3aaa9GG3222312E", this);} // tgen
}
static void Test__ZN3aaa9GG3222312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222312E, buf);
    ::aaa::GG3222312 *dp, &lv = *(dp=new (buf) ::aaa::GG3222312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222312E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3222312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3222312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3222312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222312E);
    dp->::aaa::GG3222312::~GG3222312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222312E(Test__ZN3aaa9GG3222312E, "_ZN3aaa9GG3222312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222312C1Ev();
extern void _ZN3aaa9GG3222312D1Ev();
Name_Map name_map__ZN3aaa9GG3222312E[] = {
  NSPAIR(_ZN3aaa9GG3222312C1Ev),
  NSPAIR(_ZN3aaa9GG3222312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3222312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32223123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32223123barEv,_ZThn8_N3aaa9GG32223123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32223123barEv,_ZThn20_N3aaa9GG32223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223123barEv,_ZThn28_N3aaa9GG32223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32223123barEv,_ZThn8_N3aaa9GG32223123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223123barEv,_ZThn20_N3aaa9GG32223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223123barEv,_ZThn28_N3aaa9GG32223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222312E[];
Class_Descriptor cd__ZN3aaa9GG3222312E = {  "_ZN3aaa9GG3222312E", // class name
  bases__ZN3aaa9GG3222312E, 6,
  &(vtc__ZN3aaa9GG3222312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222313  : ::aaa::EE322 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32223133fooEv
  virtual void  bar(); // _ZN3aaa9GG32223133barEv
  ~GG3222313(); // tgen
  GG3222313(); // tgen
};
//SIG(1 _ZN3aaa9GG3222313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32223133fooEv");}
void  aaa::GG3222313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32223133barEv");}
aaa::GG3222313 ::~GG3222313(){ note_dtor("_ZN3aaa9GG3222313E", this);} // tgen
aaa::GG3222313 ::GG3222313(){ note_ctor("_ZN3aaa9GG3222313E", this);} // tgen
}
static void Test__ZN3aaa9GG3222313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222313E, buf);
    ::aaa::GG3222313 *dp, &lv = *(dp=new (buf) ::aaa::GG3222313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222313E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3222313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3222313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3222313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222313E);
    dp->::aaa::GG3222313::~GG3222313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222313E(Test__ZN3aaa9GG3222313E, "_ZN3aaa9GG3222313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222313C1Ev();
extern void _ZN3aaa9GG3222313D1Ev();
Name_Map name_map__ZN3aaa9GG3222313E[] = {
  NSPAIR(_ZN3aaa9GG3222313C1Ev),
  NSPAIR(_ZN3aaa9GG3222313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3222313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222313E[];
extern void _ZN3aaa9GG32223133fooEv();
extern void _ZN3aaa9GG32223133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32223133barEv,_ZThn8_N3aaa9GG32223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32223133barEv,_ZThn20_N3aaa9GG32223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32223133fooEv,_ZThn20_N3aaa9GG32223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223133fooEv,_ZThn28_N3aaa9GG32223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223133barEv,_ZThn28_N3aaa9GG32223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32223133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32223133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32223133barEv,_ZThn8_N3aaa9GG32223133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223133barEv,_ZThn20_N3aaa9GG32223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223133fooEv,_ZThn20_N3aaa9GG32223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223133fooEv,_ZThn28_N3aaa9GG32223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223133barEv,_ZThn28_N3aaa9GG32223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222313E[];
Class_Descriptor cd__ZN3aaa9GG3222313E = {  "_ZN3aaa9GG3222313E", // class name
  bases__ZN3aaa9GG3222313E, 6,
  &(vtc__ZN3aaa9GG3222313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222321  : ::aaa::EE322 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32223213fooEv
  ~GG3222321(); // tgen
  GG3222321(); // tgen
};
//SIG(1 _ZN3aaa9GG3222321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32223213fooEv");}
aaa::GG3222321 ::~GG3222321(){ note_dtor("_ZN3aaa9GG3222321E", this);} // tgen
aaa::GG3222321 ::GG3222321(){ note_ctor("_ZN3aaa9GG3222321E", this);} // tgen
}
static void Test__ZN3aaa9GG3222321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222321E, buf);
    ::aaa::GG3222321 *dp, &lv = *(dp=new (buf) ::aaa::GG3222321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222321E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3222321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3222321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3222321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222321E);
    dp->::aaa::GG3222321::~GG3222321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222321E(Test__ZN3aaa9GG3222321E, "_ZN3aaa9GG3222321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222321C1Ev();
extern void _ZN3aaa9GG3222321D1Ev();
Name_Map name_map__ZN3aaa9GG3222321E[] = {
  NSPAIR(_ZN3aaa9GG3222321C1Ev),
  NSPAIR(_ZN3aaa9GG3222321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3222321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222321E[];
extern void _ZN3aaa9GG32223213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32223213fooEv,_ZThn28_N3aaa9GG32223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32223213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223213fooEv,_ZThn28_N3aaa9GG32223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222321E[];
Class_Descriptor cd__ZN3aaa9GG3222321E = {  "_ZN3aaa9GG3222321E", // class name
  bases__ZN3aaa9GG3222321E, 6,
  &(vtc__ZN3aaa9GG3222321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222322  : ::aaa::EE322 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32223223barEv
  ~GG3222322(); // tgen
  GG3222322(); // tgen
};
//SIG(1 _ZN3aaa9GG3222322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32223223barEv");}
aaa::GG3222322 ::~GG3222322(){ note_dtor("_ZN3aaa9GG3222322E", this);} // tgen
aaa::GG3222322 ::GG3222322(){ note_ctor("_ZN3aaa9GG3222322E", this);} // tgen
}
static void Test__ZN3aaa9GG3222322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222322E, buf);
    ::aaa::GG3222322 *dp, &lv = *(dp=new (buf) ::aaa::GG3222322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222322E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3222322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3222322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3222322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222322E);
    dp->::aaa::GG3222322::~GG3222322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222322E(Test__ZN3aaa9GG3222322E, "_ZN3aaa9GG3222322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222322C1Ev();
extern void _ZN3aaa9GG3222322D1Ev();
Name_Map name_map__ZN3aaa9GG3222322E[] = {
  NSPAIR(_ZN3aaa9GG3222322C1Ev),
  NSPAIR(_ZN3aaa9GG3222322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3222322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32223223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32223223barEv,_ZThn8_N3aaa9GG32223223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32223223barEv,_ZThn20_N3aaa9GG32223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32223223barEv,_ZThn28_N3aaa9GG32223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32223223barEv,_ZThn8_N3aaa9GG32223223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223223barEv,_ZThn20_N3aaa9GG32223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223223barEv,_ZThn28_N3aaa9GG32223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222322E[];
Class_Descriptor cd__ZN3aaa9GG3222322E = {  "_ZN3aaa9GG3222322E", // class name
  bases__ZN3aaa9GG3222322E, 6,
  &(vtc__ZN3aaa9GG3222322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222323  : ::aaa::EE322 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32223233fooEv
  virtual void  bar(); // _ZN3aaa9GG32223233barEv
  ~GG3222323(); // tgen
  GG3222323(); // tgen
};
//SIG(1 _ZN3aaa9GG3222323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32223233fooEv");}
void  aaa::GG3222323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32223233barEv");}
aaa::GG3222323 ::~GG3222323(){ note_dtor("_ZN3aaa9GG3222323E", this);} // tgen
aaa::GG3222323 ::GG3222323(){ note_ctor("_ZN3aaa9GG3222323E", this);} // tgen
}
static void Test__ZN3aaa9GG3222323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222323E, buf);
    ::aaa::GG3222323 *dp, &lv = *(dp=new (buf) ::aaa::GG3222323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222323E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3222323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3222323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3222323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222323E);
    dp->::aaa::GG3222323::~GG3222323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222323E(Test__ZN3aaa9GG3222323E, "_ZN3aaa9GG3222323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222323C1Ev();
extern void _ZN3aaa9GG3222323D1Ev();
Name_Map name_map__ZN3aaa9GG3222323E[] = {
  NSPAIR(_ZN3aaa9GG3222323C1Ev),
  NSPAIR(_ZN3aaa9GG3222323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3222323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222323E[];
extern void _ZN3aaa9GG32223233fooEv();
extern void _ZN3aaa9GG32223233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32223233barEv,_ZThn8_N3aaa9GG32223233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32223233barEv,_ZThn20_N3aaa9GG32223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223233fooEv,_ZThn28_N3aaa9GG32223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223233barEv,_ZThn28_N3aaa9GG32223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32223233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32223233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32223233barEv,_ZThn8_N3aaa9GG32223233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223233barEv,_ZThn20_N3aaa9GG32223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223233fooEv,_ZThn28_N3aaa9GG32223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223233barEv,_ZThn28_N3aaa9GG32223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222323E[];
Class_Descriptor cd__ZN3aaa9GG3222323E = {  "_ZN3aaa9GG3222323E", // class name
  bases__ZN3aaa9GG3222323E, 6,
  &(vtc__ZN3aaa9GG3222323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222331  : ::aaa::EE322 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32223313fooEv
  ~GG3222331(); // tgen
  GG3222331(); // tgen
};
//SIG(1 _ZN3aaa9GG3222331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32223313fooEv");}
aaa::GG3222331 ::~GG3222331(){ note_dtor("_ZN3aaa9GG3222331E", this);} // tgen
aaa::GG3222331 ::GG3222331(){ note_ctor("_ZN3aaa9GG3222331E", this);} // tgen
}
static void Test__ZN3aaa9GG3222331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222331E, buf);
    ::aaa::GG3222331 *dp, &lv = *(dp=new (buf) ::aaa::GG3222331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222331E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3222331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3222331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3222331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222331E);
    dp->::aaa::GG3222331::~GG3222331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222331E(Test__ZN3aaa9GG3222331E, "_ZN3aaa9GG3222331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222331C1Ev();
extern void _ZN3aaa9GG3222331D1Ev();
Name_Map name_map__ZN3aaa9GG3222331E[] = {
  NSPAIR(_ZN3aaa9GG3222331C1Ev),
  NSPAIR(_ZN3aaa9GG3222331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3222331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222331E[];
extern void _ZN3aaa9GG32223313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32223313fooEv,_ZThn20_N3aaa9GG32223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223313fooEv,_ZThn28_N3aaa9GG32223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32223313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223313fooEv,_ZThn20_N3aaa9GG32223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223313fooEv,_ZThn28_N3aaa9GG32223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222331E[];
Class_Descriptor cd__ZN3aaa9GG3222331E = {  "_ZN3aaa9GG3222331E", // class name
  bases__ZN3aaa9GG3222331E, 6,
  &(vtc__ZN3aaa9GG3222331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222332  : ::aaa::EE322 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32223323barEv
  ~GG3222332(); // tgen
  GG3222332(); // tgen
};
//SIG(1 _ZN3aaa9GG3222332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3222332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32223323barEv");}
aaa::GG3222332 ::~GG3222332(){ note_dtor("_ZN3aaa9GG3222332E", this);} // tgen
aaa::GG3222332 ::GG3222332(){ note_ctor("_ZN3aaa9GG3222332E", this);} // tgen
}
static void Test__ZN3aaa9GG3222332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222332E, buf);
    ::aaa::GG3222332 *dp, &lv = *(dp=new (buf) ::aaa::GG3222332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222332E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3222332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3222332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3222332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222332E);
    dp->::aaa::GG3222332::~GG3222332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222332E(Test__ZN3aaa9GG3222332E, "_ZN3aaa9GG3222332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222332C1Ev();
extern void _ZN3aaa9GG3222332D1Ev();
Name_Map name_map__ZN3aaa9GG3222332E[] = {
  NSPAIR(_ZN3aaa9GG3222332C1Ev),
  NSPAIR(_ZN3aaa9GG3222332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3222332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32223323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32223323barEv,_ZThn8_N3aaa9GG32223323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32223323barEv,_ZThn20_N3aaa9GG32223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223323barEv,_ZThn28_N3aaa9GG32223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32223323barEv,_ZThn8_N3aaa9GG32223323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223323barEv,_ZThn20_N3aaa9GG32223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223323barEv,_ZThn28_N3aaa9GG32223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222332E[];
Class_Descriptor cd__ZN3aaa9GG3222332E = {  "_ZN3aaa9GG3222332E", // class name
  bases__ZN3aaa9GG3222332E, 6,
  &(vtc__ZN3aaa9GG3222332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3222333  : ::aaa::EE322 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32223333fooEv
  virtual void  bar(); // _ZN3aaa9GG32223333barEv
  ~GG3222333(); // tgen
  GG3222333(); // tgen
};
//SIG(1 _ZN3aaa9GG3222333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3222333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32223333fooEv");}
void  aaa::GG3222333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32223333barEv");}
aaa::GG3222333 ::~GG3222333(){ note_dtor("_ZN3aaa9GG3222333E", this);} // tgen
aaa::GG3222333 ::GG3222333(){ note_ctor("_ZN3aaa9GG3222333E", this);} // tgen
}
static void Test__ZN3aaa9GG3222333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3222333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3222333E, buf);
    ::aaa::GG3222333 *dp, &lv = *(dp=new (buf) ::aaa::GG3222333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3222333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3222333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3222333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3222333E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3222333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3222333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3222333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3222333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3222333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3222333E);
    dp->::aaa::GG3222333::~GG3222333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3222333E(Test__ZN3aaa9GG3222333E, "_ZN3aaa9GG3222333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3222333C1Ev();
extern void _ZN3aaa9GG3222333D1Ev();
Name_Map name_map__ZN3aaa9GG3222333E[] = {
  NSPAIR(_ZN3aaa9GG3222333C1Ev),
  NSPAIR(_ZN3aaa9GG3222333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3222333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3222333E[];
extern void _ZN3aaa9GG32223333fooEv();
extern void _ZN3aaa9GG32223333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32223333barEv,_ZThn8_N3aaa9GG32223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32223333barEv,_ZThn20_N3aaa9GG32223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32223333fooEv,_ZThn20_N3aaa9GG32223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223333fooEv,_ZThn28_N3aaa9GG32223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32223333barEv,_ZThn28_N3aaa9GG32223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3222333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32223333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32223333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32223333barEv,_ZThn8_N3aaa9GG32223333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223333barEv,_ZThn20_N3aaa9GG32223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32223333fooEv,_ZThn20_N3aaa9GG32223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3222333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223333fooEv,_ZThn28_N3aaa9GG32223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32223333barEv,_ZThn28_N3aaa9GG32223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3222333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3222333E[];
Class_Descriptor cd__ZN3aaa9GG3222333E = {  "_ZN3aaa9GG3222333E", // class name
  bases__ZN3aaa9GG3222333E, 6,
  &(vtc__ZN3aaa9GG3222333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3222333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3222333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223111  : ::aaa::EE322 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32231113fooEv
  ~GG3223111(); // tgen
  GG3223111(); // tgen
};
//SIG(1 _ZN3aaa9GG3223111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32231113fooEv");}
aaa::GG3223111 ::~GG3223111(){ note_dtor("_ZN3aaa9GG3223111E", this);} // tgen
aaa::GG3223111 ::GG3223111(){ note_ctor("_ZN3aaa9GG3223111E", this);} // tgen
}
static void Test__ZN3aaa9GG3223111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223111E, buf);
    ::aaa::GG3223111 *dp, &lv = *(dp=new (buf) ::aaa::GG3223111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223111E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3223111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3223111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3223111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223111E);
    dp->::aaa::GG3223111::~GG3223111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223111E(Test__ZN3aaa9GG3223111E, "_ZN3aaa9GG3223111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223111C1Ev();
extern void _ZN3aaa9GG3223111D1Ev();
Name_Map name_map__ZN3aaa9GG3223111E[] = {
  NSPAIR(_ZN3aaa9GG3223111C1Ev),
  NSPAIR(_ZN3aaa9GG3223111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3223111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223111E[];
extern void _ZN3aaa9GG32231113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231113fooEv,_ZThn20_N3aaa9GG32231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32231113fooEv,_ZThn28_N3aaa9GG32231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32231113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231113fooEv,_ZThn20_N3aaa9GG32231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32231113fooEv,_ZThn28_N3aaa9GG32231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223111E[];
Class_Descriptor cd__ZN3aaa9GG3223111E = {  "_ZN3aaa9GG3223111E", // class name
  bases__ZN3aaa9GG3223111E, 6,
  &(vtc__ZN3aaa9GG3223111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223112  : ::aaa::EE322 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32231123barEv
  ~GG3223112(); // tgen
  GG3223112(); // tgen
};
//SIG(1 _ZN3aaa9GG3223112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32231123barEv");}
aaa::GG3223112 ::~GG3223112(){ note_dtor("_ZN3aaa9GG3223112E", this);} // tgen
aaa::GG3223112 ::GG3223112(){ note_ctor("_ZN3aaa9GG3223112E", this);} // tgen
}
static void Test__ZN3aaa9GG3223112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223112E, buf);
    ::aaa::GG3223112 *dp, &lv = *(dp=new (buf) ::aaa::GG3223112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223112E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3223112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3223112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3223112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223112E);
    dp->::aaa::GG3223112::~GG3223112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223112E(Test__ZN3aaa9GG3223112E, "_ZN3aaa9GG3223112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223112C1Ev();
extern void _ZN3aaa9GG3223112D1Ev();
Name_Map name_map__ZN3aaa9GG3223112E[] = {
  NSPAIR(_ZN3aaa9GG3223112C1Ev),
  NSPAIR(_ZN3aaa9GG3223112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3223112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32231123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32231123barEv,_ZThn8_N3aaa9GG32231123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32231123barEv,_ZThn20_N3aaa9GG32231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32231123barEv,_ZThn8_N3aaa9GG32231123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231123barEv,_ZThn20_N3aaa9GG32231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223112E[];
Class_Descriptor cd__ZN3aaa9GG3223112E = {  "_ZN3aaa9GG3223112E", // class name
  bases__ZN3aaa9GG3223112E, 6,
  &(vtc__ZN3aaa9GG3223112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223113  : ::aaa::EE322 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32231133fooEv
  virtual void  bar(); // _ZN3aaa9GG32231133barEv
  ~GG3223113(); // tgen
  GG3223113(); // tgen
};
//SIG(1 _ZN3aaa9GG3223113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32231133fooEv");}
void  aaa::GG3223113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32231133barEv");}
aaa::GG3223113 ::~GG3223113(){ note_dtor("_ZN3aaa9GG3223113E", this);} // tgen
aaa::GG3223113 ::GG3223113(){ note_ctor("_ZN3aaa9GG3223113E", this);} // tgen
}
static void Test__ZN3aaa9GG3223113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223113E, buf);
    ::aaa::GG3223113 *dp, &lv = *(dp=new (buf) ::aaa::GG3223113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223113E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3223113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3223113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3223113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223113E);
    dp->::aaa::GG3223113::~GG3223113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223113E(Test__ZN3aaa9GG3223113E, "_ZN3aaa9GG3223113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223113C1Ev();
extern void _ZN3aaa9GG3223113D1Ev();
Name_Map name_map__ZN3aaa9GG3223113E[] = {
  NSPAIR(_ZN3aaa9GG3223113C1Ev),
  NSPAIR(_ZN3aaa9GG3223113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3223113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223113E[];
extern void _ZN3aaa9GG32231133fooEv();
extern void _ZN3aaa9GG32231133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32231133barEv,_ZThn8_N3aaa9GG32231133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231133fooEv,_ZThn20_N3aaa9GG32231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231133barEv,_ZThn20_N3aaa9GG32231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32231133fooEv,_ZThn28_N3aaa9GG32231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32231133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32231133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32231133barEv,_ZThn8_N3aaa9GG32231133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231133fooEv,_ZThn20_N3aaa9GG32231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231133barEv,_ZThn20_N3aaa9GG32231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32231133fooEv,_ZThn28_N3aaa9GG32231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223113E[];
Class_Descriptor cd__ZN3aaa9GG3223113E = {  "_ZN3aaa9GG3223113E", // class name
  bases__ZN3aaa9GG3223113E, 6,
  &(vtc__ZN3aaa9GG3223113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223121  : ::aaa::EE322 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32231213fooEv
  ~GG3223121(); // tgen
  GG3223121(); // tgen
};
//SIG(1 _ZN3aaa9GG3223121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32231213fooEv");}
aaa::GG3223121 ::~GG3223121(){ note_dtor("_ZN3aaa9GG3223121E", this);} // tgen
aaa::GG3223121 ::GG3223121(){ note_ctor("_ZN3aaa9GG3223121E", this);} // tgen
}
static void Test__ZN3aaa9GG3223121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223121E, buf);
    ::aaa::GG3223121 *dp, &lv = *(dp=new (buf) ::aaa::GG3223121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223121E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3223121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3223121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3223121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223121E);
    dp->::aaa::GG3223121::~GG3223121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223121E(Test__ZN3aaa9GG3223121E, "_ZN3aaa9GG3223121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223121C1Ev();
extern void _ZN3aaa9GG3223121D1Ev();
Name_Map name_map__ZN3aaa9GG3223121E[] = {
  NSPAIR(_ZN3aaa9GG3223121C1Ev),
  NSPAIR(_ZN3aaa9GG3223121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3223121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223121E[];
extern void _ZN3aaa9GG32231213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231213fooEv,_ZThn20_N3aaa9GG32231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32231213fooEv,_ZThn28_N3aaa9GG32231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32231213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231213fooEv,_ZThn20_N3aaa9GG32231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32231213fooEv,_ZThn28_N3aaa9GG32231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223121E[];
Class_Descriptor cd__ZN3aaa9GG3223121E = {  "_ZN3aaa9GG3223121E", // class name
  bases__ZN3aaa9GG3223121E, 6,
  &(vtc__ZN3aaa9GG3223121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223122  : ::aaa::EE322 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32231223barEv
  ~GG3223122(); // tgen
  GG3223122(); // tgen
};
//SIG(1 _ZN3aaa9GG3223122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32231223barEv");}
aaa::GG3223122 ::~GG3223122(){ note_dtor("_ZN3aaa9GG3223122E", this);} // tgen
aaa::GG3223122 ::GG3223122(){ note_ctor("_ZN3aaa9GG3223122E", this);} // tgen
}
static void Test__ZN3aaa9GG3223122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223122E, buf);
    ::aaa::GG3223122 *dp, &lv = *(dp=new (buf) ::aaa::GG3223122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223122E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3223122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3223122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3223122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223122E);
    dp->::aaa::GG3223122::~GG3223122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223122E(Test__ZN3aaa9GG3223122E, "_ZN3aaa9GG3223122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223122C1Ev();
extern void _ZN3aaa9GG3223122D1Ev();
Name_Map name_map__ZN3aaa9GG3223122E[] = {
  NSPAIR(_ZN3aaa9GG3223122C1Ev),
  NSPAIR(_ZN3aaa9GG3223122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3223122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32231223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32231223barEv,_ZThn8_N3aaa9GG32231223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32231223barEv,_ZThn20_N3aaa9GG32231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32231223barEv,_ZThn8_N3aaa9GG32231223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231223barEv,_ZThn20_N3aaa9GG32231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223122E[];
Class_Descriptor cd__ZN3aaa9GG3223122E = {  "_ZN3aaa9GG3223122E", // class name
  bases__ZN3aaa9GG3223122E, 6,
  &(vtc__ZN3aaa9GG3223122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223123  : ::aaa::EE322 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32231233fooEv
  virtual void  bar(); // _ZN3aaa9GG32231233barEv
  ~GG3223123(); // tgen
  GG3223123(); // tgen
};
//SIG(1 _ZN3aaa9GG3223123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32231233fooEv");}
void  aaa::GG3223123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32231233barEv");}
aaa::GG3223123 ::~GG3223123(){ note_dtor("_ZN3aaa9GG3223123E", this);} // tgen
aaa::GG3223123 ::GG3223123(){ note_ctor("_ZN3aaa9GG3223123E", this);} // tgen
}
static void Test__ZN3aaa9GG3223123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223123E, buf);
    ::aaa::GG3223123 *dp, &lv = *(dp=new (buf) ::aaa::GG3223123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223123E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3223123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3223123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3223123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223123E);
    dp->::aaa::GG3223123::~GG3223123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223123E(Test__ZN3aaa9GG3223123E, "_ZN3aaa9GG3223123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223123C1Ev();
extern void _ZN3aaa9GG3223123D1Ev();
Name_Map name_map__ZN3aaa9GG3223123E[] = {
  NSPAIR(_ZN3aaa9GG3223123C1Ev),
  NSPAIR(_ZN3aaa9GG3223123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3223123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223123E[];
extern void _ZN3aaa9GG32231233fooEv();
extern void _ZN3aaa9GG32231233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32231233barEv,_ZThn8_N3aaa9GG32231233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231233fooEv,_ZThn20_N3aaa9GG32231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231233barEv,_ZThn20_N3aaa9GG32231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32231233fooEv,_ZThn28_N3aaa9GG32231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32231233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32231233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32231233barEv,_ZThn8_N3aaa9GG32231233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231233fooEv,_ZThn20_N3aaa9GG32231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231233barEv,_ZThn20_N3aaa9GG32231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32231233fooEv,_ZThn28_N3aaa9GG32231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223123E[];
Class_Descriptor cd__ZN3aaa9GG3223123E = {  "_ZN3aaa9GG3223123E", // class name
  bases__ZN3aaa9GG3223123E, 6,
  &(vtc__ZN3aaa9GG3223123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223131  : ::aaa::EE322 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32231313fooEv
  ~GG3223131(); // tgen
  GG3223131(); // tgen
};
//SIG(1 _ZN3aaa9GG3223131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32231313fooEv");}
aaa::GG3223131 ::~GG3223131(){ note_dtor("_ZN3aaa9GG3223131E", this);} // tgen
aaa::GG3223131 ::GG3223131(){ note_ctor("_ZN3aaa9GG3223131E", this);} // tgen
}
static void Test__ZN3aaa9GG3223131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223131E, buf);
    ::aaa::GG3223131 *dp, &lv = *(dp=new (buf) ::aaa::GG3223131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223131E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3223131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3223131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3223131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223131E);
    dp->::aaa::GG3223131::~GG3223131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223131E(Test__ZN3aaa9GG3223131E, "_ZN3aaa9GG3223131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223131C1Ev();
extern void _ZN3aaa9GG3223131D1Ev();
Name_Map name_map__ZN3aaa9GG3223131E[] = {
  NSPAIR(_ZN3aaa9GG3223131C1Ev),
  NSPAIR(_ZN3aaa9GG3223131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3223131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223131E[];
extern void _ZN3aaa9GG32231313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231313fooEv,_ZThn20_N3aaa9GG32231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32231313fooEv,_ZThn28_N3aaa9GG32231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32231313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231313fooEv,_ZThn20_N3aaa9GG32231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32231313fooEv,_ZThn28_N3aaa9GG32231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223131E[];
Class_Descriptor cd__ZN3aaa9GG3223131E = {  "_ZN3aaa9GG3223131E", // class name
  bases__ZN3aaa9GG3223131E, 6,
  &(vtc__ZN3aaa9GG3223131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223132  : ::aaa::EE322 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32231323barEv
  ~GG3223132(); // tgen
  GG3223132(); // tgen
};
//SIG(1 _ZN3aaa9GG3223132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32231323barEv");}
aaa::GG3223132 ::~GG3223132(){ note_dtor("_ZN3aaa9GG3223132E", this);} // tgen
aaa::GG3223132 ::GG3223132(){ note_ctor("_ZN3aaa9GG3223132E", this);} // tgen
}
static void Test__ZN3aaa9GG3223132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223132E, buf);
    ::aaa::GG3223132 *dp, &lv = *(dp=new (buf) ::aaa::GG3223132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223132E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3223132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3223132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3223132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223132E);
    dp->::aaa::GG3223132::~GG3223132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223132E(Test__ZN3aaa9GG3223132E, "_ZN3aaa9GG3223132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223132C1Ev();
extern void _ZN3aaa9GG3223132D1Ev();
Name_Map name_map__ZN3aaa9GG3223132E[] = {
  NSPAIR(_ZN3aaa9GG3223132C1Ev),
  NSPAIR(_ZN3aaa9GG3223132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3223132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32231323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32231323barEv,_ZThn8_N3aaa9GG32231323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32231323barEv,_ZThn20_N3aaa9GG32231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32231323barEv,_ZThn8_N3aaa9GG32231323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231323barEv,_ZThn20_N3aaa9GG32231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223132E[];
Class_Descriptor cd__ZN3aaa9GG3223132E = {  "_ZN3aaa9GG3223132E", // class name
  bases__ZN3aaa9GG3223132E, 6,
  &(vtc__ZN3aaa9GG3223132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223133  : ::aaa::EE322 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32231333fooEv
  virtual void  bar(); // _ZN3aaa9GG32231333barEv
  ~GG3223133(); // tgen
  GG3223133(); // tgen
};
//SIG(1 _ZN3aaa9GG3223133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32231333fooEv");}
void  aaa::GG3223133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32231333barEv");}
aaa::GG3223133 ::~GG3223133(){ note_dtor("_ZN3aaa9GG3223133E", this);} // tgen
aaa::GG3223133 ::GG3223133(){ note_ctor("_ZN3aaa9GG3223133E", this);} // tgen
}
static void Test__ZN3aaa9GG3223133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223133E, buf);
    ::aaa::GG3223133 *dp, &lv = *(dp=new (buf) ::aaa::GG3223133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223133E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3223133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3223133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3223133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223133E);
    dp->::aaa::GG3223133::~GG3223133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223133E(Test__ZN3aaa9GG3223133E, "_ZN3aaa9GG3223133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223133C1Ev();
extern void _ZN3aaa9GG3223133D1Ev();
Name_Map name_map__ZN3aaa9GG3223133E[] = {
  NSPAIR(_ZN3aaa9GG3223133C1Ev),
  NSPAIR(_ZN3aaa9GG3223133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3223133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223133E[];
extern void _ZN3aaa9GG32231333fooEv();
extern void _ZN3aaa9GG32231333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32231333barEv,_ZThn8_N3aaa9GG32231333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231333fooEv,_ZThn20_N3aaa9GG32231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32231333barEv,_ZThn20_N3aaa9GG32231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32231333fooEv,_ZThn28_N3aaa9GG32231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32231333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32231333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32231333barEv,_ZThn8_N3aaa9GG32231333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231333fooEv,_ZThn20_N3aaa9GG32231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32231333barEv,_ZThn20_N3aaa9GG32231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32231333fooEv,_ZThn28_N3aaa9GG32231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223133E[];
Class_Descriptor cd__ZN3aaa9GG3223133E = {  "_ZN3aaa9GG3223133E", // class name
  bases__ZN3aaa9GG3223133E, 6,
  &(vtc__ZN3aaa9GG3223133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223211  : ::aaa::EE322 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32232113fooEv
  ~GG3223211(); // tgen
  GG3223211(); // tgen
};
//SIG(1 _ZN3aaa9GG3223211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32232113fooEv");}
aaa::GG3223211 ::~GG3223211(){ note_dtor("_ZN3aaa9GG3223211E", this);} // tgen
aaa::GG3223211 ::GG3223211(){ note_ctor("_ZN3aaa9GG3223211E", this);} // tgen
}
static void Test__ZN3aaa9GG3223211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223211E, buf);
    ::aaa::GG3223211 *dp, &lv = *(dp=new (buf) ::aaa::GG3223211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223211E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3223211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3223211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3223211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223211E);
    dp->::aaa::GG3223211::~GG3223211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223211E(Test__ZN3aaa9GG3223211E, "_ZN3aaa9GG3223211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223211C1Ev();
extern void _ZN3aaa9GG3223211D1Ev();
Name_Map name_map__ZN3aaa9GG3223211E[] = {
  NSPAIR(_ZN3aaa9GG3223211C1Ev),
  NSPAIR(_ZN3aaa9GG3223211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3223211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223211E[];
extern void _ZN3aaa9GG32232113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232113fooEv,_ZThn20_N3aaa9GG32232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32232113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232113fooEv,_ZThn20_N3aaa9GG32232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223211E[];
Class_Descriptor cd__ZN3aaa9GG3223211E = {  "_ZN3aaa9GG3223211E", // class name
  bases__ZN3aaa9GG3223211E, 6,
  &(vtc__ZN3aaa9GG3223211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223212  : ::aaa::EE322 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32232123barEv
  ~GG3223212(); // tgen
  GG3223212(); // tgen
};
//SIG(1 _ZN3aaa9GG3223212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32232123barEv");}
aaa::GG3223212 ::~GG3223212(){ note_dtor("_ZN3aaa9GG3223212E", this);} // tgen
aaa::GG3223212 ::GG3223212(){ note_ctor("_ZN3aaa9GG3223212E", this);} // tgen
}
static void Test__ZN3aaa9GG3223212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223212E, buf);
    ::aaa::GG3223212 *dp, &lv = *(dp=new (buf) ::aaa::GG3223212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223212E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3223212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3223212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3223212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223212E);
    dp->::aaa::GG3223212::~GG3223212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223212E(Test__ZN3aaa9GG3223212E, "_ZN3aaa9GG3223212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223212C1Ev();
extern void _ZN3aaa9GG3223212D1Ev();
Name_Map name_map__ZN3aaa9GG3223212E[] = {
  NSPAIR(_ZN3aaa9GG3223212C1Ev),
  NSPAIR(_ZN3aaa9GG3223212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3223212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32232123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32232123barEv,_ZThn8_N3aaa9GG32232123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32232123barEv,_ZThn20_N3aaa9GG32232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32232123barEv,_ZThn28_N3aaa9GG32232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32232123barEv,_ZThn8_N3aaa9GG32232123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232123barEv,_ZThn20_N3aaa9GG32232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32232123barEv,_ZThn28_N3aaa9GG32232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223212E[];
Class_Descriptor cd__ZN3aaa9GG3223212E = {  "_ZN3aaa9GG3223212E", // class name
  bases__ZN3aaa9GG3223212E, 6,
  &(vtc__ZN3aaa9GG3223212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223213  : ::aaa::EE322 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32232133fooEv
  virtual void  bar(); // _ZN3aaa9GG32232133barEv
  ~GG3223213(); // tgen
  GG3223213(); // tgen
};
//SIG(1 _ZN3aaa9GG3223213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32232133fooEv");}
void  aaa::GG3223213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32232133barEv");}
aaa::GG3223213 ::~GG3223213(){ note_dtor("_ZN3aaa9GG3223213E", this);} // tgen
aaa::GG3223213 ::GG3223213(){ note_ctor("_ZN3aaa9GG3223213E", this);} // tgen
}
static void Test__ZN3aaa9GG3223213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223213E, buf);
    ::aaa::GG3223213 *dp, &lv = *(dp=new (buf) ::aaa::GG3223213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223213E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3223213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3223213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3223213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223213E);
    dp->::aaa::GG3223213::~GG3223213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223213E(Test__ZN3aaa9GG3223213E, "_ZN3aaa9GG3223213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223213C1Ev();
extern void _ZN3aaa9GG3223213D1Ev();
Name_Map name_map__ZN3aaa9GG3223213E[] = {
  NSPAIR(_ZN3aaa9GG3223213C1Ev),
  NSPAIR(_ZN3aaa9GG3223213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3223213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223213E[];
extern void _ZN3aaa9GG32232133fooEv();
extern void _ZN3aaa9GG32232133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32232133barEv,_ZThn8_N3aaa9GG32232133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232133fooEv,_ZThn20_N3aaa9GG32232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232133barEv,_ZThn20_N3aaa9GG32232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32232133barEv,_ZThn28_N3aaa9GG32232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32232133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32232133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32232133barEv,_ZThn8_N3aaa9GG32232133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232133fooEv,_ZThn20_N3aaa9GG32232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232133barEv,_ZThn20_N3aaa9GG32232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32232133barEv,_ZThn28_N3aaa9GG32232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223213E[];
Class_Descriptor cd__ZN3aaa9GG3223213E = {  "_ZN3aaa9GG3223213E", // class name
  bases__ZN3aaa9GG3223213E, 6,
  &(vtc__ZN3aaa9GG3223213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223221  : ::aaa::EE322 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32232213fooEv
  ~GG3223221(); // tgen
  GG3223221(); // tgen
};
//SIG(1 _ZN3aaa9GG3223221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32232213fooEv");}
aaa::GG3223221 ::~GG3223221(){ note_dtor("_ZN3aaa9GG3223221E", this);} // tgen
aaa::GG3223221 ::GG3223221(){ note_ctor("_ZN3aaa9GG3223221E", this);} // tgen
}
static void Test__ZN3aaa9GG3223221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223221E, buf);
    ::aaa::GG3223221 *dp, &lv = *(dp=new (buf) ::aaa::GG3223221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223221E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3223221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3223221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3223221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223221E);
    dp->::aaa::GG3223221::~GG3223221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223221E(Test__ZN3aaa9GG3223221E, "_ZN3aaa9GG3223221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223221C1Ev();
extern void _ZN3aaa9GG3223221D1Ev();
Name_Map name_map__ZN3aaa9GG3223221E[] = {
  NSPAIR(_ZN3aaa9GG3223221C1Ev),
  NSPAIR(_ZN3aaa9GG3223221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3223221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223221E[];
extern void _ZN3aaa9GG32232213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232213fooEv,_ZThn20_N3aaa9GG32232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32232213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232213fooEv,_ZThn20_N3aaa9GG32232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223221E[];
Class_Descriptor cd__ZN3aaa9GG3223221E = {  "_ZN3aaa9GG3223221E", // class name
  bases__ZN3aaa9GG3223221E, 6,
  &(vtc__ZN3aaa9GG3223221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223222  : ::aaa::EE322 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32232223barEv
  ~GG3223222(); // tgen
  GG3223222(); // tgen
};
//SIG(1 _ZN3aaa9GG3223222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32232223barEv");}
aaa::GG3223222 ::~GG3223222(){ note_dtor("_ZN3aaa9GG3223222E", this);} // tgen
aaa::GG3223222 ::GG3223222(){ note_ctor("_ZN3aaa9GG3223222E", this);} // tgen
}
static void Test__ZN3aaa9GG3223222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223222E, buf);
    ::aaa::GG3223222 *dp, &lv = *(dp=new (buf) ::aaa::GG3223222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223222E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3223222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3223222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3223222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223222E);
    dp->::aaa::GG3223222::~GG3223222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223222E(Test__ZN3aaa9GG3223222E, "_ZN3aaa9GG3223222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223222C1Ev();
extern void _ZN3aaa9GG3223222D1Ev();
Name_Map name_map__ZN3aaa9GG3223222E[] = {
  NSPAIR(_ZN3aaa9GG3223222C1Ev),
  NSPAIR(_ZN3aaa9GG3223222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3223222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32232223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32232223barEv,_ZThn8_N3aaa9GG32232223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32232223barEv,_ZThn20_N3aaa9GG32232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32232223barEv,_ZThn28_N3aaa9GG32232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32232223barEv,_ZThn8_N3aaa9GG32232223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232223barEv,_ZThn20_N3aaa9GG32232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32232223barEv,_ZThn28_N3aaa9GG32232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223222E[];
Class_Descriptor cd__ZN3aaa9GG3223222E = {  "_ZN3aaa9GG3223222E", // class name
  bases__ZN3aaa9GG3223222E, 6,
  &(vtc__ZN3aaa9GG3223222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223223  : ::aaa::EE322 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32232233fooEv
  virtual void  bar(); // _ZN3aaa9GG32232233barEv
  ~GG3223223(); // tgen
  GG3223223(); // tgen
};
//SIG(1 _ZN3aaa9GG3223223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32232233fooEv");}
void  aaa::GG3223223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32232233barEv");}
aaa::GG3223223 ::~GG3223223(){ note_dtor("_ZN3aaa9GG3223223E", this);} // tgen
aaa::GG3223223 ::GG3223223(){ note_ctor("_ZN3aaa9GG3223223E", this);} // tgen
}
static void Test__ZN3aaa9GG3223223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223223E, buf);
    ::aaa::GG3223223 *dp, &lv = *(dp=new (buf) ::aaa::GG3223223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223223E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3223223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3223223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3223223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223223E);
    dp->::aaa::GG3223223::~GG3223223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223223E(Test__ZN3aaa9GG3223223E, "_ZN3aaa9GG3223223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223223C1Ev();
extern void _ZN3aaa9GG3223223D1Ev();
Name_Map name_map__ZN3aaa9GG3223223E[] = {
  NSPAIR(_ZN3aaa9GG3223223C1Ev),
  NSPAIR(_ZN3aaa9GG3223223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3223223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223223E[];
extern void _ZN3aaa9GG32232233fooEv();
extern void _ZN3aaa9GG32232233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32232233barEv,_ZThn8_N3aaa9GG32232233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232233fooEv,_ZThn20_N3aaa9GG32232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232233barEv,_ZThn20_N3aaa9GG32232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32232233barEv,_ZThn28_N3aaa9GG32232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32232233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32232233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32232233barEv,_ZThn8_N3aaa9GG32232233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232233fooEv,_ZThn20_N3aaa9GG32232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232233barEv,_ZThn20_N3aaa9GG32232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32232233barEv,_ZThn28_N3aaa9GG32232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223223E[];
Class_Descriptor cd__ZN3aaa9GG3223223E = {  "_ZN3aaa9GG3223223E", // class name
  bases__ZN3aaa9GG3223223E, 6,
  &(vtc__ZN3aaa9GG3223223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223231  : ::aaa::EE322 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32232313fooEv
  ~GG3223231(); // tgen
  GG3223231(); // tgen
};
//SIG(1 _ZN3aaa9GG3223231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32232313fooEv");}
aaa::GG3223231 ::~GG3223231(){ note_dtor("_ZN3aaa9GG3223231E", this);} // tgen
aaa::GG3223231 ::GG3223231(){ note_ctor("_ZN3aaa9GG3223231E", this);} // tgen
}
static void Test__ZN3aaa9GG3223231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223231E, buf);
    ::aaa::GG3223231 *dp, &lv = *(dp=new (buf) ::aaa::GG3223231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223231E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3223231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3223231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3223231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223231E);
    dp->::aaa::GG3223231::~GG3223231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223231E(Test__ZN3aaa9GG3223231E, "_ZN3aaa9GG3223231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223231C1Ev();
extern void _ZN3aaa9GG3223231D1Ev();
Name_Map name_map__ZN3aaa9GG3223231E[] = {
  NSPAIR(_ZN3aaa9GG3223231C1Ev),
  NSPAIR(_ZN3aaa9GG3223231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3223231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223231E[];
extern void _ZN3aaa9GG32232313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232313fooEv,_ZThn20_N3aaa9GG32232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32232313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232313fooEv,_ZThn20_N3aaa9GG32232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223231E[];
Class_Descriptor cd__ZN3aaa9GG3223231E = {  "_ZN3aaa9GG3223231E", // class name
  bases__ZN3aaa9GG3223231E, 6,
  &(vtc__ZN3aaa9GG3223231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223232  : ::aaa::EE322 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32232323barEv
  ~GG3223232(); // tgen
  GG3223232(); // tgen
};
//SIG(1 _ZN3aaa9GG3223232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32232323barEv");}
aaa::GG3223232 ::~GG3223232(){ note_dtor("_ZN3aaa9GG3223232E", this);} // tgen
aaa::GG3223232 ::GG3223232(){ note_ctor("_ZN3aaa9GG3223232E", this);} // tgen
}
static void Test__ZN3aaa9GG3223232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223232E, buf);
    ::aaa::GG3223232 *dp, &lv = *(dp=new (buf) ::aaa::GG3223232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223232E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3223232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3223232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3223232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223232E);
    dp->::aaa::GG3223232::~GG3223232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223232E(Test__ZN3aaa9GG3223232E, "_ZN3aaa9GG3223232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223232C1Ev();
extern void _ZN3aaa9GG3223232D1Ev();
Name_Map name_map__ZN3aaa9GG3223232E[] = {
  NSPAIR(_ZN3aaa9GG3223232C1Ev),
  NSPAIR(_ZN3aaa9GG3223232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3223232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32232323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32232323barEv,_ZThn8_N3aaa9GG32232323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32232323barEv,_ZThn20_N3aaa9GG32232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32232323barEv,_ZThn28_N3aaa9GG32232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32232323barEv,_ZThn8_N3aaa9GG32232323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232323barEv,_ZThn20_N3aaa9GG32232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32232323barEv,_ZThn28_N3aaa9GG32232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223232E[];
Class_Descriptor cd__ZN3aaa9GG3223232E = {  "_ZN3aaa9GG3223232E", // class name
  bases__ZN3aaa9GG3223232E, 6,
  &(vtc__ZN3aaa9GG3223232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223233  : ::aaa::EE322 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32232333fooEv
  virtual void  bar(); // _ZN3aaa9GG32232333barEv
  ~GG3223233(); // tgen
  GG3223233(); // tgen
};
//SIG(1 _ZN3aaa9GG3223233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32232333fooEv");}
void  aaa::GG3223233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32232333barEv");}
aaa::GG3223233 ::~GG3223233(){ note_dtor("_ZN3aaa9GG3223233E", this);} // tgen
aaa::GG3223233 ::GG3223233(){ note_ctor("_ZN3aaa9GG3223233E", this);} // tgen
}
static void Test__ZN3aaa9GG3223233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223233E, buf);
    ::aaa::GG3223233 *dp, &lv = *(dp=new (buf) ::aaa::GG3223233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223233E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3223233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3223233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3223233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223233E);
    dp->::aaa::GG3223233::~GG3223233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223233E(Test__ZN3aaa9GG3223233E, "_ZN3aaa9GG3223233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223233C1Ev();
extern void _ZN3aaa9GG3223233D1Ev();
Name_Map name_map__ZN3aaa9GG3223233E[] = {
  NSPAIR(_ZN3aaa9GG3223233C1Ev),
  NSPAIR(_ZN3aaa9GG3223233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3223233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223233E[];
extern void _ZN3aaa9GG32232333fooEv();
extern void _ZN3aaa9GG32232333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32232333barEv,_ZThn8_N3aaa9GG32232333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232333fooEv,_ZThn20_N3aaa9GG32232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32232333barEv,_ZThn20_N3aaa9GG32232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32232333barEv,_ZThn28_N3aaa9GG32232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32232333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32232333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32232333barEv,_ZThn8_N3aaa9GG32232333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232333fooEv,_ZThn20_N3aaa9GG32232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32232333barEv,_ZThn20_N3aaa9GG32232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32232333barEv,_ZThn28_N3aaa9GG32232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223233E[];
Class_Descriptor cd__ZN3aaa9GG3223233E = {  "_ZN3aaa9GG3223233E", // class name
  bases__ZN3aaa9GG3223233E, 6,
  &(vtc__ZN3aaa9GG3223233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223311  : ::aaa::EE322 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32233113fooEv
  ~GG3223311(); // tgen
  GG3223311(); // tgen
};
//SIG(1 _ZN3aaa9GG3223311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32233113fooEv");}
aaa::GG3223311 ::~GG3223311(){ note_dtor("_ZN3aaa9GG3223311E", this);} // tgen
aaa::GG3223311 ::GG3223311(){ note_ctor("_ZN3aaa9GG3223311E", this);} // tgen
}
static void Test__ZN3aaa9GG3223311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223311E, buf);
    ::aaa::GG3223311 *dp, &lv = *(dp=new (buf) ::aaa::GG3223311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223311E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3223311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3223311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3223311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223311E);
    dp->::aaa::GG3223311::~GG3223311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223311E(Test__ZN3aaa9GG3223311E, "_ZN3aaa9GG3223311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223311C1Ev();
extern void _ZN3aaa9GG3223311D1Ev();
Name_Map name_map__ZN3aaa9GG3223311E[] = {
  NSPAIR(_ZN3aaa9GG3223311C1Ev),
  NSPAIR(_ZN3aaa9GG3223311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3223311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223311E[];
extern void _ZN3aaa9GG32233113fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233113fooEv,_ZThn20_N3aaa9GG32233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32233113fooEv,_ZThn28_N3aaa9GG32233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32233113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233113fooEv,_ZThn20_N3aaa9GG32233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233113fooEv,_ZThn28_N3aaa9GG32233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223311E[];
Class_Descriptor cd__ZN3aaa9GG3223311E = {  "_ZN3aaa9GG3223311E", // class name
  bases__ZN3aaa9GG3223311E, 6,
  &(vtc__ZN3aaa9GG3223311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223312  : ::aaa::EE322 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32233123barEv
  ~GG3223312(); // tgen
  GG3223312(); // tgen
};
//SIG(1 _ZN3aaa9GG3223312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32233123barEv");}
aaa::GG3223312 ::~GG3223312(){ note_dtor("_ZN3aaa9GG3223312E", this);} // tgen
aaa::GG3223312 ::GG3223312(){ note_ctor("_ZN3aaa9GG3223312E", this);} // tgen
}
static void Test__ZN3aaa9GG3223312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223312E, buf);
    ::aaa::GG3223312 *dp, &lv = *(dp=new (buf) ::aaa::GG3223312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223312E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3223312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3223312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3223312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223312E);
    dp->::aaa::GG3223312::~GG3223312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223312E(Test__ZN3aaa9GG3223312E, "_ZN3aaa9GG3223312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223312C1Ev();
extern void _ZN3aaa9GG3223312D1Ev();
Name_Map name_map__ZN3aaa9GG3223312E[] = {
  NSPAIR(_ZN3aaa9GG3223312C1Ev),
  NSPAIR(_ZN3aaa9GG3223312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3223312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32233123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32233123barEv,_ZThn8_N3aaa9GG32233123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32233123barEv,_ZThn20_N3aaa9GG32233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32233123barEv,_ZThn28_N3aaa9GG32233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32233123barEv,_ZThn8_N3aaa9GG32233123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233123barEv,_ZThn20_N3aaa9GG32233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233123barEv,_ZThn28_N3aaa9GG32233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223312E[];
Class_Descriptor cd__ZN3aaa9GG3223312E = {  "_ZN3aaa9GG3223312E", // class name
  bases__ZN3aaa9GG3223312E, 6,
  &(vtc__ZN3aaa9GG3223312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223313  : ::aaa::EE322 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32233133fooEv
  virtual void  bar(); // _ZN3aaa9GG32233133barEv
  ~GG3223313(); // tgen
  GG3223313(); // tgen
};
//SIG(1 _ZN3aaa9GG3223313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32233133fooEv");}
void  aaa::GG3223313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32233133barEv");}
aaa::GG3223313 ::~GG3223313(){ note_dtor("_ZN3aaa9GG3223313E", this);} // tgen
aaa::GG3223313 ::GG3223313(){ note_ctor("_ZN3aaa9GG3223313E", this);} // tgen
}
static void Test__ZN3aaa9GG3223313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223313E, buf);
    ::aaa::GG3223313 *dp, &lv = *(dp=new (buf) ::aaa::GG3223313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223313E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3223313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3223313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3223313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223313E);
    dp->::aaa::GG3223313::~GG3223313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223313E(Test__ZN3aaa9GG3223313E, "_ZN3aaa9GG3223313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223313C1Ev();
extern void _ZN3aaa9GG3223313D1Ev();
Name_Map name_map__ZN3aaa9GG3223313E[] = {
  NSPAIR(_ZN3aaa9GG3223313C1Ev),
  NSPAIR(_ZN3aaa9GG3223313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3223313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223313E[];
extern void _ZN3aaa9GG32233133fooEv();
extern void _ZN3aaa9GG32233133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32233133barEv,_ZThn8_N3aaa9GG32233133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233133fooEv,_ZThn20_N3aaa9GG32233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233133barEv,_ZThn20_N3aaa9GG32233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32233133fooEv,_ZThn28_N3aaa9GG32233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32233133barEv,_ZThn28_N3aaa9GG32233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32233133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32233133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32233133barEv,_ZThn8_N3aaa9GG32233133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233133fooEv,_ZThn20_N3aaa9GG32233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233133barEv,_ZThn20_N3aaa9GG32233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233133fooEv,_ZThn28_N3aaa9GG32233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233133barEv,_ZThn28_N3aaa9GG32233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223313E[];
Class_Descriptor cd__ZN3aaa9GG3223313E = {  "_ZN3aaa9GG3223313E", // class name
  bases__ZN3aaa9GG3223313E, 6,
  &(vtc__ZN3aaa9GG3223313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223321  : ::aaa::EE322 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32233213fooEv
  ~GG3223321(); // tgen
  GG3223321(); // tgen
};
//SIG(1 _ZN3aaa9GG3223321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32233213fooEv");}
aaa::GG3223321 ::~GG3223321(){ note_dtor("_ZN3aaa9GG3223321E", this);} // tgen
aaa::GG3223321 ::GG3223321(){ note_ctor("_ZN3aaa9GG3223321E", this);} // tgen
}
static void Test__ZN3aaa9GG3223321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223321E, buf);
    ::aaa::GG3223321 *dp, &lv = *(dp=new (buf) ::aaa::GG3223321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223321E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3223321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3223321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3223321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223321E);
    dp->::aaa::GG3223321::~GG3223321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223321E(Test__ZN3aaa9GG3223321E, "_ZN3aaa9GG3223321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223321C1Ev();
extern void _ZN3aaa9GG3223321D1Ev();
Name_Map name_map__ZN3aaa9GG3223321E[] = {
  NSPAIR(_ZN3aaa9GG3223321C1Ev),
  NSPAIR(_ZN3aaa9GG3223321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3223321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223321E[];
extern void _ZN3aaa9GG32233213fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233213fooEv,_ZThn20_N3aaa9GG32233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32233213fooEv,_ZThn28_N3aaa9GG32233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32233213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233213fooEv,_ZThn20_N3aaa9GG32233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233213fooEv,_ZThn28_N3aaa9GG32233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223321E[];
Class_Descriptor cd__ZN3aaa9GG3223321E = {  "_ZN3aaa9GG3223321E", // class name
  bases__ZN3aaa9GG3223321E, 6,
  &(vtc__ZN3aaa9GG3223321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223322  : ::aaa::EE322 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32233223barEv
  ~GG3223322(); // tgen
  GG3223322(); // tgen
};
//SIG(1 _ZN3aaa9GG3223322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32233223barEv");}
aaa::GG3223322 ::~GG3223322(){ note_dtor("_ZN3aaa9GG3223322E", this);} // tgen
aaa::GG3223322 ::GG3223322(){ note_ctor("_ZN3aaa9GG3223322E", this);} // tgen
}
static void Test__ZN3aaa9GG3223322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223322E, buf);
    ::aaa::GG3223322 *dp, &lv = *(dp=new (buf) ::aaa::GG3223322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223322E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3223322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3223322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3223322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223322E);
    dp->::aaa::GG3223322::~GG3223322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223322E(Test__ZN3aaa9GG3223322E, "_ZN3aaa9GG3223322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223322C1Ev();
extern void _ZN3aaa9GG3223322D1Ev();
Name_Map name_map__ZN3aaa9GG3223322E[] = {
  NSPAIR(_ZN3aaa9GG3223322C1Ev),
  NSPAIR(_ZN3aaa9GG3223322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3223322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32233223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32233223barEv,_ZThn8_N3aaa9GG32233223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32233223barEv,_ZThn20_N3aaa9GG32233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32233223barEv,_ZThn28_N3aaa9GG32233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32233223barEv,_ZThn8_N3aaa9GG32233223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233223barEv,_ZThn20_N3aaa9GG32233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233223barEv,_ZThn28_N3aaa9GG32233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223322E[];
Class_Descriptor cd__ZN3aaa9GG3223322E = {  "_ZN3aaa9GG3223322E", // class name
  bases__ZN3aaa9GG3223322E, 6,
  &(vtc__ZN3aaa9GG3223322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223323  : ::aaa::EE322 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32233233fooEv
  virtual void  bar(); // _ZN3aaa9GG32233233barEv
  ~GG3223323(); // tgen
  GG3223323(); // tgen
};
//SIG(1 _ZN3aaa9GG3223323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32233233fooEv");}
void  aaa::GG3223323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32233233barEv");}
aaa::GG3223323 ::~GG3223323(){ note_dtor("_ZN3aaa9GG3223323E", this);} // tgen
aaa::GG3223323 ::GG3223323(){ note_ctor("_ZN3aaa9GG3223323E", this);} // tgen
}
static void Test__ZN3aaa9GG3223323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223323E, buf);
    ::aaa::GG3223323 *dp, &lv = *(dp=new (buf) ::aaa::GG3223323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223323E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3223323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3223323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3223323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223323E);
    dp->::aaa::GG3223323::~GG3223323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223323E(Test__ZN3aaa9GG3223323E, "_ZN3aaa9GG3223323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223323C1Ev();
extern void _ZN3aaa9GG3223323D1Ev();
Name_Map name_map__ZN3aaa9GG3223323E[] = {
  NSPAIR(_ZN3aaa9GG3223323C1Ev),
  NSPAIR(_ZN3aaa9GG3223323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3223323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223323E[];
extern void _ZN3aaa9GG32233233fooEv();
extern void _ZN3aaa9GG32233233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32233233barEv,_ZThn8_N3aaa9GG32233233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233233fooEv,_ZThn20_N3aaa9GG32233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233233barEv,_ZThn20_N3aaa9GG32233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32233233fooEv,_ZThn28_N3aaa9GG32233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32233233barEv,_ZThn28_N3aaa9GG32233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32233233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32233233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32233233barEv,_ZThn8_N3aaa9GG32233233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233233fooEv,_ZThn20_N3aaa9GG32233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233233barEv,_ZThn20_N3aaa9GG32233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233233fooEv,_ZThn28_N3aaa9GG32233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233233barEv,_ZThn28_N3aaa9GG32233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223323E[];
Class_Descriptor cd__ZN3aaa9GG3223323E = {  "_ZN3aaa9GG3223323E", // class name
  bases__ZN3aaa9GG3223323E, 6,
  &(vtc__ZN3aaa9GG3223323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223331  : ::aaa::EE322 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32233313fooEv
  ~GG3223331(); // tgen
  GG3223331(); // tgen
};
//SIG(1 _ZN3aaa9GG3223331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32233313fooEv");}
aaa::GG3223331 ::~GG3223331(){ note_dtor("_ZN3aaa9GG3223331E", this);} // tgen
aaa::GG3223331 ::GG3223331(){ note_ctor("_ZN3aaa9GG3223331E", this);} // tgen
}
static void Test__ZN3aaa9GG3223331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223331E, buf);
    ::aaa::GG3223331 *dp, &lv = *(dp=new (buf) ::aaa::GG3223331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223331E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3223331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3223331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3223331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223331E);
    dp->::aaa::GG3223331::~GG3223331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223331E(Test__ZN3aaa9GG3223331E, "_ZN3aaa9GG3223331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223331C1Ev();
extern void _ZN3aaa9GG3223331D1Ev();
Name_Map name_map__ZN3aaa9GG3223331E[] = {
  NSPAIR(_ZN3aaa9GG3223331C1Ev),
  NSPAIR(_ZN3aaa9GG3223331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3223331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223331E[];
extern void _ZN3aaa9GG32233313fooEv();
extern void _ZN3aaa5EE3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233313fooEv,_ZThn20_N3aaa9GG32233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32233313fooEv,_ZThn28_N3aaa9GG32233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32233313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3223barEv,_ZThn8_N3aaa5EE3223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233313fooEv,_ZThn20_N3aaa9GG32233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233313fooEv,_ZThn28_N3aaa9GG32233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223331E[];
Class_Descriptor cd__ZN3aaa9GG3223331E = {  "_ZN3aaa9GG3223331E", // class name
  bases__ZN3aaa9GG3223331E, 6,
  &(vtc__ZN3aaa9GG3223331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223332  : ::aaa::EE322 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32233323barEv
  ~GG3223332(); // tgen
  GG3223332(); // tgen
};
//SIG(1 _ZN3aaa9GG3223332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3223332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32233323barEv");}
aaa::GG3223332 ::~GG3223332(){ note_dtor("_ZN3aaa9GG3223332E", this);} // tgen
aaa::GG3223332 ::GG3223332(){ note_ctor("_ZN3aaa9GG3223332E", this);} // tgen
}
static void Test__ZN3aaa9GG3223332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223332E, buf);
    ::aaa::GG3223332 *dp, &lv = *(dp=new (buf) ::aaa::GG3223332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223332E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3223332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3223332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3223332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223332E);
    dp->::aaa::GG3223332::~GG3223332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223332E(Test__ZN3aaa9GG3223332E, "_ZN3aaa9GG3223332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223332C1Ev();
extern void _ZN3aaa9GG3223332D1Ev();
Name_Map name_map__ZN3aaa9GG3223332E[] = {
  NSPAIR(_ZN3aaa9GG3223332C1Ev),
  NSPAIR(_ZN3aaa9GG3223332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3223332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG32233323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32233323barEv,_ZThn8_N3aaa9GG32233323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32233323barEv,_ZThn20_N3aaa9GG32233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32233323barEv,_ZThn28_N3aaa9GG32233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32233323barEv,_ZThn8_N3aaa9GG32233323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233323barEv,_ZThn20_N3aaa9GG32233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233323barEv,_ZThn28_N3aaa9GG32233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223332E[];
Class_Descriptor cd__ZN3aaa9GG3223332E = {  "_ZN3aaa9GG3223332E", // class name
  bases__ZN3aaa9GG3223332E, 6,
  &(vtc__ZN3aaa9GG3223332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3223333  : ::aaa::EE322 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32233333fooEv
  virtual void  bar(); // _ZN3aaa9GG32233333barEv
  ~GG3223333(); // tgen
  GG3223333(); // tgen
};
//SIG(1 _ZN3aaa9GG3223333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3223333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32233333fooEv");}
void  aaa::GG3223333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32233333barEv");}
aaa::GG3223333 ::~GG3223333(){ note_dtor("_ZN3aaa9GG3223333E", this);} // tgen
aaa::GG3223333 ::GG3223333(){ note_ctor("_ZN3aaa9GG3223333E", this);} // tgen
}
static void Test__ZN3aaa9GG3223333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3223333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3223333E, buf);
    ::aaa::GG3223333 *dp, &lv = *(dp=new (buf) ::aaa::GG3223333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3223333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3223333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE322*), 0, "_ZN3aaa9GG3223333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE322*), ABISELECT(16,8), "_ZN3aaa9GG3223333E");
    check_base_class_offset(lv, (::aaa::EE322*), 0, "_ZN3aaa9GG3223333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3223333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3223333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3223333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3223333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3223333E);
    dp->::aaa::GG3223333::~GG3223333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3223333E(Test__ZN3aaa9GG3223333E, "_ZN3aaa9GG3223333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3223333C1Ev();
extern void _ZN3aaa9GG3223333D1Ev();
Name_Map name_map__ZN3aaa9GG3223333E[] = {
  NSPAIR(_ZN3aaa9GG3223333C1Ev),
  NSPAIR(_ZN3aaa9GG3223333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE322E;
extern VTBL_ENTRY _ZTIN3aaa5EE322E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE322E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3223333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE322E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3223333E[];
extern void _ZN3aaa9GG32233333fooEv();
extern void _ZN3aaa9GG32233333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32233333barEv,_ZThn8_N3aaa9GG32233333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233333fooEv,_ZThn20_N3aaa9GG32233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32233333barEv,_ZThn20_N3aaa9GG32233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32233333fooEv,_ZThn28_N3aaa9GG32233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32233333barEv,_ZThn28_N3aaa9GG32233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3223333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32233333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32233333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32233333barEv,_ZThn8_N3aaa9GG32233333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233333fooEv,_ZThn20_N3aaa9GG32233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32233333barEv,_ZThn20_N3aaa9GG32233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3223333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233333fooEv,_ZThn28_N3aaa9GG32233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32233333barEv,_ZThn28_N3aaa9GG32233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3223333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3223333E[];
Class_Descriptor cd__ZN3aaa9GG3223333E = {  "_ZN3aaa9GG3223333E", // class name
  bases__ZN3aaa9GG3223333E, 6,
  &(vtc__ZN3aaa9GG3223333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3223333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3223333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231111  : ::aaa::EE323 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32311113fooEv
  ~GG3231111(); // tgen
  GG3231111(); // tgen
};
//SIG(1 _ZN3aaa9GG3231111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32311113fooEv");}
aaa::GG3231111 ::~GG3231111(){ note_dtor("_ZN3aaa9GG3231111E", this);} // tgen
aaa::GG3231111 ::GG3231111(){ note_ctor("_ZN3aaa9GG3231111E", this);} // tgen
}
static void Test__ZN3aaa9GG3231111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231111E, buf);
    ::aaa::GG3231111 *dp, &lv = *(dp=new (buf) ::aaa::GG3231111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231111E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3231111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3231111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3231111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231111E);
    dp->::aaa::GG3231111::~GG3231111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231111E(Test__ZN3aaa9GG3231111E, "_ZN3aaa9GG3231111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231111C1Ev();
extern void _ZN3aaa9GG3231111D1Ev();
Name_Map name_map__ZN3aaa9GG3231111E[] = {
  NSPAIR(_ZN3aaa9GG3231111C1Ev),
  NSPAIR(_ZN3aaa9GG3231111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3231111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231111E[];
extern void _ZN3aaa9GG32311113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32311113fooEv,_ZThn20_N3aaa9GG32311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32311113fooEv,_ZThn28_N3aaa9GG32311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32311113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311113fooEv,_ZThn20_N3aaa9GG32311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32311113fooEv,_ZThn28_N3aaa9GG32311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231111E[];
Class_Descriptor cd__ZN3aaa9GG3231111E = {  "_ZN3aaa9GG3231111E", // class name
  bases__ZN3aaa9GG3231111E, 6,
  &(vtc__ZN3aaa9GG3231111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231111E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231112  : ::aaa::EE323 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32311123barEv
  ~GG3231112(); // tgen
  GG3231112(); // tgen
};
//SIG(1 _ZN3aaa9GG3231112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32311123barEv");}
aaa::GG3231112 ::~GG3231112(){ note_dtor("_ZN3aaa9GG3231112E", this);} // tgen
aaa::GG3231112 ::GG3231112(){ note_ctor("_ZN3aaa9GG3231112E", this);} // tgen
}
static void Test__ZN3aaa9GG3231112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231112E, buf);
    ::aaa::GG3231112 *dp, &lv = *(dp=new (buf) ::aaa::GG3231112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231112E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3231112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3231112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3231112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231112E);
    dp->::aaa::GG3231112::~GG3231112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231112E(Test__ZN3aaa9GG3231112E, "_ZN3aaa9GG3231112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231112C1Ev();
extern void _ZN3aaa9GG3231112D1Ev();
Name_Map name_map__ZN3aaa9GG3231112E[] = {
  NSPAIR(_ZN3aaa9GG3231112C1Ev),
  NSPAIR(_ZN3aaa9GG3231112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3231112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231112E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32311123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32311123barEv,_ZThn8_N3aaa9GG32311123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32311123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32311123barEv,_ZThn8_N3aaa9GG32311123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231112E[];
Class_Descriptor cd__ZN3aaa9GG3231112E = {  "_ZN3aaa9GG3231112E", // class name
  bases__ZN3aaa9GG3231112E, 6,
  &(vtc__ZN3aaa9GG3231112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231112E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231113  : ::aaa::EE323 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32311133fooEv
  virtual void  bar(); // _ZN3aaa9GG32311133barEv
  ~GG3231113(); // tgen
  GG3231113(); // tgen
};
//SIG(1 _ZN3aaa9GG3231113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32311133fooEv");}
void  aaa::GG3231113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32311133barEv");}
aaa::GG3231113 ::~GG3231113(){ note_dtor("_ZN3aaa9GG3231113E", this);} // tgen
aaa::GG3231113 ::GG3231113(){ note_ctor("_ZN3aaa9GG3231113E", this);} // tgen
}
static void Test__ZN3aaa9GG3231113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231113E, buf);
    ::aaa::GG3231113 *dp, &lv = *(dp=new (buf) ::aaa::GG3231113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231113E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3231113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3231113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3231113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231113E);
    dp->::aaa::GG3231113::~GG3231113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231113E(Test__ZN3aaa9GG3231113E, "_ZN3aaa9GG3231113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231113C1Ev();
extern void _ZN3aaa9GG3231113D1Ev();
Name_Map name_map__ZN3aaa9GG3231113E[] = {
  NSPAIR(_ZN3aaa9GG3231113C1Ev),
  NSPAIR(_ZN3aaa9GG3231113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3231113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231113E[];
extern void _ZN3aaa9GG32311133fooEv();
extern void _ZN3aaa9GG32311133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32311133barEv,_ZThn8_N3aaa9GG32311133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32311133fooEv,_ZThn20_N3aaa9GG32311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32311133fooEv,_ZThn28_N3aaa9GG32311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32311133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32311133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32311133barEv,_ZThn8_N3aaa9GG32311133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311133fooEv,_ZThn20_N3aaa9GG32311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32311133fooEv,_ZThn28_N3aaa9GG32311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231113E[];
Class_Descriptor cd__ZN3aaa9GG3231113E = {  "_ZN3aaa9GG3231113E", // class name
  bases__ZN3aaa9GG3231113E, 6,
  &(vtc__ZN3aaa9GG3231113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231113E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231121  : ::aaa::EE323 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32311213fooEv
  ~GG3231121(); // tgen
  GG3231121(); // tgen
};
//SIG(1 _ZN3aaa9GG3231121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32311213fooEv");}
aaa::GG3231121 ::~GG3231121(){ note_dtor("_ZN3aaa9GG3231121E", this);} // tgen
aaa::GG3231121 ::GG3231121(){ note_ctor("_ZN3aaa9GG3231121E", this);} // tgen
}
static void Test__ZN3aaa9GG3231121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231121E, buf);
    ::aaa::GG3231121 *dp, &lv = *(dp=new (buf) ::aaa::GG3231121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231121E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3231121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3231121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3231121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231121E);
    dp->::aaa::GG3231121::~GG3231121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231121E(Test__ZN3aaa9GG3231121E, "_ZN3aaa9GG3231121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231121C1Ev();
extern void _ZN3aaa9GG3231121D1Ev();
Name_Map name_map__ZN3aaa9GG3231121E[] = {
  NSPAIR(_ZN3aaa9GG3231121C1Ev),
  NSPAIR(_ZN3aaa9GG3231121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3231121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231121E[];
extern void _ZN3aaa9GG32311213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32311213fooEv,_ZThn20_N3aaa9GG32311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32311213fooEv,_ZThn28_N3aaa9GG32311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32311213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311213fooEv,_ZThn20_N3aaa9GG32311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32311213fooEv,_ZThn28_N3aaa9GG32311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231121E[];
Class_Descriptor cd__ZN3aaa9GG3231121E = {  "_ZN3aaa9GG3231121E", // class name
  bases__ZN3aaa9GG3231121E, 6,
  &(vtc__ZN3aaa9GG3231121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231122  : ::aaa::EE323 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32311223barEv
  ~GG3231122(); // tgen
  GG3231122(); // tgen
};
//SIG(1 _ZN3aaa9GG3231122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32311223barEv");}
aaa::GG3231122 ::~GG3231122(){ note_dtor("_ZN3aaa9GG3231122E", this);} // tgen
aaa::GG3231122 ::GG3231122(){ note_ctor("_ZN3aaa9GG3231122E", this);} // tgen
}
static void Test__ZN3aaa9GG3231122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231122E, buf);
    ::aaa::GG3231122 *dp, &lv = *(dp=new (buf) ::aaa::GG3231122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231122E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3231122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3231122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3231122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231122E);
    dp->::aaa::GG3231122::~GG3231122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231122E(Test__ZN3aaa9GG3231122E, "_ZN3aaa9GG3231122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231122C1Ev();
extern void _ZN3aaa9GG3231122D1Ev();
Name_Map name_map__ZN3aaa9GG3231122E[] = {
  NSPAIR(_ZN3aaa9GG3231122C1Ev),
  NSPAIR(_ZN3aaa9GG3231122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3231122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231122E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32311223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32311223barEv,_ZThn8_N3aaa9GG32311223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32311223barEv,_ZThn20_N3aaa9GG32311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32311223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32311223barEv,_ZThn8_N3aaa9GG32311223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311223barEv,_ZThn20_N3aaa9GG32311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231122E[];
Class_Descriptor cd__ZN3aaa9GG3231122E = {  "_ZN3aaa9GG3231122E", // class name
  bases__ZN3aaa9GG3231122E, 6,
  &(vtc__ZN3aaa9GG3231122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231123  : ::aaa::EE323 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32311233fooEv
  virtual void  bar(); // _ZN3aaa9GG32311233barEv
  ~GG3231123(); // tgen
  GG3231123(); // tgen
};
//SIG(1 _ZN3aaa9GG3231123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32311233fooEv");}
void  aaa::GG3231123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32311233barEv");}
aaa::GG3231123 ::~GG3231123(){ note_dtor("_ZN3aaa9GG3231123E", this);} // tgen
aaa::GG3231123 ::GG3231123(){ note_ctor("_ZN3aaa9GG3231123E", this);} // tgen
}
static void Test__ZN3aaa9GG3231123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231123E, buf);
    ::aaa::GG3231123 *dp, &lv = *(dp=new (buf) ::aaa::GG3231123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231123E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3231123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3231123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3231123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231123E);
    dp->::aaa::GG3231123::~GG3231123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231123E(Test__ZN3aaa9GG3231123E, "_ZN3aaa9GG3231123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231123C1Ev();
extern void _ZN3aaa9GG3231123D1Ev();
Name_Map name_map__ZN3aaa9GG3231123E[] = {
  NSPAIR(_ZN3aaa9GG3231123C1Ev),
  NSPAIR(_ZN3aaa9GG3231123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3231123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231123E[];
extern void _ZN3aaa9GG32311233fooEv();
extern void _ZN3aaa9GG32311233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32311233barEv,_ZThn8_N3aaa9GG32311233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32311233fooEv,_ZThn20_N3aaa9GG32311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32311233barEv,_ZThn20_N3aaa9GG32311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32311233fooEv,_ZThn28_N3aaa9GG32311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32311233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32311233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32311233barEv,_ZThn8_N3aaa9GG32311233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311233fooEv,_ZThn20_N3aaa9GG32311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311233barEv,_ZThn20_N3aaa9GG32311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32311233fooEv,_ZThn28_N3aaa9GG32311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231123E[];
Class_Descriptor cd__ZN3aaa9GG3231123E = {  "_ZN3aaa9GG3231123E", // class name
  bases__ZN3aaa9GG3231123E, 6,
  &(vtc__ZN3aaa9GG3231123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231131  : ::aaa::EE323 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32311313fooEv
  ~GG3231131(); // tgen
  GG3231131(); // tgen
};
//SIG(1 _ZN3aaa9GG3231131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32311313fooEv");}
aaa::GG3231131 ::~GG3231131(){ note_dtor("_ZN3aaa9GG3231131E", this);} // tgen
aaa::GG3231131 ::GG3231131(){ note_ctor("_ZN3aaa9GG3231131E", this);} // tgen
}
static void Test__ZN3aaa9GG3231131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231131E, buf);
    ::aaa::GG3231131 *dp, &lv = *(dp=new (buf) ::aaa::GG3231131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231131E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3231131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3231131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3231131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231131E);
    dp->::aaa::GG3231131::~GG3231131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231131E(Test__ZN3aaa9GG3231131E, "_ZN3aaa9GG3231131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231131C1Ev();
extern void _ZN3aaa9GG3231131D1Ev();
Name_Map name_map__ZN3aaa9GG3231131E[] = {
  NSPAIR(_ZN3aaa9GG3231131C1Ev),
  NSPAIR(_ZN3aaa9GG3231131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3231131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231131E[];
extern void _ZN3aaa9GG32311313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32311313fooEv,_ZThn20_N3aaa9GG32311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32311313fooEv,_ZThn28_N3aaa9GG32311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32311313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311313fooEv,_ZThn20_N3aaa9GG32311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32311313fooEv,_ZThn28_N3aaa9GG32311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231131E[];
Class_Descriptor cd__ZN3aaa9GG3231131E = {  "_ZN3aaa9GG3231131E", // class name
  bases__ZN3aaa9GG3231131E, 6,
  &(vtc__ZN3aaa9GG3231131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231132  : ::aaa::EE323 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32311323barEv
  ~GG3231132(); // tgen
  GG3231132(); // tgen
};
//SIG(1 _ZN3aaa9GG3231132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32311323barEv");}
aaa::GG3231132 ::~GG3231132(){ note_dtor("_ZN3aaa9GG3231132E", this);} // tgen
aaa::GG3231132 ::GG3231132(){ note_ctor("_ZN3aaa9GG3231132E", this);} // tgen
}
static void Test__ZN3aaa9GG3231132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231132E, buf);
    ::aaa::GG3231132 *dp, &lv = *(dp=new (buf) ::aaa::GG3231132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231132E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3231132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3231132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3231132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231132E);
    dp->::aaa::GG3231132::~GG3231132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231132E(Test__ZN3aaa9GG3231132E, "_ZN3aaa9GG3231132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231132C1Ev();
extern void _ZN3aaa9GG3231132D1Ev();
Name_Map name_map__ZN3aaa9GG3231132E[] = {
  NSPAIR(_ZN3aaa9GG3231132C1Ev),
  NSPAIR(_ZN3aaa9GG3231132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3231132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231132E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32311323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32311323barEv,_ZThn8_N3aaa9GG32311323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32311323barEv,_ZThn20_N3aaa9GG32311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32311323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32311323barEv,_ZThn8_N3aaa9GG32311323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311323barEv,_ZThn20_N3aaa9GG32311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231132E[];
Class_Descriptor cd__ZN3aaa9GG3231132E = {  "_ZN3aaa9GG3231132E", // class name
  bases__ZN3aaa9GG3231132E, 6,
  &(vtc__ZN3aaa9GG3231132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231133  : ::aaa::EE323 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32311333fooEv
  virtual void  bar(); // _ZN3aaa9GG32311333barEv
  ~GG3231133(); // tgen
  GG3231133(); // tgen
};
//SIG(1 _ZN3aaa9GG3231133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32311333fooEv");}
void  aaa::GG3231133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32311333barEv");}
aaa::GG3231133 ::~GG3231133(){ note_dtor("_ZN3aaa9GG3231133E", this);} // tgen
aaa::GG3231133 ::GG3231133(){ note_ctor("_ZN3aaa9GG3231133E", this);} // tgen
}
static void Test__ZN3aaa9GG3231133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231133E, buf);
    ::aaa::GG3231133 *dp, &lv = *(dp=new (buf) ::aaa::GG3231133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231133E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3231133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3231133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3231133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231133E);
    dp->::aaa::GG3231133::~GG3231133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231133E(Test__ZN3aaa9GG3231133E, "_ZN3aaa9GG3231133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231133C1Ev();
extern void _ZN3aaa9GG3231133D1Ev();
Name_Map name_map__ZN3aaa9GG3231133E[] = {
  NSPAIR(_ZN3aaa9GG3231133C1Ev),
  NSPAIR(_ZN3aaa9GG3231133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3231133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231133E[];
extern void _ZN3aaa9GG32311333fooEv();
extern void _ZN3aaa9GG32311333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32311333barEv,_ZThn8_N3aaa9GG32311333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32311333fooEv,_ZThn20_N3aaa9GG32311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32311333barEv,_ZThn20_N3aaa9GG32311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32311333fooEv,_ZThn28_N3aaa9GG32311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32311333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32311333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32311333barEv,_ZThn8_N3aaa9GG32311333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311333fooEv,_ZThn20_N3aaa9GG32311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32311333barEv,_ZThn20_N3aaa9GG32311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32311333fooEv,_ZThn28_N3aaa9GG32311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231133E[];
Class_Descriptor cd__ZN3aaa9GG3231133E = {  "_ZN3aaa9GG3231133E", // class name
  bases__ZN3aaa9GG3231133E, 6,
  &(vtc__ZN3aaa9GG3231133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231211  : ::aaa::EE323 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32312113fooEv
  ~GG3231211(); // tgen
  GG3231211(); // tgen
};
//SIG(1 _ZN3aaa9GG3231211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32312113fooEv");}
aaa::GG3231211 ::~GG3231211(){ note_dtor("_ZN3aaa9GG3231211E", this);} // tgen
aaa::GG3231211 ::GG3231211(){ note_ctor("_ZN3aaa9GG3231211E", this);} // tgen
}
static void Test__ZN3aaa9GG3231211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231211E, buf);
    ::aaa::GG3231211 *dp, &lv = *(dp=new (buf) ::aaa::GG3231211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231211E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3231211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3231211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3231211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231211E);
    dp->::aaa::GG3231211::~GG3231211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231211E(Test__ZN3aaa9GG3231211E, "_ZN3aaa9GG3231211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231211C1Ev();
extern void _ZN3aaa9GG3231211D1Ev();
Name_Map name_map__ZN3aaa9GG3231211E[] = {
  NSPAIR(_ZN3aaa9GG3231211C1Ev),
  NSPAIR(_ZN3aaa9GG3231211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3231211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231211E[];
extern void _ZN3aaa9GG32312113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32312113fooEv,_ZThn20_N3aaa9GG32312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32312113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312113fooEv,_ZThn20_N3aaa9GG32312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231211E[];
Class_Descriptor cd__ZN3aaa9GG3231211E = {  "_ZN3aaa9GG3231211E", // class name
  bases__ZN3aaa9GG3231211E, 6,
  &(vtc__ZN3aaa9GG3231211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231211E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231212  : ::aaa::EE323 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32312123barEv
  ~GG3231212(); // tgen
  GG3231212(); // tgen
};
//SIG(1 _ZN3aaa9GG3231212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32312123barEv");}
aaa::GG3231212 ::~GG3231212(){ note_dtor("_ZN3aaa9GG3231212E", this);} // tgen
aaa::GG3231212 ::GG3231212(){ note_ctor("_ZN3aaa9GG3231212E", this);} // tgen
}
static void Test__ZN3aaa9GG3231212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231212E, buf);
    ::aaa::GG3231212 *dp, &lv = *(dp=new (buf) ::aaa::GG3231212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231212E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3231212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3231212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3231212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231212E);
    dp->::aaa::GG3231212::~GG3231212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231212E(Test__ZN3aaa9GG3231212E, "_ZN3aaa9GG3231212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231212C1Ev();
extern void _ZN3aaa9GG3231212D1Ev();
Name_Map name_map__ZN3aaa9GG3231212E[] = {
  NSPAIR(_ZN3aaa9GG3231212C1Ev),
  NSPAIR(_ZN3aaa9GG3231212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3231212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231212E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32312123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32312123barEv,_ZThn8_N3aaa9GG32312123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32312123barEv,_ZThn28_N3aaa9GG32312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32312123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32312123barEv,_ZThn8_N3aaa9GG32312123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32312123barEv,_ZThn28_N3aaa9GG32312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231212E[];
Class_Descriptor cd__ZN3aaa9GG3231212E = {  "_ZN3aaa9GG3231212E", // class name
  bases__ZN3aaa9GG3231212E, 6,
  &(vtc__ZN3aaa9GG3231212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231212E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231213  : ::aaa::EE323 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32312133fooEv
  virtual void  bar(); // _ZN3aaa9GG32312133barEv
  ~GG3231213(); // tgen
  GG3231213(); // tgen
};
//SIG(1 _ZN3aaa9GG3231213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32312133fooEv");}
void  aaa::GG3231213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32312133barEv");}
aaa::GG3231213 ::~GG3231213(){ note_dtor("_ZN3aaa9GG3231213E", this);} // tgen
aaa::GG3231213 ::GG3231213(){ note_ctor("_ZN3aaa9GG3231213E", this);} // tgen
}
static void Test__ZN3aaa9GG3231213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231213E, buf);
    ::aaa::GG3231213 *dp, &lv = *(dp=new (buf) ::aaa::GG3231213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231213E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3231213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3231213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3231213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231213E);
    dp->::aaa::GG3231213::~GG3231213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231213E(Test__ZN3aaa9GG3231213E, "_ZN3aaa9GG3231213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231213C1Ev();
extern void _ZN3aaa9GG3231213D1Ev();
Name_Map name_map__ZN3aaa9GG3231213E[] = {
  NSPAIR(_ZN3aaa9GG3231213C1Ev),
  NSPAIR(_ZN3aaa9GG3231213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3231213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231213E[];
extern void _ZN3aaa9GG32312133fooEv();
extern void _ZN3aaa9GG32312133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32312133barEv,_ZThn8_N3aaa9GG32312133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32312133fooEv,_ZThn20_N3aaa9GG32312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32312133barEv,_ZThn28_N3aaa9GG32312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32312133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32312133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32312133barEv,_ZThn8_N3aaa9GG32312133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312133fooEv,_ZThn20_N3aaa9GG32312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32312133barEv,_ZThn28_N3aaa9GG32312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231213E[];
Class_Descriptor cd__ZN3aaa9GG3231213E = {  "_ZN3aaa9GG3231213E", // class name
  bases__ZN3aaa9GG3231213E, 6,
  &(vtc__ZN3aaa9GG3231213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231213E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231221  : ::aaa::EE323 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32312213fooEv
  ~GG3231221(); // tgen
  GG3231221(); // tgen
};
//SIG(1 _ZN3aaa9GG3231221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32312213fooEv");}
aaa::GG3231221 ::~GG3231221(){ note_dtor("_ZN3aaa9GG3231221E", this);} // tgen
aaa::GG3231221 ::GG3231221(){ note_ctor("_ZN3aaa9GG3231221E", this);} // tgen
}
static void Test__ZN3aaa9GG3231221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231221E, buf);
    ::aaa::GG3231221 *dp, &lv = *(dp=new (buf) ::aaa::GG3231221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231221E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3231221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3231221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3231221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231221E);
    dp->::aaa::GG3231221::~GG3231221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231221E(Test__ZN3aaa9GG3231221E, "_ZN3aaa9GG3231221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231221C1Ev();
extern void _ZN3aaa9GG3231221D1Ev();
Name_Map name_map__ZN3aaa9GG3231221E[] = {
  NSPAIR(_ZN3aaa9GG3231221C1Ev),
  NSPAIR(_ZN3aaa9GG3231221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3231221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231221E[];
extern void _ZN3aaa9GG32312213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32312213fooEv,_ZThn20_N3aaa9GG32312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32312213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312213fooEv,_ZThn20_N3aaa9GG32312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231221E[];
Class_Descriptor cd__ZN3aaa9GG3231221E = {  "_ZN3aaa9GG3231221E", // class name
  bases__ZN3aaa9GG3231221E, 6,
  &(vtc__ZN3aaa9GG3231221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231222  : ::aaa::EE323 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32312223barEv
  ~GG3231222(); // tgen
  GG3231222(); // tgen
};
//SIG(1 _ZN3aaa9GG3231222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32312223barEv");}
aaa::GG3231222 ::~GG3231222(){ note_dtor("_ZN3aaa9GG3231222E", this);} // tgen
aaa::GG3231222 ::GG3231222(){ note_ctor("_ZN3aaa9GG3231222E", this);} // tgen
}
static void Test__ZN3aaa9GG3231222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231222E, buf);
    ::aaa::GG3231222 *dp, &lv = *(dp=new (buf) ::aaa::GG3231222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231222E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3231222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3231222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3231222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231222E);
    dp->::aaa::GG3231222::~GG3231222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231222E(Test__ZN3aaa9GG3231222E, "_ZN3aaa9GG3231222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231222C1Ev();
extern void _ZN3aaa9GG3231222D1Ev();
Name_Map name_map__ZN3aaa9GG3231222E[] = {
  NSPAIR(_ZN3aaa9GG3231222C1Ev),
  NSPAIR(_ZN3aaa9GG3231222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3231222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231222E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32312223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32312223barEv,_ZThn8_N3aaa9GG32312223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32312223barEv,_ZThn20_N3aaa9GG32312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32312223barEv,_ZThn28_N3aaa9GG32312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32312223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32312223barEv,_ZThn8_N3aaa9GG32312223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312223barEv,_ZThn20_N3aaa9GG32312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32312223barEv,_ZThn28_N3aaa9GG32312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231222E[];
Class_Descriptor cd__ZN3aaa9GG3231222E = {  "_ZN3aaa9GG3231222E", // class name
  bases__ZN3aaa9GG3231222E, 6,
  &(vtc__ZN3aaa9GG3231222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231223  : ::aaa::EE323 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32312233fooEv
  virtual void  bar(); // _ZN3aaa9GG32312233barEv
  ~GG3231223(); // tgen
  GG3231223(); // tgen
};
//SIG(1 _ZN3aaa9GG3231223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32312233fooEv");}
void  aaa::GG3231223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32312233barEv");}
aaa::GG3231223 ::~GG3231223(){ note_dtor("_ZN3aaa9GG3231223E", this);} // tgen
aaa::GG3231223 ::GG3231223(){ note_ctor("_ZN3aaa9GG3231223E", this);} // tgen
}
static void Test__ZN3aaa9GG3231223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231223E, buf);
    ::aaa::GG3231223 *dp, &lv = *(dp=new (buf) ::aaa::GG3231223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231223E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3231223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3231223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3231223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231223E);
    dp->::aaa::GG3231223::~GG3231223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231223E(Test__ZN3aaa9GG3231223E, "_ZN3aaa9GG3231223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231223C1Ev();
extern void _ZN3aaa9GG3231223D1Ev();
Name_Map name_map__ZN3aaa9GG3231223E[] = {
  NSPAIR(_ZN3aaa9GG3231223C1Ev),
  NSPAIR(_ZN3aaa9GG3231223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3231223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231223E[];
extern void _ZN3aaa9GG32312233fooEv();
extern void _ZN3aaa9GG32312233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32312233barEv,_ZThn8_N3aaa9GG32312233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32312233fooEv,_ZThn20_N3aaa9GG32312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32312233barEv,_ZThn20_N3aaa9GG32312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32312233barEv,_ZThn28_N3aaa9GG32312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32312233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32312233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32312233barEv,_ZThn8_N3aaa9GG32312233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312233fooEv,_ZThn20_N3aaa9GG32312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312233barEv,_ZThn20_N3aaa9GG32312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32312233barEv,_ZThn28_N3aaa9GG32312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231223E[];
Class_Descriptor cd__ZN3aaa9GG3231223E = {  "_ZN3aaa9GG3231223E", // class name
  bases__ZN3aaa9GG3231223E, 6,
  &(vtc__ZN3aaa9GG3231223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231231  : ::aaa::EE323 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32312313fooEv
  ~GG3231231(); // tgen
  GG3231231(); // tgen
};
//SIG(1 _ZN3aaa9GG3231231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32312313fooEv");}
aaa::GG3231231 ::~GG3231231(){ note_dtor("_ZN3aaa9GG3231231E", this);} // tgen
aaa::GG3231231 ::GG3231231(){ note_ctor("_ZN3aaa9GG3231231E", this);} // tgen
}
static void Test__ZN3aaa9GG3231231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231231E, buf);
    ::aaa::GG3231231 *dp, &lv = *(dp=new (buf) ::aaa::GG3231231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231231E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3231231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3231231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3231231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231231E);
    dp->::aaa::GG3231231::~GG3231231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231231E(Test__ZN3aaa9GG3231231E, "_ZN3aaa9GG3231231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231231C1Ev();
extern void _ZN3aaa9GG3231231D1Ev();
Name_Map name_map__ZN3aaa9GG3231231E[] = {
  NSPAIR(_ZN3aaa9GG3231231C1Ev),
  NSPAIR(_ZN3aaa9GG3231231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3231231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231231E[];
extern void _ZN3aaa9GG32312313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32312313fooEv,_ZThn20_N3aaa9GG32312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32312313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312313fooEv,_ZThn20_N3aaa9GG32312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231231E[];
Class_Descriptor cd__ZN3aaa9GG3231231E = {  "_ZN3aaa9GG3231231E", // class name
  bases__ZN3aaa9GG3231231E, 6,
  &(vtc__ZN3aaa9GG3231231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231232  : ::aaa::EE323 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32312323barEv
  ~GG3231232(); // tgen
  GG3231232(); // tgen
};
//SIG(1 _ZN3aaa9GG3231232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32312323barEv");}
aaa::GG3231232 ::~GG3231232(){ note_dtor("_ZN3aaa9GG3231232E", this);} // tgen
aaa::GG3231232 ::GG3231232(){ note_ctor("_ZN3aaa9GG3231232E", this);} // tgen
}
static void Test__ZN3aaa9GG3231232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231232E, buf);
    ::aaa::GG3231232 *dp, &lv = *(dp=new (buf) ::aaa::GG3231232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231232E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3231232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3231232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3231232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231232E);
    dp->::aaa::GG3231232::~GG3231232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231232E(Test__ZN3aaa9GG3231232E, "_ZN3aaa9GG3231232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231232C1Ev();
extern void _ZN3aaa9GG3231232D1Ev();
Name_Map name_map__ZN3aaa9GG3231232E[] = {
  NSPAIR(_ZN3aaa9GG3231232C1Ev),
  NSPAIR(_ZN3aaa9GG3231232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3231232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231232E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32312323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32312323barEv,_ZThn8_N3aaa9GG32312323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32312323barEv,_ZThn20_N3aaa9GG32312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32312323barEv,_ZThn28_N3aaa9GG32312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32312323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32312323barEv,_ZThn8_N3aaa9GG32312323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312323barEv,_ZThn20_N3aaa9GG32312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32312323barEv,_ZThn28_N3aaa9GG32312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231232E[];
Class_Descriptor cd__ZN3aaa9GG3231232E = {  "_ZN3aaa9GG3231232E", // class name
  bases__ZN3aaa9GG3231232E, 6,
  &(vtc__ZN3aaa9GG3231232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231233  : ::aaa::EE323 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32312333fooEv
  virtual void  bar(); // _ZN3aaa9GG32312333barEv
  ~GG3231233(); // tgen
  GG3231233(); // tgen
};
//SIG(1 _ZN3aaa9GG3231233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32312333fooEv");}
void  aaa::GG3231233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32312333barEv");}
aaa::GG3231233 ::~GG3231233(){ note_dtor("_ZN3aaa9GG3231233E", this);} // tgen
aaa::GG3231233 ::GG3231233(){ note_ctor("_ZN3aaa9GG3231233E", this);} // tgen
}
static void Test__ZN3aaa9GG3231233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231233E, buf);
    ::aaa::GG3231233 *dp, &lv = *(dp=new (buf) ::aaa::GG3231233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231233E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3231233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3231233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3231233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231233E);
    dp->::aaa::GG3231233::~GG3231233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231233E(Test__ZN3aaa9GG3231233E, "_ZN3aaa9GG3231233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231233C1Ev();
extern void _ZN3aaa9GG3231233D1Ev();
Name_Map name_map__ZN3aaa9GG3231233E[] = {
  NSPAIR(_ZN3aaa9GG3231233C1Ev),
  NSPAIR(_ZN3aaa9GG3231233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3231233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231233E[];
extern void _ZN3aaa9GG32312333fooEv();
extern void _ZN3aaa9GG32312333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32312333barEv,_ZThn8_N3aaa9GG32312333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32312333fooEv,_ZThn20_N3aaa9GG32312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32312333barEv,_ZThn20_N3aaa9GG32312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32312333barEv,_ZThn28_N3aaa9GG32312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32312333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32312333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32312333barEv,_ZThn8_N3aaa9GG32312333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312333fooEv,_ZThn20_N3aaa9GG32312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32312333barEv,_ZThn20_N3aaa9GG32312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32312333barEv,_ZThn28_N3aaa9GG32312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231233E[];
Class_Descriptor cd__ZN3aaa9GG3231233E = {  "_ZN3aaa9GG3231233E", // class name
  bases__ZN3aaa9GG3231233E, 6,
  &(vtc__ZN3aaa9GG3231233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231311  : ::aaa::EE323 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32313113fooEv
  ~GG3231311(); // tgen
  GG3231311(); // tgen
};
//SIG(1 _ZN3aaa9GG3231311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32313113fooEv");}
aaa::GG3231311 ::~GG3231311(){ note_dtor("_ZN3aaa9GG3231311E", this);} // tgen
aaa::GG3231311 ::GG3231311(){ note_ctor("_ZN3aaa9GG3231311E", this);} // tgen
}
static void Test__ZN3aaa9GG3231311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231311E, buf);
    ::aaa::GG3231311 *dp, &lv = *(dp=new (buf) ::aaa::GG3231311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231311E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3231311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3231311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3231311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231311E);
    dp->::aaa::GG3231311::~GG3231311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231311E(Test__ZN3aaa9GG3231311E, "_ZN3aaa9GG3231311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231311C1Ev();
extern void _ZN3aaa9GG3231311D1Ev();
Name_Map name_map__ZN3aaa9GG3231311E[] = {
  NSPAIR(_ZN3aaa9GG3231311C1Ev),
  NSPAIR(_ZN3aaa9GG3231311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3231311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231311E[];
extern void _ZN3aaa9GG32313113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32313113fooEv,_ZThn20_N3aaa9GG32313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313113fooEv,_ZThn28_N3aaa9GG32313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32313113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313113fooEv,_ZThn20_N3aaa9GG32313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313113fooEv,_ZThn28_N3aaa9GG32313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231311E[];
Class_Descriptor cd__ZN3aaa9GG3231311E = {  "_ZN3aaa9GG3231311E", // class name
  bases__ZN3aaa9GG3231311E, 6,
  &(vtc__ZN3aaa9GG3231311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231311E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231312  : ::aaa::EE323 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32313123barEv
  ~GG3231312(); // tgen
  GG3231312(); // tgen
};
//SIG(1 _ZN3aaa9GG3231312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32313123barEv");}
aaa::GG3231312 ::~GG3231312(){ note_dtor("_ZN3aaa9GG3231312E", this);} // tgen
aaa::GG3231312 ::GG3231312(){ note_ctor("_ZN3aaa9GG3231312E", this);} // tgen
}
static void Test__ZN3aaa9GG3231312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231312E, buf);
    ::aaa::GG3231312 *dp, &lv = *(dp=new (buf) ::aaa::GG3231312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231312E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3231312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3231312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3231312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231312E);
    dp->::aaa::GG3231312::~GG3231312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231312E(Test__ZN3aaa9GG3231312E, "_ZN3aaa9GG3231312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231312C1Ev();
extern void _ZN3aaa9GG3231312D1Ev();
Name_Map name_map__ZN3aaa9GG3231312E[] = {
  NSPAIR(_ZN3aaa9GG3231312C1Ev),
  NSPAIR(_ZN3aaa9GG3231312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3231312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231312E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32313123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32313123barEv,_ZThn8_N3aaa9GG32313123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313123barEv,_ZThn28_N3aaa9GG32313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32313123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32313123barEv,_ZThn8_N3aaa9GG32313123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313123barEv,_ZThn28_N3aaa9GG32313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231312E[];
Class_Descriptor cd__ZN3aaa9GG3231312E = {  "_ZN3aaa9GG3231312E", // class name
  bases__ZN3aaa9GG3231312E, 6,
  &(vtc__ZN3aaa9GG3231312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231312E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231313  : ::aaa::EE323 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32313133fooEv
  virtual void  bar(); // _ZN3aaa9GG32313133barEv
  ~GG3231313(); // tgen
  GG3231313(); // tgen
};
//SIG(1 _ZN3aaa9GG3231313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32313133fooEv");}
void  aaa::GG3231313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32313133barEv");}
aaa::GG3231313 ::~GG3231313(){ note_dtor("_ZN3aaa9GG3231313E", this);} // tgen
aaa::GG3231313 ::GG3231313(){ note_ctor("_ZN3aaa9GG3231313E", this);} // tgen
}
static void Test__ZN3aaa9GG3231313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231313E, buf);
    ::aaa::GG3231313 *dp, &lv = *(dp=new (buf) ::aaa::GG3231313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231313E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3231313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3231313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3231313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231313E);
    dp->::aaa::GG3231313::~GG3231313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231313E(Test__ZN3aaa9GG3231313E, "_ZN3aaa9GG3231313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231313C1Ev();
extern void _ZN3aaa9GG3231313D1Ev();
Name_Map name_map__ZN3aaa9GG3231313E[] = {
  NSPAIR(_ZN3aaa9GG3231313C1Ev),
  NSPAIR(_ZN3aaa9GG3231313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3231313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231313E[];
extern void _ZN3aaa9GG32313133fooEv();
extern void _ZN3aaa9GG32313133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32313133barEv,_ZThn8_N3aaa9GG32313133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32313133fooEv,_ZThn20_N3aaa9GG32313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313133fooEv,_ZThn28_N3aaa9GG32313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313133barEv,_ZThn28_N3aaa9GG32313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32313133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32313133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32313133barEv,_ZThn8_N3aaa9GG32313133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313133fooEv,_ZThn20_N3aaa9GG32313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313133fooEv,_ZThn28_N3aaa9GG32313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313133barEv,_ZThn28_N3aaa9GG32313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231313E[];
Class_Descriptor cd__ZN3aaa9GG3231313E = {  "_ZN3aaa9GG3231313E", // class name
  bases__ZN3aaa9GG3231313E, 6,
  &(vtc__ZN3aaa9GG3231313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231313E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231321  : ::aaa::EE323 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32313213fooEv
  ~GG3231321(); // tgen
  GG3231321(); // tgen
};
//SIG(1 _ZN3aaa9GG3231321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32313213fooEv");}
aaa::GG3231321 ::~GG3231321(){ note_dtor("_ZN3aaa9GG3231321E", this);} // tgen
aaa::GG3231321 ::GG3231321(){ note_ctor("_ZN3aaa9GG3231321E", this);} // tgen
}
static void Test__ZN3aaa9GG3231321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231321E, buf);
    ::aaa::GG3231321 *dp, &lv = *(dp=new (buf) ::aaa::GG3231321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231321E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3231321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3231321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3231321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231321E);
    dp->::aaa::GG3231321::~GG3231321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231321E(Test__ZN3aaa9GG3231321E, "_ZN3aaa9GG3231321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231321C1Ev();
extern void _ZN3aaa9GG3231321D1Ev();
Name_Map name_map__ZN3aaa9GG3231321E[] = {
  NSPAIR(_ZN3aaa9GG3231321C1Ev),
  NSPAIR(_ZN3aaa9GG3231321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3231321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231321E[];
extern void _ZN3aaa9GG32313213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32313213fooEv,_ZThn20_N3aaa9GG32313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32313213fooEv,_ZThn28_N3aaa9GG32313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32313213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313213fooEv,_ZThn20_N3aaa9GG32313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313213fooEv,_ZThn28_N3aaa9GG32313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231321E[];
Class_Descriptor cd__ZN3aaa9GG3231321E = {  "_ZN3aaa9GG3231321E", // class name
  bases__ZN3aaa9GG3231321E, 6,
  &(vtc__ZN3aaa9GG3231321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231322  : ::aaa::EE323 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32313223barEv
  ~GG3231322(); // tgen
  GG3231322(); // tgen
};
//SIG(1 _ZN3aaa9GG3231322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32313223barEv");}
aaa::GG3231322 ::~GG3231322(){ note_dtor("_ZN3aaa9GG3231322E", this);} // tgen
aaa::GG3231322 ::GG3231322(){ note_ctor("_ZN3aaa9GG3231322E", this);} // tgen
}
static void Test__ZN3aaa9GG3231322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231322E, buf);
    ::aaa::GG3231322 *dp, &lv = *(dp=new (buf) ::aaa::GG3231322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231322E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3231322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3231322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3231322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231322E);
    dp->::aaa::GG3231322::~GG3231322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231322E(Test__ZN3aaa9GG3231322E, "_ZN3aaa9GG3231322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231322C1Ev();
extern void _ZN3aaa9GG3231322D1Ev();
Name_Map name_map__ZN3aaa9GG3231322E[] = {
  NSPAIR(_ZN3aaa9GG3231322C1Ev),
  NSPAIR(_ZN3aaa9GG3231322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3231322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231322E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32313223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32313223barEv,_ZThn8_N3aaa9GG32313223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32313223barEv,_ZThn20_N3aaa9GG32313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32313223barEv,_ZThn28_N3aaa9GG32313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32313223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32313223barEv,_ZThn8_N3aaa9GG32313223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313223barEv,_ZThn20_N3aaa9GG32313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313223barEv,_ZThn28_N3aaa9GG32313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231322E[];
Class_Descriptor cd__ZN3aaa9GG3231322E = {  "_ZN3aaa9GG3231322E", // class name
  bases__ZN3aaa9GG3231322E, 6,
  &(vtc__ZN3aaa9GG3231322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231323  : ::aaa::EE323 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32313233fooEv
  virtual void  bar(); // _ZN3aaa9GG32313233barEv
  ~GG3231323(); // tgen
  GG3231323(); // tgen
};
//SIG(1 _ZN3aaa9GG3231323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32313233fooEv");}
void  aaa::GG3231323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32313233barEv");}
aaa::GG3231323 ::~GG3231323(){ note_dtor("_ZN3aaa9GG3231323E", this);} // tgen
aaa::GG3231323 ::GG3231323(){ note_ctor("_ZN3aaa9GG3231323E", this);} // tgen
}
static void Test__ZN3aaa9GG3231323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231323E, buf);
    ::aaa::GG3231323 *dp, &lv = *(dp=new (buf) ::aaa::GG3231323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231323E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3231323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3231323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3231323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231323E);
    dp->::aaa::GG3231323::~GG3231323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231323E(Test__ZN3aaa9GG3231323E, "_ZN3aaa9GG3231323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231323C1Ev();
extern void _ZN3aaa9GG3231323D1Ev();
Name_Map name_map__ZN3aaa9GG3231323E[] = {
  NSPAIR(_ZN3aaa9GG3231323C1Ev),
  NSPAIR(_ZN3aaa9GG3231323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3231323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231323E[];
extern void _ZN3aaa9GG32313233fooEv();
extern void _ZN3aaa9GG32313233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32313233barEv,_ZThn8_N3aaa9GG32313233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32313233fooEv,_ZThn20_N3aaa9GG32313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32313233barEv,_ZThn20_N3aaa9GG32313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313233fooEv,_ZThn28_N3aaa9GG32313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313233barEv,_ZThn28_N3aaa9GG32313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32313233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32313233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32313233barEv,_ZThn8_N3aaa9GG32313233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313233fooEv,_ZThn20_N3aaa9GG32313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313233barEv,_ZThn20_N3aaa9GG32313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313233fooEv,_ZThn28_N3aaa9GG32313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313233barEv,_ZThn28_N3aaa9GG32313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231323E[];
Class_Descriptor cd__ZN3aaa9GG3231323E = {  "_ZN3aaa9GG3231323E", // class name
  bases__ZN3aaa9GG3231323E, 6,
  &(vtc__ZN3aaa9GG3231323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231331  : ::aaa::EE323 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32313313fooEv
  ~GG3231331(); // tgen
  GG3231331(); // tgen
};
//SIG(1 _ZN3aaa9GG3231331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32313313fooEv");}
aaa::GG3231331 ::~GG3231331(){ note_dtor("_ZN3aaa9GG3231331E", this);} // tgen
aaa::GG3231331 ::GG3231331(){ note_ctor("_ZN3aaa9GG3231331E", this);} // tgen
}
static void Test__ZN3aaa9GG3231331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231331E, buf);
    ::aaa::GG3231331 *dp, &lv = *(dp=new (buf) ::aaa::GG3231331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231331E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3231331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3231331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3231331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231331E);
    dp->::aaa::GG3231331::~GG3231331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231331E(Test__ZN3aaa9GG3231331E, "_ZN3aaa9GG3231331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231331C1Ev();
extern void _ZN3aaa9GG3231331D1Ev();
Name_Map name_map__ZN3aaa9GG3231331E[] = {
  NSPAIR(_ZN3aaa9GG3231331C1Ev),
  NSPAIR(_ZN3aaa9GG3231331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3231331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231331E[];
extern void _ZN3aaa9GG32313313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32313313fooEv,_ZThn20_N3aaa9GG32313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32313313fooEv,_ZThn28_N3aaa9GG32313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32313313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313313fooEv,_ZThn20_N3aaa9GG32313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313313fooEv,_ZThn28_N3aaa9GG32313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231331E[];
Class_Descriptor cd__ZN3aaa9GG3231331E = {  "_ZN3aaa9GG3231331E", // class name
  bases__ZN3aaa9GG3231331E, 6,
  &(vtc__ZN3aaa9GG3231331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231332  : ::aaa::EE323 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32313323barEv
  ~GG3231332(); // tgen
  GG3231332(); // tgen
};
//SIG(1 _ZN3aaa9GG3231332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3231332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32313323barEv");}
aaa::GG3231332 ::~GG3231332(){ note_dtor("_ZN3aaa9GG3231332E", this);} // tgen
aaa::GG3231332 ::GG3231332(){ note_ctor("_ZN3aaa9GG3231332E", this);} // tgen
}
static void Test__ZN3aaa9GG3231332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231332E, buf);
    ::aaa::GG3231332 *dp, &lv = *(dp=new (buf) ::aaa::GG3231332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231332E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3231332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3231332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3231332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231332E);
    dp->::aaa::GG3231332::~GG3231332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231332E(Test__ZN3aaa9GG3231332E, "_ZN3aaa9GG3231332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231332C1Ev();
extern void _ZN3aaa9GG3231332D1Ev();
Name_Map name_map__ZN3aaa9GG3231332E[] = {
  NSPAIR(_ZN3aaa9GG3231332C1Ev),
  NSPAIR(_ZN3aaa9GG3231332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3231332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231332E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32313323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32313323barEv,_ZThn8_N3aaa9GG32313323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32313323barEv,_ZThn20_N3aaa9GG32313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313323barEv,_ZThn28_N3aaa9GG32313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32313323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32313323barEv,_ZThn8_N3aaa9GG32313323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313323barEv,_ZThn20_N3aaa9GG32313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313323barEv,_ZThn28_N3aaa9GG32313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231332E[];
Class_Descriptor cd__ZN3aaa9GG3231332E = {  "_ZN3aaa9GG3231332E", // class name
  bases__ZN3aaa9GG3231332E, 6,
  &(vtc__ZN3aaa9GG3231332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3231333  : ::aaa::EE323 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32313333fooEv
  virtual void  bar(); // _ZN3aaa9GG32313333barEv
  ~GG3231333(); // tgen
  GG3231333(); // tgen
};
//SIG(1 _ZN3aaa9GG3231333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3231333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32313333fooEv");}
void  aaa::GG3231333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32313333barEv");}
aaa::GG3231333 ::~GG3231333(){ note_dtor("_ZN3aaa9GG3231333E", this);} // tgen
aaa::GG3231333 ::GG3231333(){ note_ctor("_ZN3aaa9GG3231333E", this);} // tgen
}
static void Test__ZN3aaa9GG3231333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3231333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3231333E, buf);
    ::aaa::GG3231333 *dp, &lv = *(dp=new (buf) ::aaa::GG3231333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3231333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3231333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3231333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3231333E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3231333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3231333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3231333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3231333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3231333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3231333E);
    dp->::aaa::GG3231333::~GG3231333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3231333E(Test__ZN3aaa9GG3231333E, "_ZN3aaa9GG3231333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3231333C1Ev();
extern void _ZN3aaa9GG3231333D1Ev();
Name_Map name_map__ZN3aaa9GG3231333E[] = {
  NSPAIR(_ZN3aaa9GG3231333C1Ev),
  NSPAIR(_ZN3aaa9GG3231333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3231333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3231333E[];
extern void _ZN3aaa9GG32313333fooEv();
extern void _ZN3aaa9GG32313333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32313333barEv,_ZThn8_N3aaa9GG32313333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32313333fooEv,_ZThn20_N3aaa9GG32313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32313333barEv,_ZThn20_N3aaa9GG32313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313333fooEv,_ZThn28_N3aaa9GG32313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32313333barEv,_ZThn28_N3aaa9GG32313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3231333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32313333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32313333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32313333barEv,_ZThn8_N3aaa9GG32313333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313333fooEv,_ZThn20_N3aaa9GG32313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32313333barEv,_ZThn20_N3aaa9GG32313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3231333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313333fooEv,_ZThn28_N3aaa9GG32313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32313333barEv,_ZThn28_N3aaa9GG32313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3231333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3231333E[];
Class_Descriptor cd__ZN3aaa9GG3231333E = {  "_ZN3aaa9GG3231333E", // class name
  bases__ZN3aaa9GG3231333E, 6,
  &(vtc__ZN3aaa9GG3231333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3231333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3231333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232111  : ::aaa::EE323 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32321113fooEv
  ~GG3232111(); // tgen
  GG3232111(); // tgen
};
//SIG(1 _ZN3aaa9GG3232111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32321113fooEv");}
aaa::GG3232111 ::~GG3232111(){ note_dtor("_ZN3aaa9GG3232111E", this);} // tgen
aaa::GG3232111 ::GG3232111(){ note_ctor("_ZN3aaa9GG3232111E", this);} // tgen
}
static void Test__ZN3aaa9GG3232111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232111E, buf);
    ::aaa::GG3232111 *dp, &lv = *(dp=new (buf) ::aaa::GG3232111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232111E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3232111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3232111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3232111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232111E);
    dp->::aaa::GG3232111::~GG3232111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232111E(Test__ZN3aaa9GG3232111E, "_ZN3aaa9GG3232111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232111C1Ev();
extern void _ZN3aaa9GG3232111D1Ev();
Name_Map name_map__ZN3aaa9GG3232111E[] = {
  NSPAIR(_ZN3aaa9GG3232111C1Ev),
  NSPAIR(_ZN3aaa9GG3232111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3232111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232111E[];
extern void _ZN3aaa9GG32321113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32321113fooEv,_ZThn20_N3aaa9GG32321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32321113fooEv,_ZThn28_N3aaa9GG32321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32321113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321113fooEv,_ZThn20_N3aaa9GG32321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32321113fooEv,_ZThn28_N3aaa9GG32321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232111E[];
Class_Descriptor cd__ZN3aaa9GG3232111E = {  "_ZN3aaa9GG3232111E", // class name
  bases__ZN3aaa9GG3232111E, 6,
  &(vtc__ZN3aaa9GG3232111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232112  : ::aaa::EE323 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32321123barEv
  ~GG3232112(); // tgen
  GG3232112(); // tgen
};
//SIG(1 _ZN3aaa9GG3232112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32321123barEv");}
aaa::GG3232112 ::~GG3232112(){ note_dtor("_ZN3aaa9GG3232112E", this);} // tgen
aaa::GG3232112 ::GG3232112(){ note_ctor("_ZN3aaa9GG3232112E", this);} // tgen
}
static void Test__ZN3aaa9GG3232112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232112E, buf);
    ::aaa::GG3232112 *dp, &lv = *(dp=new (buf) ::aaa::GG3232112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232112E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3232112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3232112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3232112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232112E);
    dp->::aaa::GG3232112::~GG3232112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232112E(Test__ZN3aaa9GG3232112E, "_ZN3aaa9GG3232112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232112C1Ev();
extern void _ZN3aaa9GG3232112D1Ev();
Name_Map name_map__ZN3aaa9GG3232112E[] = {
  NSPAIR(_ZN3aaa9GG3232112C1Ev),
  NSPAIR(_ZN3aaa9GG3232112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3232112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232112E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32321123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32321123barEv,_ZThn8_N3aaa9GG32321123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32321123barEv,_ZThn20_N3aaa9GG32321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32321123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32321123barEv,_ZThn8_N3aaa9GG32321123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321123barEv,_ZThn20_N3aaa9GG32321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232112E[];
Class_Descriptor cd__ZN3aaa9GG3232112E = {  "_ZN3aaa9GG3232112E", // class name
  bases__ZN3aaa9GG3232112E, 6,
  &(vtc__ZN3aaa9GG3232112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232113  : ::aaa::EE323 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32321133fooEv
  virtual void  bar(); // _ZN3aaa9GG32321133barEv
  ~GG3232113(); // tgen
  GG3232113(); // tgen
};
//SIG(1 _ZN3aaa9GG3232113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32321133fooEv");}
void  aaa::GG3232113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32321133barEv");}
aaa::GG3232113 ::~GG3232113(){ note_dtor("_ZN3aaa9GG3232113E", this);} // tgen
aaa::GG3232113 ::GG3232113(){ note_ctor("_ZN3aaa9GG3232113E", this);} // tgen
}
static void Test__ZN3aaa9GG3232113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232113E, buf);
    ::aaa::GG3232113 *dp, &lv = *(dp=new (buf) ::aaa::GG3232113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232113E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3232113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3232113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3232113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232113E);
    dp->::aaa::GG3232113::~GG3232113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232113E(Test__ZN3aaa9GG3232113E, "_ZN3aaa9GG3232113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232113C1Ev();
extern void _ZN3aaa9GG3232113D1Ev();
Name_Map name_map__ZN3aaa9GG3232113E[] = {
  NSPAIR(_ZN3aaa9GG3232113C1Ev),
  NSPAIR(_ZN3aaa9GG3232113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3232113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232113E[];
extern void _ZN3aaa9GG32321133fooEv();
extern void _ZN3aaa9GG32321133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32321133barEv,_ZThn8_N3aaa9GG32321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32321133barEv,_ZThn20_N3aaa9GG32321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32321133fooEv,_ZThn20_N3aaa9GG32321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32321133fooEv,_ZThn28_N3aaa9GG32321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32321133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32321133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32321133barEv,_ZThn8_N3aaa9GG32321133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321133barEv,_ZThn20_N3aaa9GG32321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321133fooEv,_ZThn20_N3aaa9GG32321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32321133fooEv,_ZThn28_N3aaa9GG32321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232113E[];
Class_Descriptor cd__ZN3aaa9GG3232113E = {  "_ZN3aaa9GG3232113E", // class name
  bases__ZN3aaa9GG3232113E, 6,
  &(vtc__ZN3aaa9GG3232113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232121  : ::aaa::EE323 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32321213fooEv
  ~GG3232121(); // tgen
  GG3232121(); // tgen
};
//SIG(1 _ZN3aaa9GG3232121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32321213fooEv");}
aaa::GG3232121 ::~GG3232121(){ note_dtor("_ZN3aaa9GG3232121E", this);} // tgen
aaa::GG3232121 ::GG3232121(){ note_ctor("_ZN3aaa9GG3232121E", this);} // tgen
}
static void Test__ZN3aaa9GG3232121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232121E, buf);
    ::aaa::GG3232121 *dp, &lv = *(dp=new (buf) ::aaa::GG3232121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232121E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3232121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3232121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3232121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232121E);
    dp->::aaa::GG3232121::~GG3232121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232121E(Test__ZN3aaa9GG3232121E, "_ZN3aaa9GG3232121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232121C1Ev();
extern void _ZN3aaa9GG3232121D1Ev();
Name_Map name_map__ZN3aaa9GG3232121E[] = {
  NSPAIR(_ZN3aaa9GG3232121C1Ev),
  NSPAIR(_ZN3aaa9GG3232121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3232121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232121E[];
extern void _ZN3aaa9GG32321213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32321213fooEv,_ZThn28_N3aaa9GG32321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32321213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32321213fooEv,_ZThn28_N3aaa9GG32321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232121E[];
Class_Descriptor cd__ZN3aaa9GG3232121E = {  "_ZN3aaa9GG3232121E", // class name
  bases__ZN3aaa9GG3232121E, 6,
  &(vtc__ZN3aaa9GG3232121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232121E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232122  : ::aaa::EE323 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32321223barEv
  ~GG3232122(); // tgen
  GG3232122(); // tgen
};
//SIG(1 _ZN3aaa9GG3232122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32321223barEv");}
aaa::GG3232122 ::~GG3232122(){ note_dtor("_ZN3aaa9GG3232122E", this);} // tgen
aaa::GG3232122 ::GG3232122(){ note_ctor("_ZN3aaa9GG3232122E", this);} // tgen
}
static void Test__ZN3aaa9GG3232122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232122E, buf);
    ::aaa::GG3232122 *dp, &lv = *(dp=new (buf) ::aaa::GG3232122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232122E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3232122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3232122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3232122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232122E);
    dp->::aaa::GG3232122::~GG3232122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232122E(Test__ZN3aaa9GG3232122E, "_ZN3aaa9GG3232122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232122C1Ev();
extern void _ZN3aaa9GG3232122D1Ev();
Name_Map name_map__ZN3aaa9GG3232122E[] = {
  NSPAIR(_ZN3aaa9GG3232122C1Ev),
  NSPAIR(_ZN3aaa9GG3232122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3232122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232122E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32321223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32321223barEv,_ZThn8_N3aaa9GG32321223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32321223barEv,_ZThn20_N3aaa9GG32321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32321223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32321223barEv,_ZThn8_N3aaa9GG32321223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321223barEv,_ZThn20_N3aaa9GG32321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232122E[];
Class_Descriptor cd__ZN3aaa9GG3232122E = {  "_ZN3aaa9GG3232122E", // class name
  bases__ZN3aaa9GG3232122E, 6,
  &(vtc__ZN3aaa9GG3232122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232122E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232123  : ::aaa::EE323 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32321233fooEv
  virtual void  bar(); // _ZN3aaa9GG32321233barEv
  ~GG3232123(); // tgen
  GG3232123(); // tgen
};
//SIG(1 _ZN3aaa9GG3232123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32321233fooEv");}
void  aaa::GG3232123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32321233barEv");}
aaa::GG3232123 ::~GG3232123(){ note_dtor("_ZN3aaa9GG3232123E", this);} // tgen
aaa::GG3232123 ::GG3232123(){ note_ctor("_ZN3aaa9GG3232123E", this);} // tgen
}
static void Test__ZN3aaa9GG3232123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232123E, buf);
    ::aaa::GG3232123 *dp, &lv = *(dp=new (buf) ::aaa::GG3232123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232123E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3232123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3232123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3232123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232123E);
    dp->::aaa::GG3232123::~GG3232123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232123E(Test__ZN3aaa9GG3232123E, "_ZN3aaa9GG3232123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232123C1Ev();
extern void _ZN3aaa9GG3232123D1Ev();
Name_Map name_map__ZN3aaa9GG3232123E[] = {
  NSPAIR(_ZN3aaa9GG3232123C1Ev),
  NSPAIR(_ZN3aaa9GG3232123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3232123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232123E[];
extern void _ZN3aaa9GG32321233fooEv();
extern void _ZN3aaa9GG32321233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32321233barEv,_ZThn8_N3aaa9GG32321233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32321233barEv,_ZThn20_N3aaa9GG32321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32321233fooEv,_ZThn28_N3aaa9GG32321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32321233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32321233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32321233barEv,_ZThn8_N3aaa9GG32321233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321233barEv,_ZThn20_N3aaa9GG32321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32321233fooEv,_ZThn28_N3aaa9GG32321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232123E[];
Class_Descriptor cd__ZN3aaa9GG3232123E = {  "_ZN3aaa9GG3232123E", // class name
  bases__ZN3aaa9GG3232123E, 6,
  &(vtc__ZN3aaa9GG3232123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232123E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232131  : ::aaa::EE323 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32321313fooEv
  ~GG3232131(); // tgen
  GG3232131(); // tgen
};
//SIG(1 _ZN3aaa9GG3232131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32321313fooEv");}
aaa::GG3232131 ::~GG3232131(){ note_dtor("_ZN3aaa9GG3232131E", this);} // tgen
aaa::GG3232131 ::GG3232131(){ note_ctor("_ZN3aaa9GG3232131E", this);} // tgen
}
static void Test__ZN3aaa9GG3232131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232131E, buf);
    ::aaa::GG3232131 *dp, &lv = *(dp=new (buf) ::aaa::GG3232131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232131E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3232131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3232131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3232131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232131E);
    dp->::aaa::GG3232131::~GG3232131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232131E(Test__ZN3aaa9GG3232131E, "_ZN3aaa9GG3232131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232131C1Ev();
extern void _ZN3aaa9GG3232131D1Ev();
Name_Map name_map__ZN3aaa9GG3232131E[] = {
  NSPAIR(_ZN3aaa9GG3232131C1Ev),
  NSPAIR(_ZN3aaa9GG3232131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3232131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232131E[];
extern void _ZN3aaa9GG32321313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32321313fooEv,_ZThn20_N3aaa9GG32321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32321313fooEv,_ZThn28_N3aaa9GG32321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32321313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321313fooEv,_ZThn20_N3aaa9GG32321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32321313fooEv,_ZThn28_N3aaa9GG32321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232131E[];
Class_Descriptor cd__ZN3aaa9GG3232131E = {  "_ZN3aaa9GG3232131E", // class name
  bases__ZN3aaa9GG3232131E, 6,
  &(vtc__ZN3aaa9GG3232131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232132  : ::aaa::EE323 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32321323barEv
  ~GG3232132(); // tgen
  GG3232132(); // tgen
};
//SIG(1 _ZN3aaa9GG3232132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32321323barEv");}
aaa::GG3232132 ::~GG3232132(){ note_dtor("_ZN3aaa9GG3232132E", this);} // tgen
aaa::GG3232132 ::GG3232132(){ note_ctor("_ZN3aaa9GG3232132E", this);} // tgen
}
static void Test__ZN3aaa9GG3232132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232132E, buf);
    ::aaa::GG3232132 *dp, &lv = *(dp=new (buf) ::aaa::GG3232132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232132E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3232132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3232132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3232132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232132E);
    dp->::aaa::GG3232132::~GG3232132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232132E(Test__ZN3aaa9GG3232132E, "_ZN3aaa9GG3232132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232132C1Ev();
extern void _ZN3aaa9GG3232132D1Ev();
Name_Map name_map__ZN3aaa9GG3232132E[] = {
  NSPAIR(_ZN3aaa9GG3232132C1Ev),
  NSPAIR(_ZN3aaa9GG3232132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3232132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232132E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32321323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32321323barEv,_ZThn8_N3aaa9GG32321323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32321323barEv,_ZThn20_N3aaa9GG32321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32321323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32321323barEv,_ZThn8_N3aaa9GG32321323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321323barEv,_ZThn20_N3aaa9GG32321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232132E[];
Class_Descriptor cd__ZN3aaa9GG3232132E = {  "_ZN3aaa9GG3232132E", // class name
  bases__ZN3aaa9GG3232132E, 6,
  &(vtc__ZN3aaa9GG3232132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232133  : ::aaa::EE323 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32321333fooEv
  virtual void  bar(); // _ZN3aaa9GG32321333barEv
  ~GG3232133(); // tgen
  GG3232133(); // tgen
};
//SIG(1 _ZN3aaa9GG3232133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32321333fooEv");}
void  aaa::GG3232133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32321333barEv");}
aaa::GG3232133 ::~GG3232133(){ note_dtor("_ZN3aaa9GG3232133E", this);} // tgen
aaa::GG3232133 ::GG3232133(){ note_ctor("_ZN3aaa9GG3232133E", this);} // tgen
}
static void Test__ZN3aaa9GG3232133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232133E, buf);
    ::aaa::GG3232133 *dp, &lv = *(dp=new (buf) ::aaa::GG3232133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232133E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3232133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3232133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3232133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232133E);
    dp->::aaa::GG3232133::~GG3232133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232133E(Test__ZN3aaa9GG3232133E, "_ZN3aaa9GG3232133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232133C1Ev();
extern void _ZN3aaa9GG3232133D1Ev();
Name_Map name_map__ZN3aaa9GG3232133E[] = {
  NSPAIR(_ZN3aaa9GG3232133C1Ev),
  NSPAIR(_ZN3aaa9GG3232133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3232133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232133E[];
extern void _ZN3aaa9GG32321333fooEv();
extern void _ZN3aaa9GG32321333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32321333barEv,_ZThn8_N3aaa9GG32321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32321333barEv,_ZThn20_N3aaa9GG32321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32321333fooEv,_ZThn20_N3aaa9GG32321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32321333fooEv,_ZThn28_N3aaa9GG32321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32321333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32321333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32321333barEv,_ZThn8_N3aaa9GG32321333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321333barEv,_ZThn20_N3aaa9GG32321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32321333fooEv,_ZThn20_N3aaa9GG32321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32321333fooEv,_ZThn28_N3aaa9GG32321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232133E[];
Class_Descriptor cd__ZN3aaa9GG3232133E = {  "_ZN3aaa9GG3232133E", // class name
  bases__ZN3aaa9GG3232133E, 6,
  &(vtc__ZN3aaa9GG3232133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232211  : ::aaa::EE323 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32322113fooEv
  ~GG3232211(); // tgen
  GG3232211(); // tgen
};
//SIG(1 _ZN3aaa9GG3232211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32322113fooEv");}
aaa::GG3232211 ::~GG3232211(){ note_dtor("_ZN3aaa9GG3232211E", this);} // tgen
aaa::GG3232211 ::GG3232211(){ note_ctor("_ZN3aaa9GG3232211E", this);} // tgen
}
static void Test__ZN3aaa9GG3232211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232211E, buf);
    ::aaa::GG3232211 *dp, &lv = *(dp=new (buf) ::aaa::GG3232211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232211E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3232211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3232211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3232211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232211E);
    dp->::aaa::GG3232211::~GG3232211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232211E(Test__ZN3aaa9GG3232211E, "_ZN3aaa9GG3232211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232211C1Ev();
extern void _ZN3aaa9GG3232211D1Ev();
Name_Map name_map__ZN3aaa9GG3232211E[] = {
  NSPAIR(_ZN3aaa9GG3232211C1Ev),
  NSPAIR(_ZN3aaa9GG3232211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3232211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232211E[];
extern void _ZN3aaa9GG32322113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32322113fooEv,_ZThn20_N3aaa9GG32322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32322113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322113fooEv,_ZThn20_N3aaa9GG32322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232211E[];
Class_Descriptor cd__ZN3aaa9GG3232211E = {  "_ZN3aaa9GG3232211E", // class name
  bases__ZN3aaa9GG3232211E, 6,
  &(vtc__ZN3aaa9GG3232211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232212  : ::aaa::EE323 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32322123barEv
  ~GG3232212(); // tgen
  GG3232212(); // tgen
};
//SIG(1 _ZN3aaa9GG3232212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32322123barEv");}
aaa::GG3232212 ::~GG3232212(){ note_dtor("_ZN3aaa9GG3232212E", this);} // tgen
aaa::GG3232212 ::GG3232212(){ note_ctor("_ZN3aaa9GG3232212E", this);} // tgen
}
static void Test__ZN3aaa9GG3232212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232212E, buf);
    ::aaa::GG3232212 *dp, &lv = *(dp=new (buf) ::aaa::GG3232212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232212E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3232212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3232212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3232212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232212E);
    dp->::aaa::GG3232212::~GG3232212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232212E(Test__ZN3aaa9GG3232212E, "_ZN3aaa9GG3232212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232212C1Ev();
extern void _ZN3aaa9GG3232212D1Ev();
Name_Map name_map__ZN3aaa9GG3232212E[] = {
  NSPAIR(_ZN3aaa9GG3232212C1Ev),
  NSPAIR(_ZN3aaa9GG3232212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3232212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232212E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32322123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32322123barEv,_ZThn8_N3aaa9GG32322123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32322123barEv,_ZThn20_N3aaa9GG32322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32322123barEv,_ZThn28_N3aaa9GG32322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32322123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32322123barEv,_ZThn8_N3aaa9GG32322123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322123barEv,_ZThn20_N3aaa9GG32322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32322123barEv,_ZThn28_N3aaa9GG32322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232212E[];
Class_Descriptor cd__ZN3aaa9GG3232212E = {  "_ZN3aaa9GG3232212E", // class name
  bases__ZN3aaa9GG3232212E, 6,
  &(vtc__ZN3aaa9GG3232212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232213  : ::aaa::EE323 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32322133fooEv
  virtual void  bar(); // _ZN3aaa9GG32322133barEv
  ~GG3232213(); // tgen
  GG3232213(); // tgen
};
//SIG(1 _ZN3aaa9GG3232213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32322133fooEv");}
void  aaa::GG3232213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32322133barEv");}
aaa::GG3232213 ::~GG3232213(){ note_dtor("_ZN3aaa9GG3232213E", this);} // tgen
aaa::GG3232213 ::GG3232213(){ note_ctor("_ZN3aaa9GG3232213E", this);} // tgen
}
static void Test__ZN3aaa9GG3232213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232213E, buf);
    ::aaa::GG3232213 *dp, &lv = *(dp=new (buf) ::aaa::GG3232213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232213E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3232213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3232213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3232213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232213E);
    dp->::aaa::GG3232213::~GG3232213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232213E(Test__ZN3aaa9GG3232213E, "_ZN3aaa9GG3232213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232213C1Ev();
extern void _ZN3aaa9GG3232213D1Ev();
Name_Map name_map__ZN3aaa9GG3232213E[] = {
  NSPAIR(_ZN3aaa9GG3232213C1Ev),
  NSPAIR(_ZN3aaa9GG3232213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3232213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232213E[];
extern void _ZN3aaa9GG32322133fooEv();
extern void _ZN3aaa9GG32322133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32322133barEv,_ZThn8_N3aaa9GG32322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32322133barEv,_ZThn20_N3aaa9GG32322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32322133fooEv,_ZThn20_N3aaa9GG32322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32322133barEv,_ZThn28_N3aaa9GG32322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32322133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32322133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32322133barEv,_ZThn8_N3aaa9GG32322133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322133barEv,_ZThn20_N3aaa9GG32322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322133fooEv,_ZThn20_N3aaa9GG32322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32322133barEv,_ZThn28_N3aaa9GG32322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232213E[];
Class_Descriptor cd__ZN3aaa9GG3232213E = {  "_ZN3aaa9GG3232213E", // class name
  bases__ZN3aaa9GG3232213E, 6,
  &(vtc__ZN3aaa9GG3232213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232221  : ::aaa::EE323 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32322213fooEv
  ~GG3232221(); // tgen
  GG3232221(); // tgen
};
//SIG(1 _ZN3aaa9GG3232221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32322213fooEv");}
aaa::GG3232221 ::~GG3232221(){ note_dtor("_ZN3aaa9GG3232221E", this);} // tgen
aaa::GG3232221 ::GG3232221(){ note_ctor("_ZN3aaa9GG3232221E", this);} // tgen
}
static void Test__ZN3aaa9GG3232221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232221E, buf);
    ::aaa::GG3232221 *dp, &lv = *(dp=new (buf) ::aaa::GG3232221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232221E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3232221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3232221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3232221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232221E);
    dp->::aaa::GG3232221::~GG3232221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232221E(Test__ZN3aaa9GG3232221E, "_ZN3aaa9GG3232221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232221C1Ev();
extern void _ZN3aaa9GG3232221D1Ev();
Name_Map name_map__ZN3aaa9GG3232221E[] = {
  NSPAIR(_ZN3aaa9GG3232221C1Ev),
  NSPAIR(_ZN3aaa9GG3232221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3232221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232221E[];
extern void _ZN3aaa9GG32322213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32322213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232221E[];
Class_Descriptor cd__ZN3aaa9GG3232221E = {  "_ZN3aaa9GG3232221E", // class name
  bases__ZN3aaa9GG3232221E, 6,
  &(vtc__ZN3aaa9GG3232221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232221E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232222  : ::aaa::EE323 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32322223barEv
  ~GG3232222(); // tgen
  GG3232222(); // tgen
};
//SIG(1 _ZN3aaa9GG3232222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32322223barEv");}
aaa::GG3232222 ::~GG3232222(){ note_dtor("_ZN3aaa9GG3232222E", this);} // tgen
aaa::GG3232222 ::GG3232222(){ note_ctor("_ZN3aaa9GG3232222E", this);} // tgen
}
static void Test__ZN3aaa9GG3232222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232222E, buf);
    ::aaa::GG3232222 *dp, &lv = *(dp=new (buf) ::aaa::GG3232222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232222E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3232222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3232222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3232222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232222E);
    dp->::aaa::GG3232222::~GG3232222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232222E(Test__ZN3aaa9GG3232222E, "_ZN3aaa9GG3232222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232222C1Ev();
extern void _ZN3aaa9GG3232222D1Ev();
Name_Map name_map__ZN3aaa9GG3232222E[] = {
  NSPAIR(_ZN3aaa9GG3232222C1Ev),
  NSPAIR(_ZN3aaa9GG3232222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3232222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232222E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32322223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32322223barEv,_ZThn8_N3aaa9GG32322223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32322223barEv,_ZThn20_N3aaa9GG32322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32322223barEv,_ZThn28_N3aaa9GG32322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32322223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32322223barEv,_ZThn8_N3aaa9GG32322223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322223barEv,_ZThn20_N3aaa9GG32322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32322223barEv,_ZThn28_N3aaa9GG32322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232222E[];
Class_Descriptor cd__ZN3aaa9GG3232222E = {  "_ZN3aaa9GG3232222E", // class name
  bases__ZN3aaa9GG3232222E, 6,
  &(vtc__ZN3aaa9GG3232222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232222E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232223  : ::aaa::EE323 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32322233fooEv
  virtual void  bar(); // _ZN3aaa9GG32322233barEv
  ~GG3232223(); // tgen
  GG3232223(); // tgen
};
//SIG(1 _ZN3aaa9GG3232223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32322233fooEv");}
void  aaa::GG3232223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32322233barEv");}
aaa::GG3232223 ::~GG3232223(){ note_dtor("_ZN3aaa9GG3232223E", this);} // tgen
aaa::GG3232223 ::GG3232223(){ note_ctor("_ZN3aaa9GG3232223E", this);} // tgen
}
static void Test__ZN3aaa9GG3232223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232223E, buf);
    ::aaa::GG3232223 *dp, &lv = *(dp=new (buf) ::aaa::GG3232223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232223E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3232223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3232223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3232223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232223E);
    dp->::aaa::GG3232223::~GG3232223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232223E(Test__ZN3aaa9GG3232223E, "_ZN3aaa9GG3232223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232223C1Ev();
extern void _ZN3aaa9GG3232223D1Ev();
Name_Map name_map__ZN3aaa9GG3232223E[] = {
  NSPAIR(_ZN3aaa9GG3232223C1Ev),
  NSPAIR(_ZN3aaa9GG3232223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3232223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232223E[];
extern void _ZN3aaa9GG32322233fooEv();
extern void _ZN3aaa9GG32322233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32322233barEv,_ZThn8_N3aaa9GG32322233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32322233barEv,_ZThn20_N3aaa9GG32322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32322233barEv,_ZThn28_N3aaa9GG32322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32322233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32322233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32322233barEv,_ZThn8_N3aaa9GG32322233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322233barEv,_ZThn20_N3aaa9GG32322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32322233barEv,_ZThn28_N3aaa9GG32322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232223E[];
Class_Descriptor cd__ZN3aaa9GG3232223E = {  "_ZN3aaa9GG3232223E", // class name
  bases__ZN3aaa9GG3232223E, 6,
  &(vtc__ZN3aaa9GG3232223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232223E),13, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232231  : ::aaa::EE323 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32322313fooEv
  ~GG3232231(); // tgen
  GG3232231(); // tgen
};
//SIG(1 _ZN3aaa9GG3232231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32322313fooEv");}
aaa::GG3232231 ::~GG3232231(){ note_dtor("_ZN3aaa9GG3232231E", this);} // tgen
aaa::GG3232231 ::GG3232231(){ note_ctor("_ZN3aaa9GG3232231E", this);} // tgen
}
static void Test__ZN3aaa9GG3232231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232231E, buf);
    ::aaa::GG3232231 *dp, &lv = *(dp=new (buf) ::aaa::GG3232231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232231E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3232231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3232231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3232231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232231E);
    dp->::aaa::GG3232231::~GG3232231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232231E(Test__ZN3aaa9GG3232231E, "_ZN3aaa9GG3232231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232231C1Ev();
extern void _ZN3aaa9GG3232231D1Ev();
Name_Map name_map__ZN3aaa9GG3232231E[] = {
  NSPAIR(_ZN3aaa9GG3232231C1Ev),
  NSPAIR(_ZN3aaa9GG3232231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3232231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232231E[];
extern void _ZN3aaa9GG32322313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32322313fooEv,_ZThn20_N3aaa9GG32322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32322313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322313fooEv,_ZThn20_N3aaa9GG32322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232231E[];
Class_Descriptor cd__ZN3aaa9GG3232231E = {  "_ZN3aaa9GG3232231E", // class name
  bases__ZN3aaa9GG3232231E, 6,
  &(vtc__ZN3aaa9GG3232231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232232  : ::aaa::EE323 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32322323barEv
  ~GG3232232(); // tgen
  GG3232232(); // tgen
};
//SIG(1 _ZN3aaa9GG3232232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32322323barEv");}
aaa::GG3232232 ::~GG3232232(){ note_dtor("_ZN3aaa9GG3232232E", this);} // tgen
aaa::GG3232232 ::GG3232232(){ note_ctor("_ZN3aaa9GG3232232E", this);} // tgen
}
static void Test__ZN3aaa9GG3232232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232232E, buf);
    ::aaa::GG3232232 *dp, &lv = *(dp=new (buf) ::aaa::GG3232232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232232E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3232232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3232232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3232232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232232E);
    dp->::aaa::GG3232232::~GG3232232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232232E(Test__ZN3aaa9GG3232232E, "_ZN3aaa9GG3232232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232232C1Ev();
extern void _ZN3aaa9GG3232232D1Ev();
Name_Map name_map__ZN3aaa9GG3232232E[] = {
  NSPAIR(_ZN3aaa9GG3232232C1Ev),
  NSPAIR(_ZN3aaa9GG3232232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3232232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232232E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32322323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32322323barEv,_ZThn8_N3aaa9GG32322323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32322323barEv,_ZThn20_N3aaa9GG32322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32322323barEv,_ZThn28_N3aaa9GG32322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32322323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32322323barEv,_ZThn8_N3aaa9GG32322323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322323barEv,_ZThn20_N3aaa9GG32322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32322323barEv,_ZThn28_N3aaa9GG32322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232232E[];
Class_Descriptor cd__ZN3aaa9GG3232232E = {  "_ZN3aaa9GG3232232E", // class name
  bases__ZN3aaa9GG3232232E, 6,
  &(vtc__ZN3aaa9GG3232232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232233  : ::aaa::EE323 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32322333fooEv
  virtual void  bar(); // _ZN3aaa9GG32322333barEv
  ~GG3232233(); // tgen
  GG3232233(); // tgen
};
//SIG(1 _ZN3aaa9GG3232233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32322333fooEv");}
void  aaa::GG3232233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32322333barEv");}
aaa::GG3232233 ::~GG3232233(){ note_dtor("_ZN3aaa9GG3232233E", this);} // tgen
aaa::GG3232233 ::GG3232233(){ note_ctor("_ZN3aaa9GG3232233E", this);} // tgen
}
static void Test__ZN3aaa9GG3232233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232233E, buf);
    ::aaa::GG3232233 *dp, &lv = *(dp=new (buf) ::aaa::GG3232233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232233E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3232233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3232233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3232233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232233E);
    dp->::aaa::GG3232233::~GG3232233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232233E(Test__ZN3aaa9GG3232233E, "_ZN3aaa9GG3232233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232233C1Ev();
extern void _ZN3aaa9GG3232233D1Ev();
Name_Map name_map__ZN3aaa9GG3232233E[] = {
  NSPAIR(_ZN3aaa9GG3232233C1Ev),
  NSPAIR(_ZN3aaa9GG3232233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3232233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232233E[];
extern void _ZN3aaa9GG32322333fooEv();
extern void _ZN3aaa9GG32322333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32322333barEv,_ZThn8_N3aaa9GG32322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32322333barEv,_ZThn20_N3aaa9GG32322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32322333fooEv,_ZThn20_N3aaa9GG32322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32322333barEv,_ZThn28_N3aaa9GG32322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32322333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32322333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32322333barEv,_ZThn8_N3aaa9GG32322333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322333barEv,_ZThn20_N3aaa9GG32322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32322333fooEv,_ZThn20_N3aaa9GG32322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32322333barEv,_ZThn28_N3aaa9GG32322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232233E[];
Class_Descriptor cd__ZN3aaa9GG3232233E = {  "_ZN3aaa9GG3232233E", // class name
  bases__ZN3aaa9GG3232233E, 6,
  &(vtc__ZN3aaa9GG3232233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232311  : ::aaa::EE323 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32323113fooEv
  ~GG3232311(); // tgen
  GG3232311(); // tgen
};
//SIG(1 _ZN3aaa9GG3232311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32323113fooEv");}
aaa::GG3232311 ::~GG3232311(){ note_dtor("_ZN3aaa9GG3232311E", this);} // tgen
aaa::GG3232311 ::GG3232311(){ note_ctor("_ZN3aaa9GG3232311E", this);} // tgen
}
static void Test__ZN3aaa9GG3232311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232311E, buf);
    ::aaa::GG3232311 *dp, &lv = *(dp=new (buf) ::aaa::GG3232311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232311E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3232311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3232311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3232311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232311E);
    dp->::aaa::GG3232311::~GG3232311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232311E(Test__ZN3aaa9GG3232311E, "_ZN3aaa9GG3232311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232311C1Ev();
extern void _ZN3aaa9GG3232311D1Ev();
Name_Map name_map__ZN3aaa9GG3232311E[] = {
  NSPAIR(_ZN3aaa9GG3232311C1Ev),
  NSPAIR(_ZN3aaa9GG3232311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3232311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232311E[];
extern void _ZN3aaa9GG32323113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32323113fooEv,_ZThn20_N3aaa9GG32323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323113fooEv,_ZThn28_N3aaa9GG32323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32323113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323113fooEv,_ZThn20_N3aaa9GG32323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323113fooEv,_ZThn28_N3aaa9GG32323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232311E[];
Class_Descriptor cd__ZN3aaa9GG3232311E = {  "_ZN3aaa9GG3232311E", // class name
  bases__ZN3aaa9GG3232311E, 6,
  &(vtc__ZN3aaa9GG3232311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232312  : ::aaa::EE323 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32323123barEv
  ~GG3232312(); // tgen
  GG3232312(); // tgen
};
//SIG(1 _ZN3aaa9GG3232312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32323123barEv");}
aaa::GG3232312 ::~GG3232312(){ note_dtor("_ZN3aaa9GG3232312E", this);} // tgen
aaa::GG3232312 ::GG3232312(){ note_ctor("_ZN3aaa9GG3232312E", this);} // tgen
}
static void Test__ZN3aaa9GG3232312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232312E, buf);
    ::aaa::GG3232312 *dp, &lv = *(dp=new (buf) ::aaa::GG3232312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232312E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3232312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3232312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3232312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232312E);
    dp->::aaa::GG3232312::~GG3232312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232312E(Test__ZN3aaa9GG3232312E, "_ZN3aaa9GG3232312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232312C1Ev();
extern void _ZN3aaa9GG3232312D1Ev();
Name_Map name_map__ZN3aaa9GG3232312E[] = {
  NSPAIR(_ZN3aaa9GG3232312C1Ev),
  NSPAIR(_ZN3aaa9GG3232312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3232312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232312E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32323123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32323123barEv,_ZThn8_N3aaa9GG32323123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32323123barEv,_ZThn20_N3aaa9GG32323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323123barEv,_ZThn28_N3aaa9GG32323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32323123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32323123barEv,_ZThn8_N3aaa9GG32323123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323123barEv,_ZThn20_N3aaa9GG32323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323123barEv,_ZThn28_N3aaa9GG32323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232312E[];
Class_Descriptor cd__ZN3aaa9GG3232312E = {  "_ZN3aaa9GG3232312E", // class name
  bases__ZN3aaa9GG3232312E, 6,
  &(vtc__ZN3aaa9GG3232312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232313  : ::aaa::EE323 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32323133fooEv
  virtual void  bar(); // _ZN3aaa9GG32323133barEv
  ~GG3232313(); // tgen
  GG3232313(); // tgen
};
//SIG(1 _ZN3aaa9GG3232313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32323133fooEv");}
void  aaa::GG3232313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32323133barEv");}
aaa::GG3232313 ::~GG3232313(){ note_dtor("_ZN3aaa9GG3232313E", this);} // tgen
aaa::GG3232313 ::GG3232313(){ note_ctor("_ZN3aaa9GG3232313E", this);} // tgen
}
static void Test__ZN3aaa9GG3232313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232313E, buf);
    ::aaa::GG3232313 *dp, &lv = *(dp=new (buf) ::aaa::GG3232313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232313E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3232313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3232313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3232313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232313E);
    dp->::aaa::GG3232313::~GG3232313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232313E(Test__ZN3aaa9GG3232313E, "_ZN3aaa9GG3232313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232313C1Ev();
extern void _ZN3aaa9GG3232313D1Ev();
Name_Map name_map__ZN3aaa9GG3232313E[] = {
  NSPAIR(_ZN3aaa9GG3232313C1Ev),
  NSPAIR(_ZN3aaa9GG3232313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3232313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232313E[];
extern void _ZN3aaa9GG32323133fooEv();
extern void _ZN3aaa9GG32323133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32323133barEv,_ZThn8_N3aaa9GG32323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32323133barEv,_ZThn20_N3aaa9GG32323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32323133fooEv,_ZThn20_N3aaa9GG32323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323133fooEv,_ZThn28_N3aaa9GG32323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323133barEv,_ZThn28_N3aaa9GG32323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32323133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32323133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32323133barEv,_ZThn8_N3aaa9GG32323133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323133barEv,_ZThn20_N3aaa9GG32323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323133fooEv,_ZThn20_N3aaa9GG32323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323133fooEv,_ZThn28_N3aaa9GG32323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323133barEv,_ZThn28_N3aaa9GG32323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232313E[];
Class_Descriptor cd__ZN3aaa9GG3232313E = {  "_ZN3aaa9GG3232313E", // class name
  bases__ZN3aaa9GG3232313E, 6,
  &(vtc__ZN3aaa9GG3232313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232321  : ::aaa::EE323 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32323213fooEv
  ~GG3232321(); // tgen
  GG3232321(); // tgen
};
//SIG(1 _ZN3aaa9GG3232321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32323213fooEv");}
aaa::GG3232321 ::~GG3232321(){ note_dtor("_ZN3aaa9GG3232321E", this);} // tgen
aaa::GG3232321 ::GG3232321(){ note_ctor("_ZN3aaa9GG3232321E", this);} // tgen
}
static void Test__ZN3aaa9GG3232321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232321E, buf);
    ::aaa::GG3232321 *dp, &lv = *(dp=new (buf) ::aaa::GG3232321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232321E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3232321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3232321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3232321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232321E);
    dp->::aaa::GG3232321::~GG3232321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232321E(Test__ZN3aaa9GG3232321E, "_ZN3aaa9GG3232321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232321C1Ev();
extern void _ZN3aaa9GG3232321D1Ev();
Name_Map name_map__ZN3aaa9GG3232321E[] = {
  NSPAIR(_ZN3aaa9GG3232321C1Ev),
  NSPAIR(_ZN3aaa9GG3232321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3232321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232321E[];
extern void _ZN3aaa9GG32323213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32323213fooEv,_ZThn28_N3aaa9GG32323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32323213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323213fooEv,_ZThn28_N3aaa9GG32323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232321E[];
Class_Descriptor cd__ZN3aaa9GG3232321E = {  "_ZN3aaa9GG3232321E", // class name
  bases__ZN3aaa9GG3232321E, 6,
  &(vtc__ZN3aaa9GG3232321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232321E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232322  : ::aaa::EE323 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32323223barEv
  ~GG3232322(); // tgen
  GG3232322(); // tgen
};
//SIG(1 _ZN3aaa9GG3232322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32323223barEv");}
aaa::GG3232322 ::~GG3232322(){ note_dtor("_ZN3aaa9GG3232322E", this);} // tgen
aaa::GG3232322 ::GG3232322(){ note_ctor("_ZN3aaa9GG3232322E", this);} // tgen
}
static void Test__ZN3aaa9GG3232322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232322E, buf);
    ::aaa::GG3232322 *dp, &lv = *(dp=new (buf) ::aaa::GG3232322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232322E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3232322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3232322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3232322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232322E);
    dp->::aaa::GG3232322::~GG3232322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232322E(Test__ZN3aaa9GG3232322E, "_ZN3aaa9GG3232322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232322C1Ev();
extern void _ZN3aaa9GG3232322D1Ev();
Name_Map name_map__ZN3aaa9GG3232322E[] = {
  NSPAIR(_ZN3aaa9GG3232322C1Ev),
  NSPAIR(_ZN3aaa9GG3232322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3232322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232322E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32323223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32323223barEv,_ZThn8_N3aaa9GG32323223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32323223barEv,_ZThn20_N3aaa9GG32323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32323223barEv,_ZThn28_N3aaa9GG32323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32323223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32323223barEv,_ZThn8_N3aaa9GG32323223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323223barEv,_ZThn20_N3aaa9GG32323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323223barEv,_ZThn28_N3aaa9GG32323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232322E[];
Class_Descriptor cd__ZN3aaa9GG3232322E = {  "_ZN3aaa9GG3232322E", // class name
  bases__ZN3aaa9GG3232322E, 6,
  &(vtc__ZN3aaa9GG3232322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232322E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232323  : ::aaa::EE323 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32323233fooEv
  virtual void  bar(); // _ZN3aaa9GG32323233barEv
  ~GG3232323(); // tgen
  GG3232323(); // tgen
};
//SIG(1 _ZN3aaa9GG3232323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32323233fooEv");}
void  aaa::GG3232323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32323233barEv");}
aaa::GG3232323 ::~GG3232323(){ note_dtor("_ZN3aaa9GG3232323E", this);} // tgen
aaa::GG3232323 ::GG3232323(){ note_ctor("_ZN3aaa9GG3232323E", this);} // tgen
}
static void Test__ZN3aaa9GG3232323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232323E, buf);
    ::aaa::GG3232323 *dp, &lv = *(dp=new (buf) ::aaa::GG3232323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232323E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3232323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3232323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3232323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232323E);
    dp->::aaa::GG3232323::~GG3232323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232323E(Test__ZN3aaa9GG3232323E, "_ZN3aaa9GG3232323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232323C1Ev();
extern void _ZN3aaa9GG3232323D1Ev();
Name_Map name_map__ZN3aaa9GG3232323E[] = {
  NSPAIR(_ZN3aaa9GG3232323C1Ev),
  NSPAIR(_ZN3aaa9GG3232323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3232323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232323E[];
extern void _ZN3aaa9GG32323233fooEv();
extern void _ZN3aaa9GG32323233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32323233barEv,_ZThn8_N3aaa9GG32323233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32323233barEv,_ZThn20_N3aaa9GG32323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323233fooEv,_ZThn28_N3aaa9GG32323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323233barEv,_ZThn28_N3aaa9GG32323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32323233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32323233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32323233barEv,_ZThn8_N3aaa9GG32323233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323233barEv,_ZThn20_N3aaa9GG32323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323233fooEv,_ZThn28_N3aaa9GG32323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323233barEv,_ZThn28_N3aaa9GG32323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232323E[];
Class_Descriptor cd__ZN3aaa9GG3232323E = {  "_ZN3aaa9GG3232323E", // class name
  bases__ZN3aaa9GG3232323E, 6,
  &(vtc__ZN3aaa9GG3232323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232323E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232331  : ::aaa::EE323 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32323313fooEv
  ~GG3232331(); // tgen
  GG3232331(); // tgen
};
//SIG(1 _ZN3aaa9GG3232331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32323313fooEv");}
aaa::GG3232331 ::~GG3232331(){ note_dtor("_ZN3aaa9GG3232331E", this);} // tgen
aaa::GG3232331 ::GG3232331(){ note_ctor("_ZN3aaa9GG3232331E", this);} // tgen
}
static void Test__ZN3aaa9GG3232331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232331E, buf);
    ::aaa::GG3232331 *dp, &lv = *(dp=new (buf) ::aaa::GG3232331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232331E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3232331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3232331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3232331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232331E);
    dp->::aaa::GG3232331::~GG3232331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232331E(Test__ZN3aaa9GG3232331E, "_ZN3aaa9GG3232331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232331C1Ev();
extern void _ZN3aaa9GG3232331D1Ev();
Name_Map name_map__ZN3aaa9GG3232331E[] = {
  NSPAIR(_ZN3aaa9GG3232331C1Ev),
  NSPAIR(_ZN3aaa9GG3232331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3232331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232331E[];
extern void _ZN3aaa9GG32323313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32323313fooEv,_ZThn20_N3aaa9GG32323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323313fooEv,_ZThn28_N3aaa9GG32323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32323313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323313fooEv,_ZThn20_N3aaa9GG32323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323313fooEv,_ZThn28_N3aaa9GG32323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232331E[];
Class_Descriptor cd__ZN3aaa9GG3232331E = {  "_ZN3aaa9GG3232331E", // class name
  bases__ZN3aaa9GG3232331E, 6,
  &(vtc__ZN3aaa9GG3232331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232332  : ::aaa::EE323 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32323323barEv
  ~GG3232332(); // tgen
  GG3232332(); // tgen
};
//SIG(1 _ZN3aaa9GG3232332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3232332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32323323barEv");}
aaa::GG3232332 ::~GG3232332(){ note_dtor("_ZN3aaa9GG3232332E", this);} // tgen
aaa::GG3232332 ::GG3232332(){ note_ctor("_ZN3aaa9GG3232332E", this);} // tgen
}
static void Test__ZN3aaa9GG3232332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232332E, buf);
    ::aaa::GG3232332 *dp, &lv = *(dp=new (buf) ::aaa::GG3232332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232332E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3232332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3232332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3232332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232332E);
    dp->::aaa::GG3232332::~GG3232332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232332E(Test__ZN3aaa9GG3232332E, "_ZN3aaa9GG3232332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232332C1Ev();
extern void _ZN3aaa9GG3232332D1Ev();
Name_Map name_map__ZN3aaa9GG3232332E[] = {
  NSPAIR(_ZN3aaa9GG3232332C1Ev),
  NSPAIR(_ZN3aaa9GG3232332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3232332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232332E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32323323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32323323barEv,_ZThn8_N3aaa9GG32323323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32323323barEv,_ZThn20_N3aaa9GG32323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323323barEv,_ZThn28_N3aaa9GG32323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32323323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32323323barEv,_ZThn8_N3aaa9GG32323323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323323barEv,_ZThn20_N3aaa9GG32323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323323barEv,_ZThn28_N3aaa9GG32323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232332E[];
Class_Descriptor cd__ZN3aaa9GG3232332E = {  "_ZN3aaa9GG3232332E", // class name
  bases__ZN3aaa9GG3232332E, 6,
  &(vtc__ZN3aaa9GG3232332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3232333  : ::aaa::EE323 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32323333fooEv
  virtual void  bar(); // _ZN3aaa9GG32323333barEv
  ~GG3232333(); // tgen
  GG3232333(); // tgen
};
//SIG(1 _ZN3aaa9GG3232333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3232333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32323333fooEv");}
void  aaa::GG3232333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32323333barEv");}
aaa::GG3232333 ::~GG3232333(){ note_dtor("_ZN3aaa9GG3232333E", this);} // tgen
aaa::GG3232333 ::GG3232333(){ note_ctor("_ZN3aaa9GG3232333E", this);} // tgen
}
static void Test__ZN3aaa9GG3232333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3232333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3232333E, buf);
    ::aaa::GG3232333 *dp, &lv = *(dp=new (buf) ::aaa::GG3232333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3232333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3232333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3232333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3232333E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3232333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3232333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3232333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3232333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3232333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3232333E);
    dp->::aaa::GG3232333::~GG3232333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3232333E(Test__ZN3aaa9GG3232333E, "_ZN3aaa9GG3232333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3232333C1Ev();
extern void _ZN3aaa9GG3232333D1Ev();
Name_Map name_map__ZN3aaa9GG3232333E[] = {
  NSPAIR(_ZN3aaa9GG3232333C1Ev),
  NSPAIR(_ZN3aaa9GG3232333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3232333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3232333E[];
extern void _ZN3aaa9GG32323333fooEv();
extern void _ZN3aaa9GG32323333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32323333barEv,_ZThn8_N3aaa9GG32323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32323333barEv,_ZThn20_N3aaa9GG32323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32323333fooEv,_ZThn20_N3aaa9GG32323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323333fooEv,_ZThn28_N3aaa9GG32323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32323333barEv,_ZThn28_N3aaa9GG32323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3232333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32323333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32323333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32323333barEv,_ZThn8_N3aaa9GG32323333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323333barEv,_ZThn20_N3aaa9GG32323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32323333fooEv,_ZThn20_N3aaa9GG32323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3232333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323333fooEv,_ZThn28_N3aaa9GG32323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32323333barEv,_ZThn28_N3aaa9GG32323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3232333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3232333E[];
Class_Descriptor cd__ZN3aaa9GG3232333E = {  "_ZN3aaa9GG3232333E", // class name
  bases__ZN3aaa9GG3232333E, 6,
  &(vtc__ZN3aaa9GG3232333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3232333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3232333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233111  : ::aaa::EE323 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32331113fooEv
  ~GG3233111(); // tgen
  GG3233111(); // tgen
};
//SIG(1 _ZN3aaa9GG3233111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233111 ::foo(){vfunc_called(this, "_ZN3aaa9GG32331113fooEv");}
aaa::GG3233111 ::~GG3233111(){ note_dtor("_ZN3aaa9GG3233111E", this);} // tgen
aaa::GG3233111 ::GG3233111(){ note_ctor("_ZN3aaa9GG3233111E", this);} // tgen
}
static void Test__ZN3aaa9GG3233111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233111E, buf);
    ::aaa::GG3233111 *dp, &lv = *(dp=new (buf) ::aaa::GG3233111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233111E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233111E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3233111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3233111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3233111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233111E);
    dp->::aaa::GG3233111::~GG3233111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233111E(Test__ZN3aaa9GG3233111E, "_ZN3aaa9GG3233111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233111C1Ev();
extern void _ZN3aaa9GG3233111D1Ev();
Name_Map name_map__ZN3aaa9GG3233111E[] = {
  NSPAIR(_ZN3aaa9GG3233111C1Ev),
  NSPAIR(_ZN3aaa9GG3233111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3233111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233111E[];
extern void _ZN3aaa9GG32331113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331113fooEv,_ZThn20_N3aaa9GG32331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32331113fooEv,_ZThn28_N3aaa9GG32331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32331113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331113fooEv,_ZThn20_N3aaa9GG32331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32331113fooEv,_ZThn28_N3aaa9GG32331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233111E[];
Class_Descriptor cd__ZN3aaa9GG3233111E = {  "_ZN3aaa9GG3233111E", // class name
  bases__ZN3aaa9GG3233111E, 6,
  &(vtc__ZN3aaa9GG3233111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233112  : ::aaa::EE323 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32331123barEv
  ~GG3233112(); // tgen
  GG3233112(); // tgen
};
//SIG(1 _ZN3aaa9GG3233112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233112 ::bar(){vfunc_called(this, "_ZN3aaa9GG32331123barEv");}
aaa::GG3233112 ::~GG3233112(){ note_dtor("_ZN3aaa9GG3233112E", this);} // tgen
aaa::GG3233112 ::GG3233112(){ note_ctor("_ZN3aaa9GG3233112E", this);} // tgen
}
static void Test__ZN3aaa9GG3233112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233112E, buf);
    ::aaa::GG3233112 *dp, &lv = *(dp=new (buf) ::aaa::GG3233112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233112E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233112E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3233112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3233112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3233112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233112E);
    dp->::aaa::GG3233112::~GG3233112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233112E(Test__ZN3aaa9GG3233112E, "_ZN3aaa9GG3233112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233112C1Ev();
extern void _ZN3aaa9GG3233112D1Ev();
Name_Map name_map__ZN3aaa9GG3233112E[] = {
  NSPAIR(_ZN3aaa9GG3233112C1Ev),
  NSPAIR(_ZN3aaa9GG3233112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3233112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233112E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32331123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32331123barEv,_ZThn8_N3aaa9GG32331123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32331123barEv,_ZThn20_N3aaa9GG32331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32331123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32331123barEv,_ZThn8_N3aaa9GG32331123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331123barEv,_ZThn20_N3aaa9GG32331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233112E[];
Class_Descriptor cd__ZN3aaa9GG3233112E = {  "_ZN3aaa9GG3233112E", // class name
  bases__ZN3aaa9GG3233112E, 6,
  &(vtc__ZN3aaa9GG3233112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233113  : ::aaa::EE323 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32331133fooEv
  virtual void  bar(); // _ZN3aaa9GG32331133barEv
  ~GG3233113(); // tgen
  GG3233113(); // tgen
};
//SIG(1 _ZN3aaa9GG3233113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233113 ::foo(){vfunc_called(this, "_ZN3aaa9GG32331133fooEv");}
void  aaa::GG3233113 ::bar(){vfunc_called(this, "_ZN3aaa9GG32331133barEv");}
aaa::GG3233113 ::~GG3233113(){ note_dtor("_ZN3aaa9GG3233113E", this);} // tgen
aaa::GG3233113 ::GG3233113(){ note_ctor("_ZN3aaa9GG3233113E", this);} // tgen
}
static void Test__ZN3aaa9GG3233113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233113E, buf);
    ::aaa::GG3233113 *dp, &lv = *(dp=new (buf) ::aaa::GG3233113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233113E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233113E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3233113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3233113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3233113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233113E);
    dp->::aaa::GG3233113::~GG3233113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233113E(Test__ZN3aaa9GG3233113E, "_ZN3aaa9GG3233113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233113C1Ev();
extern void _ZN3aaa9GG3233113D1Ev();
Name_Map name_map__ZN3aaa9GG3233113E[] = {
  NSPAIR(_ZN3aaa9GG3233113C1Ev),
  NSPAIR(_ZN3aaa9GG3233113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3233113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233113E[];
extern void _ZN3aaa9GG32331133fooEv();
extern void _ZN3aaa9GG32331133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32331133barEv,_ZThn8_N3aaa9GG32331133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331133fooEv,_ZThn20_N3aaa9GG32331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331133barEv,_ZThn20_N3aaa9GG32331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32331133fooEv,_ZThn28_N3aaa9GG32331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32331133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32331133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32331133barEv,_ZThn8_N3aaa9GG32331133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331133fooEv,_ZThn20_N3aaa9GG32331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331133barEv,_ZThn20_N3aaa9GG32331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32331133fooEv,_ZThn28_N3aaa9GG32331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233113E[];
Class_Descriptor cd__ZN3aaa9GG3233113E = {  "_ZN3aaa9GG3233113E", // class name
  bases__ZN3aaa9GG3233113E, 6,
  &(vtc__ZN3aaa9GG3233113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233121  : ::aaa::EE323 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32331213fooEv
  ~GG3233121(); // tgen
  GG3233121(); // tgen
};
//SIG(1 _ZN3aaa9GG3233121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233121 ::foo(){vfunc_called(this, "_ZN3aaa9GG32331213fooEv");}
aaa::GG3233121 ::~GG3233121(){ note_dtor("_ZN3aaa9GG3233121E", this);} // tgen
aaa::GG3233121 ::GG3233121(){ note_ctor("_ZN3aaa9GG3233121E", this);} // tgen
}
static void Test__ZN3aaa9GG3233121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233121E, buf);
    ::aaa::GG3233121 *dp, &lv = *(dp=new (buf) ::aaa::GG3233121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233121E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233121E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3233121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3233121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3233121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233121E);
    dp->::aaa::GG3233121::~GG3233121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233121E(Test__ZN3aaa9GG3233121E, "_ZN3aaa9GG3233121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233121C1Ev();
extern void _ZN3aaa9GG3233121D1Ev();
Name_Map name_map__ZN3aaa9GG3233121E[] = {
  NSPAIR(_ZN3aaa9GG3233121C1Ev),
  NSPAIR(_ZN3aaa9GG3233121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3233121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233121E[];
extern void _ZN3aaa9GG32331213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331213fooEv,_ZThn20_N3aaa9GG32331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32331213fooEv,_ZThn28_N3aaa9GG32331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32331213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331213fooEv,_ZThn20_N3aaa9GG32331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32331213fooEv,_ZThn28_N3aaa9GG32331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233121E[];
Class_Descriptor cd__ZN3aaa9GG3233121E = {  "_ZN3aaa9GG3233121E", // class name
  bases__ZN3aaa9GG3233121E, 6,
  &(vtc__ZN3aaa9GG3233121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233122  : ::aaa::EE323 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32331223barEv
  ~GG3233122(); // tgen
  GG3233122(); // tgen
};
//SIG(1 _ZN3aaa9GG3233122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233122 ::bar(){vfunc_called(this, "_ZN3aaa9GG32331223barEv");}
aaa::GG3233122 ::~GG3233122(){ note_dtor("_ZN3aaa9GG3233122E", this);} // tgen
aaa::GG3233122 ::GG3233122(){ note_ctor("_ZN3aaa9GG3233122E", this);} // tgen
}
static void Test__ZN3aaa9GG3233122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233122E, buf);
    ::aaa::GG3233122 *dp, &lv = *(dp=new (buf) ::aaa::GG3233122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233122E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233122E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3233122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3233122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3233122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233122E);
    dp->::aaa::GG3233122::~GG3233122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233122E(Test__ZN3aaa9GG3233122E, "_ZN3aaa9GG3233122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233122C1Ev();
extern void _ZN3aaa9GG3233122D1Ev();
Name_Map name_map__ZN3aaa9GG3233122E[] = {
  NSPAIR(_ZN3aaa9GG3233122C1Ev),
  NSPAIR(_ZN3aaa9GG3233122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3233122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233122E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32331223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32331223barEv,_ZThn8_N3aaa9GG32331223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32331223barEv,_ZThn20_N3aaa9GG32331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32331223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32331223barEv,_ZThn8_N3aaa9GG32331223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331223barEv,_ZThn20_N3aaa9GG32331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233122E[];
Class_Descriptor cd__ZN3aaa9GG3233122E = {  "_ZN3aaa9GG3233122E", // class name
  bases__ZN3aaa9GG3233122E, 6,
  &(vtc__ZN3aaa9GG3233122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233123  : ::aaa::EE323 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32331233fooEv
  virtual void  bar(); // _ZN3aaa9GG32331233barEv
  ~GG3233123(); // tgen
  GG3233123(); // tgen
};
//SIG(1 _ZN3aaa9GG3233123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233123 ::foo(){vfunc_called(this, "_ZN3aaa9GG32331233fooEv");}
void  aaa::GG3233123 ::bar(){vfunc_called(this, "_ZN3aaa9GG32331233barEv");}
aaa::GG3233123 ::~GG3233123(){ note_dtor("_ZN3aaa9GG3233123E", this);} // tgen
aaa::GG3233123 ::GG3233123(){ note_ctor("_ZN3aaa9GG3233123E", this);} // tgen
}
static void Test__ZN3aaa9GG3233123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233123E, buf);
    ::aaa::GG3233123 *dp, &lv = *(dp=new (buf) ::aaa::GG3233123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233123E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233123E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3233123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3233123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3233123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233123E);
    dp->::aaa::GG3233123::~GG3233123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233123E(Test__ZN3aaa9GG3233123E, "_ZN3aaa9GG3233123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233123C1Ev();
extern void _ZN3aaa9GG3233123D1Ev();
Name_Map name_map__ZN3aaa9GG3233123E[] = {
  NSPAIR(_ZN3aaa9GG3233123C1Ev),
  NSPAIR(_ZN3aaa9GG3233123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3233123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233123E[];
extern void _ZN3aaa9GG32331233fooEv();
extern void _ZN3aaa9GG32331233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32331233barEv,_ZThn8_N3aaa9GG32331233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331233fooEv,_ZThn20_N3aaa9GG32331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331233barEv,_ZThn20_N3aaa9GG32331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32331233fooEv,_ZThn28_N3aaa9GG32331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32331233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32331233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32331233barEv,_ZThn8_N3aaa9GG32331233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331233fooEv,_ZThn20_N3aaa9GG32331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331233barEv,_ZThn20_N3aaa9GG32331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32331233fooEv,_ZThn28_N3aaa9GG32331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233123E[];
Class_Descriptor cd__ZN3aaa9GG3233123E = {  "_ZN3aaa9GG3233123E", // class name
  bases__ZN3aaa9GG3233123E, 6,
  &(vtc__ZN3aaa9GG3233123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233131  : ::aaa::EE323 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32331313fooEv
  ~GG3233131(); // tgen
  GG3233131(); // tgen
};
//SIG(1 _ZN3aaa9GG3233131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233131 ::foo(){vfunc_called(this, "_ZN3aaa9GG32331313fooEv");}
aaa::GG3233131 ::~GG3233131(){ note_dtor("_ZN3aaa9GG3233131E", this);} // tgen
aaa::GG3233131 ::GG3233131(){ note_ctor("_ZN3aaa9GG3233131E", this);} // tgen
}
static void Test__ZN3aaa9GG3233131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233131E, buf);
    ::aaa::GG3233131 *dp, &lv = *(dp=new (buf) ::aaa::GG3233131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233131E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233131E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3233131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3233131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3233131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233131E);
    dp->::aaa::GG3233131::~GG3233131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233131E(Test__ZN3aaa9GG3233131E, "_ZN3aaa9GG3233131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233131C1Ev();
extern void _ZN3aaa9GG3233131D1Ev();
Name_Map name_map__ZN3aaa9GG3233131E[] = {
  NSPAIR(_ZN3aaa9GG3233131C1Ev),
  NSPAIR(_ZN3aaa9GG3233131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3233131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233131E[];
extern void _ZN3aaa9GG32331313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331313fooEv,_ZThn20_N3aaa9GG32331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32331313fooEv,_ZThn28_N3aaa9GG32331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32331313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331313fooEv,_ZThn20_N3aaa9GG32331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32331313fooEv,_ZThn28_N3aaa9GG32331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233131E[];
Class_Descriptor cd__ZN3aaa9GG3233131E = {  "_ZN3aaa9GG3233131E", // class name
  bases__ZN3aaa9GG3233131E, 6,
  &(vtc__ZN3aaa9GG3233131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233131E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233132  : ::aaa::EE323 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32331323barEv
  ~GG3233132(); // tgen
  GG3233132(); // tgen
};
//SIG(1 _ZN3aaa9GG3233132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233132 ::bar(){vfunc_called(this, "_ZN3aaa9GG32331323barEv");}
aaa::GG3233132 ::~GG3233132(){ note_dtor("_ZN3aaa9GG3233132E", this);} // tgen
aaa::GG3233132 ::GG3233132(){ note_ctor("_ZN3aaa9GG3233132E", this);} // tgen
}
static void Test__ZN3aaa9GG3233132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233132E, buf);
    ::aaa::GG3233132 *dp, &lv = *(dp=new (buf) ::aaa::GG3233132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233132E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233132E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3233132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3233132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3233132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233132E);
    dp->::aaa::GG3233132::~GG3233132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233132E(Test__ZN3aaa9GG3233132E, "_ZN3aaa9GG3233132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233132C1Ev();
extern void _ZN3aaa9GG3233132D1Ev();
Name_Map name_map__ZN3aaa9GG3233132E[] = {
  NSPAIR(_ZN3aaa9GG3233132C1Ev),
  NSPAIR(_ZN3aaa9GG3233132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3233132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233132E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32331323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32331323barEv,_ZThn8_N3aaa9GG32331323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32331323barEv,_ZThn20_N3aaa9GG32331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32331323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32331323barEv,_ZThn8_N3aaa9GG32331323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331323barEv,_ZThn20_N3aaa9GG32331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233132E[];
Class_Descriptor cd__ZN3aaa9GG3233132E = {  "_ZN3aaa9GG3233132E", // class name
  bases__ZN3aaa9GG3233132E, 6,
  &(vtc__ZN3aaa9GG3233132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233132E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233133  : ::aaa::EE323 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32331333fooEv
  virtual void  bar(); // _ZN3aaa9GG32331333barEv
  ~GG3233133(); // tgen
  GG3233133(); // tgen
};
//SIG(1 _ZN3aaa9GG3233133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233133 ::foo(){vfunc_called(this, "_ZN3aaa9GG32331333fooEv");}
void  aaa::GG3233133 ::bar(){vfunc_called(this, "_ZN3aaa9GG32331333barEv");}
aaa::GG3233133 ::~GG3233133(){ note_dtor("_ZN3aaa9GG3233133E", this);} // tgen
aaa::GG3233133 ::GG3233133(){ note_ctor("_ZN3aaa9GG3233133E", this);} // tgen
}
static void Test__ZN3aaa9GG3233133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233133E, buf);
    ::aaa::GG3233133 *dp, &lv = *(dp=new (buf) ::aaa::GG3233133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233133E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233133E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3233133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3233133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3233133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233133E);
    dp->::aaa::GG3233133::~GG3233133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233133E(Test__ZN3aaa9GG3233133E, "_ZN3aaa9GG3233133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233133C1Ev();
extern void _ZN3aaa9GG3233133D1Ev();
Name_Map name_map__ZN3aaa9GG3233133E[] = {
  NSPAIR(_ZN3aaa9GG3233133C1Ev),
  NSPAIR(_ZN3aaa9GG3233133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3233133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233133E[];
extern void _ZN3aaa9GG32331333fooEv();
extern void _ZN3aaa9GG32331333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32331333barEv,_ZThn8_N3aaa9GG32331333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331333fooEv,_ZThn20_N3aaa9GG32331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32331333barEv,_ZThn20_N3aaa9GG32331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32331333fooEv,_ZThn28_N3aaa9GG32331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32331333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32331333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32331333barEv,_ZThn8_N3aaa9GG32331333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331333fooEv,_ZThn20_N3aaa9GG32331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32331333barEv,_ZThn20_N3aaa9GG32331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32331333fooEv,_ZThn28_N3aaa9GG32331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233133E[];
Class_Descriptor cd__ZN3aaa9GG3233133E = {  "_ZN3aaa9GG3233133E", // class name
  bases__ZN3aaa9GG3233133E, 6,
  &(vtc__ZN3aaa9GG3233133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233133E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233211  : ::aaa::EE323 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32332113fooEv
  ~GG3233211(); // tgen
  GG3233211(); // tgen
};
//SIG(1 _ZN3aaa9GG3233211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233211 ::foo(){vfunc_called(this, "_ZN3aaa9GG32332113fooEv");}
aaa::GG3233211 ::~GG3233211(){ note_dtor("_ZN3aaa9GG3233211E", this);} // tgen
aaa::GG3233211 ::GG3233211(){ note_ctor("_ZN3aaa9GG3233211E", this);} // tgen
}
static void Test__ZN3aaa9GG3233211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233211E, buf);
    ::aaa::GG3233211 *dp, &lv = *(dp=new (buf) ::aaa::GG3233211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233211E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3233211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3233211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3233211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233211E);
    dp->::aaa::GG3233211::~GG3233211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233211E(Test__ZN3aaa9GG3233211E, "_ZN3aaa9GG3233211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233211C1Ev();
extern void _ZN3aaa9GG3233211D1Ev();
Name_Map name_map__ZN3aaa9GG3233211E[] = {
  NSPAIR(_ZN3aaa9GG3233211C1Ev),
  NSPAIR(_ZN3aaa9GG3233211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3233211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233211E[];
extern void _ZN3aaa9GG32332113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332113fooEv,_ZThn20_N3aaa9GG32332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32332113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332113fooEv,_ZThn20_N3aaa9GG32332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233211E[];
Class_Descriptor cd__ZN3aaa9GG3233211E = {  "_ZN3aaa9GG3233211E", // class name
  bases__ZN3aaa9GG3233211E, 6,
  &(vtc__ZN3aaa9GG3233211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233212  : ::aaa::EE323 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32332123barEv
  ~GG3233212(); // tgen
  GG3233212(); // tgen
};
//SIG(1 _ZN3aaa9GG3233212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233212 ::bar(){vfunc_called(this, "_ZN3aaa9GG32332123barEv");}
aaa::GG3233212 ::~GG3233212(){ note_dtor("_ZN3aaa9GG3233212E", this);} // tgen
aaa::GG3233212 ::GG3233212(){ note_ctor("_ZN3aaa9GG3233212E", this);} // tgen
}
static void Test__ZN3aaa9GG3233212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233212E, buf);
    ::aaa::GG3233212 *dp, &lv = *(dp=new (buf) ::aaa::GG3233212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233212E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3233212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3233212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3233212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233212E);
    dp->::aaa::GG3233212::~GG3233212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233212E(Test__ZN3aaa9GG3233212E, "_ZN3aaa9GG3233212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233212C1Ev();
extern void _ZN3aaa9GG3233212D1Ev();
Name_Map name_map__ZN3aaa9GG3233212E[] = {
  NSPAIR(_ZN3aaa9GG3233212C1Ev),
  NSPAIR(_ZN3aaa9GG3233212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3233212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233212E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32332123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32332123barEv,_ZThn8_N3aaa9GG32332123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32332123barEv,_ZThn20_N3aaa9GG32332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32332123barEv,_ZThn28_N3aaa9GG32332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32332123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32332123barEv,_ZThn8_N3aaa9GG32332123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332123barEv,_ZThn20_N3aaa9GG32332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32332123barEv,_ZThn28_N3aaa9GG32332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233212E[];
Class_Descriptor cd__ZN3aaa9GG3233212E = {  "_ZN3aaa9GG3233212E", // class name
  bases__ZN3aaa9GG3233212E, 6,
  &(vtc__ZN3aaa9GG3233212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233213  : ::aaa::EE323 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32332133fooEv
  virtual void  bar(); // _ZN3aaa9GG32332133barEv
  ~GG3233213(); // tgen
  GG3233213(); // tgen
};
//SIG(1 _ZN3aaa9GG3233213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233213 ::foo(){vfunc_called(this, "_ZN3aaa9GG32332133fooEv");}
void  aaa::GG3233213 ::bar(){vfunc_called(this, "_ZN3aaa9GG32332133barEv");}
aaa::GG3233213 ::~GG3233213(){ note_dtor("_ZN3aaa9GG3233213E", this);} // tgen
aaa::GG3233213 ::GG3233213(){ note_ctor("_ZN3aaa9GG3233213E", this);} // tgen
}
static void Test__ZN3aaa9GG3233213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233213E, buf);
    ::aaa::GG3233213 *dp, &lv = *(dp=new (buf) ::aaa::GG3233213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233213E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3233213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3233213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3233213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233213E);
    dp->::aaa::GG3233213::~GG3233213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233213E(Test__ZN3aaa9GG3233213E, "_ZN3aaa9GG3233213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233213C1Ev();
extern void _ZN3aaa9GG3233213D1Ev();
Name_Map name_map__ZN3aaa9GG3233213E[] = {
  NSPAIR(_ZN3aaa9GG3233213C1Ev),
  NSPAIR(_ZN3aaa9GG3233213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3233213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233213E[];
extern void _ZN3aaa9GG32332133fooEv();
extern void _ZN3aaa9GG32332133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32332133barEv,_ZThn8_N3aaa9GG32332133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332133fooEv,_ZThn20_N3aaa9GG32332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332133barEv,_ZThn20_N3aaa9GG32332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32332133barEv,_ZThn28_N3aaa9GG32332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32332133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32332133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32332133barEv,_ZThn8_N3aaa9GG32332133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332133fooEv,_ZThn20_N3aaa9GG32332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332133barEv,_ZThn20_N3aaa9GG32332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32332133barEv,_ZThn28_N3aaa9GG32332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233213E[];
Class_Descriptor cd__ZN3aaa9GG3233213E = {  "_ZN3aaa9GG3233213E", // class name
  bases__ZN3aaa9GG3233213E, 6,
  &(vtc__ZN3aaa9GG3233213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233221  : ::aaa::EE323 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32332213fooEv
  ~GG3233221(); // tgen
  GG3233221(); // tgen
};
//SIG(1 _ZN3aaa9GG3233221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233221 ::foo(){vfunc_called(this, "_ZN3aaa9GG32332213fooEv");}
aaa::GG3233221 ::~GG3233221(){ note_dtor("_ZN3aaa9GG3233221E", this);} // tgen
aaa::GG3233221 ::GG3233221(){ note_ctor("_ZN3aaa9GG3233221E", this);} // tgen
}
static void Test__ZN3aaa9GG3233221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233221E, buf);
    ::aaa::GG3233221 *dp, &lv = *(dp=new (buf) ::aaa::GG3233221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233221E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3233221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3233221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3233221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233221E);
    dp->::aaa::GG3233221::~GG3233221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233221E(Test__ZN3aaa9GG3233221E, "_ZN3aaa9GG3233221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233221C1Ev();
extern void _ZN3aaa9GG3233221D1Ev();
Name_Map name_map__ZN3aaa9GG3233221E[] = {
  NSPAIR(_ZN3aaa9GG3233221C1Ev),
  NSPAIR(_ZN3aaa9GG3233221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3233221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233221E[];
extern void _ZN3aaa9GG32332213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332213fooEv,_ZThn20_N3aaa9GG32332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32332213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332213fooEv,_ZThn20_N3aaa9GG32332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233221E[];
Class_Descriptor cd__ZN3aaa9GG3233221E = {  "_ZN3aaa9GG3233221E", // class name
  bases__ZN3aaa9GG3233221E, 6,
  &(vtc__ZN3aaa9GG3233221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233222  : ::aaa::EE323 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32332223barEv
  ~GG3233222(); // tgen
  GG3233222(); // tgen
};
//SIG(1 _ZN3aaa9GG3233222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233222 ::bar(){vfunc_called(this, "_ZN3aaa9GG32332223barEv");}
aaa::GG3233222 ::~GG3233222(){ note_dtor("_ZN3aaa9GG3233222E", this);} // tgen
aaa::GG3233222 ::GG3233222(){ note_ctor("_ZN3aaa9GG3233222E", this);} // tgen
}
static void Test__ZN3aaa9GG3233222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233222E, buf);
    ::aaa::GG3233222 *dp, &lv = *(dp=new (buf) ::aaa::GG3233222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233222E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3233222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3233222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3233222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233222E);
    dp->::aaa::GG3233222::~GG3233222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233222E(Test__ZN3aaa9GG3233222E, "_ZN3aaa9GG3233222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233222C1Ev();
extern void _ZN3aaa9GG3233222D1Ev();
Name_Map name_map__ZN3aaa9GG3233222E[] = {
  NSPAIR(_ZN3aaa9GG3233222C1Ev),
  NSPAIR(_ZN3aaa9GG3233222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3233222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233222E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32332223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32332223barEv,_ZThn8_N3aaa9GG32332223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32332223barEv,_ZThn20_N3aaa9GG32332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32332223barEv,_ZThn28_N3aaa9GG32332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32332223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32332223barEv,_ZThn8_N3aaa9GG32332223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332223barEv,_ZThn20_N3aaa9GG32332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32332223barEv,_ZThn28_N3aaa9GG32332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233222E[];
Class_Descriptor cd__ZN3aaa9GG3233222E = {  "_ZN3aaa9GG3233222E", // class name
  bases__ZN3aaa9GG3233222E, 6,
  &(vtc__ZN3aaa9GG3233222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233223  : ::aaa::EE323 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32332233fooEv
  virtual void  bar(); // _ZN3aaa9GG32332233barEv
  ~GG3233223(); // tgen
  GG3233223(); // tgen
};
//SIG(1 _ZN3aaa9GG3233223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233223 ::foo(){vfunc_called(this, "_ZN3aaa9GG32332233fooEv");}
void  aaa::GG3233223 ::bar(){vfunc_called(this, "_ZN3aaa9GG32332233barEv");}
aaa::GG3233223 ::~GG3233223(){ note_dtor("_ZN3aaa9GG3233223E", this);} // tgen
aaa::GG3233223 ::GG3233223(){ note_ctor("_ZN3aaa9GG3233223E", this);} // tgen
}
static void Test__ZN3aaa9GG3233223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233223E, buf);
    ::aaa::GG3233223 *dp, &lv = *(dp=new (buf) ::aaa::GG3233223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233223E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3233223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3233223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3233223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233223E);
    dp->::aaa::GG3233223::~GG3233223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233223E(Test__ZN3aaa9GG3233223E, "_ZN3aaa9GG3233223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233223C1Ev();
extern void _ZN3aaa9GG3233223D1Ev();
Name_Map name_map__ZN3aaa9GG3233223E[] = {
  NSPAIR(_ZN3aaa9GG3233223C1Ev),
  NSPAIR(_ZN3aaa9GG3233223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3233223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233223E[];
extern void _ZN3aaa9GG32332233fooEv();
extern void _ZN3aaa9GG32332233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32332233barEv,_ZThn8_N3aaa9GG32332233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332233fooEv,_ZThn20_N3aaa9GG32332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332233barEv,_ZThn20_N3aaa9GG32332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32332233barEv,_ZThn28_N3aaa9GG32332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32332233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32332233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32332233barEv,_ZThn8_N3aaa9GG32332233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332233fooEv,_ZThn20_N3aaa9GG32332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332233barEv,_ZThn20_N3aaa9GG32332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32332233barEv,_ZThn28_N3aaa9GG32332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233223E[];
Class_Descriptor cd__ZN3aaa9GG3233223E = {  "_ZN3aaa9GG3233223E", // class name
  bases__ZN3aaa9GG3233223E, 6,
  &(vtc__ZN3aaa9GG3233223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233231  : ::aaa::EE323 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32332313fooEv
  ~GG3233231(); // tgen
  GG3233231(); // tgen
};
//SIG(1 _ZN3aaa9GG3233231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233231 ::foo(){vfunc_called(this, "_ZN3aaa9GG32332313fooEv");}
aaa::GG3233231 ::~GG3233231(){ note_dtor("_ZN3aaa9GG3233231E", this);} // tgen
aaa::GG3233231 ::GG3233231(){ note_ctor("_ZN3aaa9GG3233231E", this);} // tgen
}
static void Test__ZN3aaa9GG3233231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233231E, buf);
    ::aaa::GG3233231 *dp, &lv = *(dp=new (buf) ::aaa::GG3233231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233231E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3233231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3233231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3233231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233231E);
    dp->::aaa::GG3233231::~GG3233231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233231E(Test__ZN3aaa9GG3233231E, "_ZN3aaa9GG3233231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233231C1Ev();
extern void _ZN3aaa9GG3233231D1Ev();
Name_Map name_map__ZN3aaa9GG3233231E[] = {
  NSPAIR(_ZN3aaa9GG3233231C1Ev),
  NSPAIR(_ZN3aaa9GG3233231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3233231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233231E[];
extern void _ZN3aaa9GG32332313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332313fooEv,_ZThn20_N3aaa9GG32332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32332313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332313fooEv,_ZThn20_N3aaa9GG32332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233231E[];
Class_Descriptor cd__ZN3aaa9GG3233231E = {  "_ZN3aaa9GG3233231E", // class name
  bases__ZN3aaa9GG3233231E, 6,
  &(vtc__ZN3aaa9GG3233231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233231E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233232  : ::aaa::EE323 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32332323barEv
  ~GG3233232(); // tgen
  GG3233232(); // tgen
};
//SIG(1 _ZN3aaa9GG3233232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233232 ::bar(){vfunc_called(this, "_ZN3aaa9GG32332323barEv");}
aaa::GG3233232 ::~GG3233232(){ note_dtor("_ZN3aaa9GG3233232E", this);} // tgen
aaa::GG3233232 ::GG3233232(){ note_ctor("_ZN3aaa9GG3233232E", this);} // tgen
}
static void Test__ZN3aaa9GG3233232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233232E, buf);
    ::aaa::GG3233232 *dp, &lv = *(dp=new (buf) ::aaa::GG3233232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233232E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3233232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3233232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3233232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233232E);
    dp->::aaa::GG3233232::~GG3233232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233232E(Test__ZN3aaa9GG3233232E, "_ZN3aaa9GG3233232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233232C1Ev();
extern void _ZN3aaa9GG3233232D1Ev();
Name_Map name_map__ZN3aaa9GG3233232E[] = {
  NSPAIR(_ZN3aaa9GG3233232C1Ev),
  NSPAIR(_ZN3aaa9GG3233232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3233232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233232E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32332323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32332323barEv,_ZThn8_N3aaa9GG32332323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32332323barEv,_ZThn20_N3aaa9GG32332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32332323barEv,_ZThn28_N3aaa9GG32332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32332323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32332323barEv,_ZThn8_N3aaa9GG32332323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332323barEv,_ZThn20_N3aaa9GG32332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32332323barEv,_ZThn28_N3aaa9GG32332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233232E[];
Class_Descriptor cd__ZN3aaa9GG3233232E = {  "_ZN3aaa9GG3233232E", // class name
  bases__ZN3aaa9GG3233232E, 6,
  &(vtc__ZN3aaa9GG3233232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233232E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233233  : ::aaa::EE323 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32332333fooEv
  virtual void  bar(); // _ZN3aaa9GG32332333barEv
  ~GG3233233(); // tgen
  GG3233233(); // tgen
};
//SIG(1 _ZN3aaa9GG3233233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233233 ::foo(){vfunc_called(this, "_ZN3aaa9GG32332333fooEv");}
void  aaa::GG3233233 ::bar(){vfunc_called(this, "_ZN3aaa9GG32332333barEv");}
aaa::GG3233233 ::~GG3233233(){ note_dtor("_ZN3aaa9GG3233233E", this);} // tgen
aaa::GG3233233 ::GG3233233(){ note_ctor("_ZN3aaa9GG3233233E", this);} // tgen
}
static void Test__ZN3aaa9GG3233233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233233E, buf);
    ::aaa::GG3233233 *dp, &lv = *(dp=new (buf) ::aaa::GG3233233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233233E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3233233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3233233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3233233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233233E);
    dp->::aaa::GG3233233::~GG3233233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233233E(Test__ZN3aaa9GG3233233E, "_ZN3aaa9GG3233233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233233C1Ev();
extern void _ZN3aaa9GG3233233D1Ev();
Name_Map name_map__ZN3aaa9GG3233233E[] = {
  NSPAIR(_ZN3aaa9GG3233233C1Ev),
  NSPAIR(_ZN3aaa9GG3233233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3233233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233233E[];
extern void _ZN3aaa9GG32332333fooEv();
extern void _ZN3aaa9GG32332333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32332333barEv,_ZThn8_N3aaa9GG32332333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332333fooEv,_ZThn20_N3aaa9GG32332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32332333barEv,_ZThn20_N3aaa9GG32332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32332333barEv,_ZThn28_N3aaa9GG32332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32332333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32332333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32332333barEv,_ZThn8_N3aaa9GG32332333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332333fooEv,_ZThn20_N3aaa9GG32332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32332333barEv,_ZThn20_N3aaa9GG32332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32332333barEv,_ZThn28_N3aaa9GG32332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233233E[];
Class_Descriptor cd__ZN3aaa9GG3233233E = {  "_ZN3aaa9GG3233233E", // class name
  bases__ZN3aaa9GG3233233E, 6,
  &(vtc__ZN3aaa9GG3233233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233233E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233311  : ::aaa::EE323 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32333113fooEv
  ~GG3233311(); // tgen
  GG3233311(); // tgen
};
//SIG(1 _ZN3aaa9GG3233311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233311 ::foo(){vfunc_called(this, "_ZN3aaa9GG32333113fooEv");}
aaa::GG3233311 ::~GG3233311(){ note_dtor("_ZN3aaa9GG3233311E", this);} // tgen
aaa::GG3233311 ::GG3233311(){ note_ctor("_ZN3aaa9GG3233311E", this);} // tgen
}
static void Test__ZN3aaa9GG3233311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233311E, buf);
    ::aaa::GG3233311 *dp, &lv = *(dp=new (buf) ::aaa::GG3233311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233311E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233311E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3233311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3233311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3233311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233311E);
    dp->::aaa::GG3233311::~GG3233311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233311E(Test__ZN3aaa9GG3233311E, "_ZN3aaa9GG3233311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233311C1Ev();
extern void _ZN3aaa9GG3233311D1Ev();
Name_Map name_map__ZN3aaa9GG3233311E[] = {
  NSPAIR(_ZN3aaa9GG3233311C1Ev),
  NSPAIR(_ZN3aaa9GG3233311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3233311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233311E[];
extern void _ZN3aaa9GG32333113fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333113fooEv,_ZThn20_N3aaa9GG32333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32333113fooEv,_ZThn28_N3aaa9GG32333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32333113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333113fooEv,_ZThn20_N3aaa9GG32333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333113fooEv,_ZThn28_N3aaa9GG32333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233311E[];
Class_Descriptor cd__ZN3aaa9GG3233311E = {  "_ZN3aaa9GG3233311E", // class name
  bases__ZN3aaa9GG3233311E, 6,
  &(vtc__ZN3aaa9GG3233311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233312  : ::aaa::EE323 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32333123barEv
  ~GG3233312(); // tgen
  GG3233312(); // tgen
};
//SIG(1 _ZN3aaa9GG3233312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233312 ::bar(){vfunc_called(this, "_ZN3aaa9GG32333123barEv");}
aaa::GG3233312 ::~GG3233312(){ note_dtor("_ZN3aaa9GG3233312E", this);} // tgen
aaa::GG3233312 ::GG3233312(){ note_ctor("_ZN3aaa9GG3233312E", this);} // tgen
}
static void Test__ZN3aaa9GG3233312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233312E, buf);
    ::aaa::GG3233312 *dp, &lv = *(dp=new (buf) ::aaa::GG3233312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233312E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233312E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3233312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3233312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3233312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233312E);
    dp->::aaa::GG3233312::~GG3233312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233312E(Test__ZN3aaa9GG3233312E, "_ZN3aaa9GG3233312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233312C1Ev();
extern void _ZN3aaa9GG3233312D1Ev();
Name_Map name_map__ZN3aaa9GG3233312E[] = {
  NSPAIR(_ZN3aaa9GG3233312C1Ev),
  NSPAIR(_ZN3aaa9GG3233312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3233312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233312E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32333123barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32333123barEv,_ZThn8_N3aaa9GG32333123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32333123barEv,_ZThn20_N3aaa9GG32333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32333123barEv,_ZThn28_N3aaa9GG32333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32333123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32333123barEv,_ZThn8_N3aaa9GG32333123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333123barEv,_ZThn20_N3aaa9GG32333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333123barEv,_ZThn28_N3aaa9GG32333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233312E[];
Class_Descriptor cd__ZN3aaa9GG3233312E = {  "_ZN3aaa9GG3233312E", // class name
  bases__ZN3aaa9GG3233312E, 6,
  &(vtc__ZN3aaa9GG3233312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233313  : ::aaa::EE323 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32333133fooEv
  virtual void  bar(); // _ZN3aaa9GG32333133barEv
  ~GG3233313(); // tgen
  GG3233313(); // tgen
};
//SIG(1 _ZN3aaa9GG3233313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233313 ::foo(){vfunc_called(this, "_ZN3aaa9GG32333133fooEv");}
void  aaa::GG3233313 ::bar(){vfunc_called(this, "_ZN3aaa9GG32333133barEv");}
aaa::GG3233313 ::~GG3233313(){ note_dtor("_ZN3aaa9GG3233313E", this);} // tgen
aaa::GG3233313 ::GG3233313(){ note_ctor("_ZN3aaa9GG3233313E", this);} // tgen
}
static void Test__ZN3aaa9GG3233313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233313E, buf);
    ::aaa::GG3233313 *dp, &lv = *(dp=new (buf) ::aaa::GG3233313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233313E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233313E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3233313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3233313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3233313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233313E);
    dp->::aaa::GG3233313::~GG3233313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233313E(Test__ZN3aaa9GG3233313E, "_ZN3aaa9GG3233313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233313C1Ev();
extern void _ZN3aaa9GG3233313D1Ev();
Name_Map name_map__ZN3aaa9GG3233313E[] = {
  NSPAIR(_ZN3aaa9GG3233313C1Ev),
  NSPAIR(_ZN3aaa9GG3233313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3233313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233313E[];
extern void _ZN3aaa9GG32333133fooEv();
extern void _ZN3aaa9GG32333133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32333133barEv,_ZThn8_N3aaa9GG32333133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333133fooEv,_ZThn20_N3aaa9GG32333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333133barEv,_ZThn20_N3aaa9GG32333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32333133fooEv,_ZThn28_N3aaa9GG32333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32333133barEv,_ZThn28_N3aaa9GG32333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32333133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32333133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32333133barEv,_ZThn8_N3aaa9GG32333133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333133fooEv,_ZThn20_N3aaa9GG32333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333133barEv,_ZThn20_N3aaa9GG32333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333133fooEv,_ZThn28_N3aaa9GG32333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333133barEv,_ZThn28_N3aaa9GG32333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233313E[];
Class_Descriptor cd__ZN3aaa9GG3233313E = {  "_ZN3aaa9GG3233313E", // class name
  bases__ZN3aaa9GG3233313E, 6,
  &(vtc__ZN3aaa9GG3233313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233321  : ::aaa::EE323 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32333213fooEv
  ~GG3233321(); // tgen
  GG3233321(); // tgen
};
//SIG(1 _ZN3aaa9GG3233321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233321 ::foo(){vfunc_called(this, "_ZN3aaa9GG32333213fooEv");}
aaa::GG3233321 ::~GG3233321(){ note_dtor("_ZN3aaa9GG3233321E", this);} // tgen
aaa::GG3233321 ::GG3233321(){ note_ctor("_ZN3aaa9GG3233321E", this);} // tgen
}
static void Test__ZN3aaa9GG3233321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233321E, buf);
    ::aaa::GG3233321 *dp, &lv = *(dp=new (buf) ::aaa::GG3233321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233321E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233321E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3233321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3233321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3233321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233321E);
    dp->::aaa::GG3233321::~GG3233321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233321E(Test__ZN3aaa9GG3233321E, "_ZN3aaa9GG3233321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233321C1Ev();
extern void _ZN3aaa9GG3233321D1Ev();
Name_Map name_map__ZN3aaa9GG3233321E[] = {
  NSPAIR(_ZN3aaa9GG3233321C1Ev),
  NSPAIR(_ZN3aaa9GG3233321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3233321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233321E[];
extern void _ZN3aaa9GG32333213fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333213fooEv,_ZThn20_N3aaa9GG32333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32333213fooEv,_ZThn28_N3aaa9GG32333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32333213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333213fooEv,_ZThn20_N3aaa9GG32333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333213fooEv,_ZThn28_N3aaa9GG32333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233321E[];
Class_Descriptor cd__ZN3aaa9GG3233321E = {  "_ZN3aaa9GG3233321E", // class name
  bases__ZN3aaa9GG3233321E, 6,
  &(vtc__ZN3aaa9GG3233321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233322  : ::aaa::EE323 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32333223barEv
  ~GG3233322(); // tgen
  GG3233322(); // tgen
};
//SIG(1 _ZN3aaa9GG3233322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233322 ::bar(){vfunc_called(this, "_ZN3aaa9GG32333223barEv");}
aaa::GG3233322 ::~GG3233322(){ note_dtor("_ZN3aaa9GG3233322E", this);} // tgen
aaa::GG3233322 ::GG3233322(){ note_ctor("_ZN3aaa9GG3233322E", this);} // tgen
}
static void Test__ZN3aaa9GG3233322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233322E, buf);
    ::aaa::GG3233322 *dp, &lv = *(dp=new (buf) ::aaa::GG3233322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233322E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233322E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3233322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3233322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3233322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233322E);
    dp->::aaa::GG3233322::~GG3233322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233322E(Test__ZN3aaa9GG3233322E, "_ZN3aaa9GG3233322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233322C1Ev();
extern void _ZN3aaa9GG3233322D1Ev();
Name_Map name_map__ZN3aaa9GG3233322E[] = {
  NSPAIR(_ZN3aaa9GG3233322C1Ev),
  NSPAIR(_ZN3aaa9GG3233322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3233322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233322E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32333223barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32333223barEv,_ZThn8_N3aaa9GG32333223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32333223barEv,_ZThn20_N3aaa9GG32333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32333223barEv,_ZThn28_N3aaa9GG32333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32333223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32333223barEv,_ZThn8_N3aaa9GG32333223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333223barEv,_ZThn20_N3aaa9GG32333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333223barEv,_ZThn28_N3aaa9GG32333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233322E[];
Class_Descriptor cd__ZN3aaa9GG3233322E = {  "_ZN3aaa9GG3233322E", // class name
  bases__ZN3aaa9GG3233322E, 6,
  &(vtc__ZN3aaa9GG3233322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233323  : ::aaa::EE323 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32333233fooEv
  virtual void  bar(); // _ZN3aaa9GG32333233barEv
  ~GG3233323(); // tgen
  GG3233323(); // tgen
};
//SIG(1 _ZN3aaa9GG3233323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233323 ::foo(){vfunc_called(this, "_ZN3aaa9GG32333233fooEv");}
void  aaa::GG3233323 ::bar(){vfunc_called(this, "_ZN3aaa9GG32333233barEv");}
aaa::GG3233323 ::~GG3233323(){ note_dtor("_ZN3aaa9GG3233323E", this);} // tgen
aaa::GG3233323 ::GG3233323(){ note_ctor("_ZN3aaa9GG3233323E", this);} // tgen
}
static void Test__ZN3aaa9GG3233323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233323E, buf);
    ::aaa::GG3233323 *dp, &lv = *(dp=new (buf) ::aaa::GG3233323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233323E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233323E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3233323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3233323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3233323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233323E);
    dp->::aaa::GG3233323::~GG3233323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233323E(Test__ZN3aaa9GG3233323E, "_ZN3aaa9GG3233323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233323C1Ev();
extern void _ZN3aaa9GG3233323D1Ev();
Name_Map name_map__ZN3aaa9GG3233323E[] = {
  NSPAIR(_ZN3aaa9GG3233323C1Ev),
  NSPAIR(_ZN3aaa9GG3233323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3233323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233323E[];
extern void _ZN3aaa9GG32333233fooEv();
extern void _ZN3aaa9GG32333233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32333233barEv,_ZThn8_N3aaa9GG32333233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333233fooEv,_ZThn20_N3aaa9GG32333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333233barEv,_ZThn20_N3aaa9GG32333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32333233fooEv,_ZThn28_N3aaa9GG32333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32333233barEv,_ZThn28_N3aaa9GG32333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32333233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32333233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32333233barEv,_ZThn8_N3aaa9GG32333233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333233fooEv,_ZThn20_N3aaa9GG32333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333233barEv,_ZThn20_N3aaa9GG32333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333233fooEv,_ZThn28_N3aaa9GG32333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333233barEv,_ZThn28_N3aaa9GG32333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233323E[];
Class_Descriptor cd__ZN3aaa9GG3233323E = {  "_ZN3aaa9GG3233323E", // class name
  bases__ZN3aaa9GG3233323E, 6,
  &(vtc__ZN3aaa9GG3233323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233331  : ::aaa::EE323 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32333313fooEv
  ~GG3233331(); // tgen
  GG3233331(); // tgen
};
//SIG(1 _ZN3aaa9GG3233331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233331 ::foo(){vfunc_called(this, "_ZN3aaa9GG32333313fooEv");}
aaa::GG3233331 ::~GG3233331(){ note_dtor("_ZN3aaa9GG3233331E", this);} // tgen
aaa::GG3233331 ::GG3233331(){ note_ctor("_ZN3aaa9GG3233331E", this);} // tgen
}
static void Test__ZN3aaa9GG3233331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233331E, buf);
    ::aaa::GG3233331 *dp, &lv = *(dp=new (buf) ::aaa::GG3233331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233331E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233331E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3233331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3233331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3233331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233331E);
    dp->::aaa::GG3233331::~GG3233331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233331E(Test__ZN3aaa9GG3233331E, "_ZN3aaa9GG3233331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233331C1Ev();
extern void _ZN3aaa9GG3233331D1Ev();
Name_Map name_map__ZN3aaa9GG3233331E[] = {
  NSPAIR(_ZN3aaa9GG3233331C1Ev),
  NSPAIR(_ZN3aaa9GG3233331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3233331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233331E[];
extern void _ZN3aaa9GG32333313fooEv();
extern void _ZN3aaa5EE3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333313fooEv,_ZThn20_N3aaa9GG32333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG32333313fooEv,_ZThn28_N3aaa9GG32333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32333313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3233barEv,_ZThn8_N3aaa5EE3233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333313fooEv,_ZThn20_N3aaa9GG32333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333313fooEv,_ZThn28_N3aaa9GG32333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233331E[];
Class_Descriptor cd__ZN3aaa9GG3233331E = {  "_ZN3aaa9GG3233331E", // class name
  bases__ZN3aaa9GG3233331E, 6,
  &(vtc__ZN3aaa9GG3233331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233331E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233332  : ::aaa::EE323 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG32333323barEv
  ~GG3233332(); // tgen
  GG3233332(); // tgen
};
//SIG(1 _ZN3aaa9GG3233332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3233332 ::bar(){vfunc_called(this, "_ZN3aaa9GG32333323barEv");}
aaa::GG3233332 ::~GG3233332(){ note_dtor("_ZN3aaa9GG3233332E", this);} // tgen
aaa::GG3233332 ::GG3233332(){ note_ctor("_ZN3aaa9GG3233332E", this);} // tgen
}
static void Test__ZN3aaa9GG3233332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233332E, buf);
    ::aaa::GG3233332 *dp, &lv = *(dp=new (buf) ::aaa::GG3233332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233332E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233332E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3233332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3233332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3233332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233332E);
    dp->::aaa::GG3233332::~GG3233332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233332E(Test__ZN3aaa9GG3233332E, "_ZN3aaa9GG3233332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233332C1Ev();
extern void _ZN3aaa9GG3233332D1Ev();
Name_Map name_map__ZN3aaa9GG3233332E[] = {
  NSPAIR(_ZN3aaa9GG3233332C1Ev),
  NSPAIR(_ZN3aaa9GG3233332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3233332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233332E[];
extern void _ZN3aaa5EE3233fooEv();
extern void _ZN3aaa9GG32333323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32333323barEv,_ZThn8_N3aaa9GG32333323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG32333323barEv,_ZThn20_N3aaa9GG32333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32333323barEv,_ZThn28_N3aaa9GG32333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32333323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32333323barEv,_ZThn8_N3aaa9GG32333323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333323barEv,_ZThn20_N3aaa9GG32333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333323barEv,_ZThn28_N3aaa9GG32333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233332E[];
Class_Descriptor cd__ZN3aaa9GG3233332E = {  "_ZN3aaa9GG3233332E", // class name
  bases__ZN3aaa9GG3233332E, 6,
  &(vtc__ZN3aaa9GG3233332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233332E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3233333  : ::aaa::EE323 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG32333333fooEv
  virtual void  bar(); // _ZN3aaa9GG32333333barEv
  ~GG3233333(); // tgen
  GG3233333(); // tgen
};
//SIG(1 _ZN3aaa9GG3233333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3233333 ::foo(){vfunc_called(this, "_ZN3aaa9GG32333333fooEv");}
void  aaa::GG3233333 ::bar(){vfunc_called(this, "_ZN3aaa9GG32333333barEv");}
aaa::GG3233333 ::~GG3233333(){ note_dtor("_ZN3aaa9GG3233333E", this);} // tgen
aaa::GG3233333 ::GG3233333(){ note_ctor("_ZN3aaa9GG3233333E", this);} // tgen
}
static void Test__ZN3aaa9GG3233333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3233333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3233333E, buf);
    ::aaa::GG3233333 *dp, &lv = *(dp=new (buf) ::aaa::GG3233333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3233333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3233333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE323*), 0, "_ZN3aaa9GG3233333E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::EE323*), ABISELECT(16,8), "_ZN3aaa9GG3233333E");
    check_base_class_offset(lv, (::aaa::EE323*), 0, "_ZN3aaa9GG3233333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3233333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3233333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3233333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3233333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3233333E);
    dp->::aaa::GG3233333::~GG3233333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3233333E(Test__ZN3aaa9GG3233333E, "_ZN3aaa9GG3233333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3233333C1Ev();
extern void _ZN3aaa9GG3233333D1Ev();
Name_Map name_map__ZN3aaa9GG3233333E[] = {
  NSPAIR(_ZN3aaa9GG3233333C1Ev),
  NSPAIR(_ZN3aaa9GG3233333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5EE323E;
extern VTBL_ENTRY _ZTIN3aaa5EE323E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE323E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3233333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE323E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3233333E[];
extern void _ZN3aaa9GG32333333fooEv();
extern void _ZN3aaa9GG32333333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG32333333barEv,_ZThn8_N3aaa9GG32333333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333333fooEv,_ZThn20_N3aaa9GG32333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG32333333barEv,_ZThn20_N3aaa9GG32333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32333333fooEv,_ZThn28_N3aaa9GG32333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG32333333barEv,_ZThn28_N3aaa9GG32333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3233333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG32333333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG32333333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG32333333barEv,_ZThn8_N3aaa9GG32333333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333333fooEv,_ZThn20_N3aaa9GG32333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG32333333barEv,_ZThn20_N3aaa9GG32333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3233333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333333fooEv,_ZThn28_N3aaa9GG32333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG32333333barEv,_ZThn28_N3aaa9GG32333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3233333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3233333E[];
Class_Descriptor cd__ZN3aaa9GG3233333E = {  "_ZN3aaa9GG3233333E", // class name
  bases__ZN3aaa9GG3233333E, 6,
  &(vtc__ZN3aaa9GG3233333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3233333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3233333E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311111  : ::aaa::EE331 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33111113fooEv
  ~GG3311111(); // tgen
  GG3311111(); // tgen
};
//SIG(1 _ZN3aaa9GG3311111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33111113fooEv");}
aaa::GG3311111 ::~GG3311111(){ note_dtor("_ZN3aaa9GG3311111E", this);} // tgen
aaa::GG3311111 ::GG3311111(){ note_ctor("_ZN3aaa9GG3311111E", this);} // tgen
}
static void Test__ZN3aaa9GG3311111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311111E, buf);
    ::aaa::GG3311111 *dp, &lv = *(dp=new (buf) ::aaa::GG3311111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311111E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3311111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3311111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3311111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311111E);
    dp->::aaa::GG3311111::~GG3311111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311111E(Test__ZN3aaa9GG3311111E, "_ZN3aaa9GG3311111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311111C1Ev();
extern void _ZN3aaa9GG3311111D1Ev();
Name_Map name_map__ZN3aaa9GG3311111E[] = {
  NSPAIR(_ZN3aaa9GG3311111C1Ev),
  NSPAIR(_ZN3aaa9GG3311111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3311111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311111E[];
extern void _ZN3aaa9GG33111113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33111113fooEv,_ZThn8_N3aaa9GG33111113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33111113fooEv,_ZThn20_N3aaa9GG33111113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33111113fooEv,_ZThn28_N3aaa9GG33111113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33111113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111113fooEv,_ZThn8_N3aaa9GG33111113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111113fooEv,_ZThn20_N3aaa9GG33111113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33111113fooEv,_ZThn28_N3aaa9GG33111113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311111E[];
Class_Descriptor cd__ZN3aaa9GG3311111E = {  "_ZN3aaa9GG3311111E", // class name
  bases__ZN3aaa9GG3311111E, 6,
  &(vtc__ZN3aaa9GG3311111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311112  : ::aaa::EE331 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33111123barEv
  ~GG3311112(); // tgen
  GG3311112(); // tgen
};
//SIG(1 _ZN3aaa9GG3311112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33111123barEv");}
aaa::GG3311112 ::~GG3311112(){ note_dtor("_ZN3aaa9GG3311112E", this);} // tgen
aaa::GG3311112 ::GG3311112(){ note_ctor("_ZN3aaa9GG3311112E", this);} // tgen
}
static void Test__ZN3aaa9GG3311112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311112E, buf);
    ::aaa::GG3311112 *dp, &lv = *(dp=new (buf) ::aaa::GG3311112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311112E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3311112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3311112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3311112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311112E);
    dp->::aaa::GG3311112::~GG3311112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311112E(Test__ZN3aaa9GG3311112E, "_ZN3aaa9GG3311112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311112C1Ev();
extern void _ZN3aaa9GG3311112D1Ev();
Name_Map name_map__ZN3aaa9GG3311112E[] = {
  NSPAIR(_ZN3aaa9GG3311112C1Ev),
  NSPAIR(_ZN3aaa9GG3311112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3311112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311112E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33111123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33111123barEv,_ZThn8_N3aaa9GG33111123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33111123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111123barEv,_ZThn8_N3aaa9GG33111123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311112E[];
Class_Descriptor cd__ZN3aaa9GG3311112E = {  "_ZN3aaa9GG3311112E", // class name
  bases__ZN3aaa9GG3311112E, 6,
  &(vtc__ZN3aaa9GG3311112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311113  : ::aaa::EE331 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33111133fooEv
  virtual void  bar(); // _ZN3aaa9GG33111133barEv
  ~GG3311113(); // tgen
  GG3311113(); // tgen
};
//SIG(1 _ZN3aaa9GG3311113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33111133fooEv");}
void  aaa::GG3311113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33111133barEv");}
aaa::GG3311113 ::~GG3311113(){ note_dtor("_ZN3aaa9GG3311113E", this);} // tgen
aaa::GG3311113 ::GG3311113(){ note_ctor("_ZN3aaa9GG3311113E", this);} // tgen
}
static void Test__ZN3aaa9GG3311113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311113E, buf);
    ::aaa::GG3311113 *dp, &lv = *(dp=new (buf) ::aaa::GG3311113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311113E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3311113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3311113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3311113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311113E);
    dp->::aaa::GG3311113::~GG3311113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311113E(Test__ZN3aaa9GG3311113E, "_ZN3aaa9GG3311113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311113C1Ev();
extern void _ZN3aaa9GG3311113D1Ev();
Name_Map name_map__ZN3aaa9GG3311113E[] = {
  NSPAIR(_ZN3aaa9GG3311113C1Ev),
  NSPAIR(_ZN3aaa9GG3311113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3311113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311113E[];
extern void _ZN3aaa9GG33111133fooEv();
extern void _ZN3aaa9GG33111133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33111133fooEv,_ZThn8_N3aaa9GG33111133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33111133barEv,_ZThn8_N3aaa9GG33111133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33111133fooEv,_ZThn20_N3aaa9GG33111133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33111133fooEv,_ZThn28_N3aaa9GG33111133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33111133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33111133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111133fooEv,_ZThn8_N3aaa9GG33111133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111133barEv,_ZThn8_N3aaa9GG33111133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111133fooEv,_ZThn20_N3aaa9GG33111133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33111133fooEv,_ZThn28_N3aaa9GG33111133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311113E[];
Class_Descriptor cd__ZN3aaa9GG3311113E = {  "_ZN3aaa9GG3311113E", // class name
  bases__ZN3aaa9GG3311113E, 6,
  &(vtc__ZN3aaa9GG3311113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311121  : ::aaa::EE331 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33111213fooEv
  ~GG3311121(); // tgen
  GG3311121(); // tgen
};
//SIG(1 _ZN3aaa9GG3311121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33111213fooEv");}
aaa::GG3311121 ::~GG3311121(){ note_dtor("_ZN3aaa9GG3311121E", this);} // tgen
aaa::GG3311121 ::GG3311121(){ note_ctor("_ZN3aaa9GG3311121E", this);} // tgen
}
static void Test__ZN3aaa9GG3311121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311121E, buf);
    ::aaa::GG3311121 *dp, &lv = *(dp=new (buf) ::aaa::GG3311121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311121E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3311121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3311121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3311121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311121E);
    dp->::aaa::GG3311121::~GG3311121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311121E(Test__ZN3aaa9GG3311121E, "_ZN3aaa9GG3311121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311121C1Ev();
extern void _ZN3aaa9GG3311121D1Ev();
Name_Map name_map__ZN3aaa9GG3311121E[] = {
  NSPAIR(_ZN3aaa9GG3311121C1Ev),
  NSPAIR(_ZN3aaa9GG3311121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3311121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311121E[];
extern void _ZN3aaa9GG33111213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33111213fooEv,_ZThn8_N3aaa9GG33111213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33111213fooEv,_ZThn20_N3aaa9GG33111213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33111213fooEv,_ZThn28_N3aaa9GG33111213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33111213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111213fooEv,_ZThn8_N3aaa9GG33111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111213fooEv,_ZThn20_N3aaa9GG33111213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33111213fooEv,_ZThn28_N3aaa9GG33111213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311121E[];
Class_Descriptor cd__ZN3aaa9GG3311121E = {  "_ZN3aaa9GG3311121E", // class name
  bases__ZN3aaa9GG3311121E, 6,
  &(vtc__ZN3aaa9GG3311121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311122  : ::aaa::EE331 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33111223barEv
  ~GG3311122(); // tgen
  GG3311122(); // tgen
};
//SIG(1 _ZN3aaa9GG3311122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33111223barEv");}
aaa::GG3311122 ::~GG3311122(){ note_dtor("_ZN3aaa9GG3311122E", this);} // tgen
aaa::GG3311122 ::GG3311122(){ note_ctor("_ZN3aaa9GG3311122E", this);} // tgen
}
static void Test__ZN3aaa9GG3311122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311122E, buf);
    ::aaa::GG3311122 *dp, &lv = *(dp=new (buf) ::aaa::GG3311122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311122E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3311122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3311122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3311122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311122E);
    dp->::aaa::GG3311122::~GG3311122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311122E(Test__ZN3aaa9GG3311122E, "_ZN3aaa9GG3311122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311122C1Ev();
extern void _ZN3aaa9GG3311122D1Ev();
Name_Map name_map__ZN3aaa9GG3311122E[] = {
  NSPAIR(_ZN3aaa9GG3311122C1Ev),
  NSPAIR(_ZN3aaa9GG3311122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3311122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311122E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33111223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33111223barEv,_ZThn8_N3aaa9GG33111223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33111223barEv,_ZThn20_N3aaa9GG33111223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33111223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111223barEv,_ZThn8_N3aaa9GG33111223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111223barEv,_ZThn20_N3aaa9GG33111223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311122E[];
Class_Descriptor cd__ZN3aaa9GG3311122E = {  "_ZN3aaa9GG3311122E", // class name
  bases__ZN3aaa9GG3311122E, 6,
  &(vtc__ZN3aaa9GG3311122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311123  : ::aaa::EE331 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33111233fooEv
  virtual void  bar(); // _ZN3aaa9GG33111233barEv
  ~GG3311123(); // tgen
  GG3311123(); // tgen
};
//SIG(1 _ZN3aaa9GG3311123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33111233fooEv");}
void  aaa::GG3311123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33111233barEv");}
aaa::GG3311123 ::~GG3311123(){ note_dtor("_ZN3aaa9GG3311123E", this);} // tgen
aaa::GG3311123 ::GG3311123(){ note_ctor("_ZN3aaa9GG3311123E", this);} // tgen
}
static void Test__ZN3aaa9GG3311123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311123E, buf);
    ::aaa::GG3311123 *dp, &lv = *(dp=new (buf) ::aaa::GG3311123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311123E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3311123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3311123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3311123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311123E);
    dp->::aaa::GG3311123::~GG3311123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311123E(Test__ZN3aaa9GG3311123E, "_ZN3aaa9GG3311123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311123C1Ev();
extern void _ZN3aaa9GG3311123D1Ev();
Name_Map name_map__ZN3aaa9GG3311123E[] = {
  NSPAIR(_ZN3aaa9GG3311123C1Ev),
  NSPAIR(_ZN3aaa9GG3311123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3311123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311123E[];
extern void _ZN3aaa9GG33111233fooEv();
extern void _ZN3aaa9GG33111233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33111233fooEv,_ZThn8_N3aaa9GG33111233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33111233barEv,_ZThn8_N3aaa9GG33111233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33111233fooEv,_ZThn20_N3aaa9GG33111233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33111233barEv,_ZThn20_N3aaa9GG33111233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33111233fooEv,_ZThn28_N3aaa9GG33111233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33111233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33111233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111233fooEv,_ZThn8_N3aaa9GG33111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111233barEv,_ZThn8_N3aaa9GG33111233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111233fooEv,_ZThn20_N3aaa9GG33111233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111233barEv,_ZThn20_N3aaa9GG33111233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33111233fooEv,_ZThn28_N3aaa9GG33111233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311123E[];
Class_Descriptor cd__ZN3aaa9GG3311123E = {  "_ZN3aaa9GG3311123E", // class name
  bases__ZN3aaa9GG3311123E, 6,
  &(vtc__ZN3aaa9GG3311123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311131  : ::aaa::EE331 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33111313fooEv
  ~GG3311131(); // tgen
  GG3311131(); // tgen
};
//SIG(1 _ZN3aaa9GG3311131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33111313fooEv");}
aaa::GG3311131 ::~GG3311131(){ note_dtor("_ZN3aaa9GG3311131E", this);} // tgen
aaa::GG3311131 ::GG3311131(){ note_ctor("_ZN3aaa9GG3311131E", this);} // tgen
}
static void Test__ZN3aaa9GG3311131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311131E, buf);
    ::aaa::GG3311131 *dp, &lv = *(dp=new (buf) ::aaa::GG3311131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311131E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3311131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3311131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3311131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311131E);
    dp->::aaa::GG3311131::~GG3311131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311131E(Test__ZN3aaa9GG3311131E, "_ZN3aaa9GG3311131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311131C1Ev();
extern void _ZN3aaa9GG3311131D1Ev();
Name_Map name_map__ZN3aaa9GG3311131E[] = {
  NSPAIR(_ZN3aaa9GG3311131C1Ev),
  NSPAIR(_ZN3aaa9GG3311131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3311131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311131E[];
extern void _ZN3aaa9GG33111313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33111313fooEv,_ZThn8_N3aaa9GG33111313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33111313fooEv,_ZThn20_N3aaa9GG33111313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33111313fooEv,_ZThn28_N3aaa9GG33111313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33111313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111313fooEv,_ZThn8_N3aaa9GG33111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111313fooEv,_ZThn20_N3aaa9GG33111313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33111313fooEv,_ZThn28_N3aaa9GG33111313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311131E[];
Class_Descriptor cd__ZN3aaa9GG3311131E = {  "_ZN3aaa9GG3311131E", // class name
  bases__ZN3aaa9GG3311131E, 6,
  &(vtc__ZN3aaa9GG3311131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311132  : ::aaa::EE331 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33111323barEv
  ~GG3311132(); // tgen
  GG3311132(); // tgen
};
//SIG(1 _ZN3aaa9GG3311132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33111323barEv");}
aaa::GG3311132 ::~GG3311132(){ note_dtor("_ZN3aaa9GG3311132E", this);} // tgen
aaa::GG3311132 ::GG3311132(){ note_ctor("_ZN3aaa9GG3311132E", this);} // tgen
}
static void Test__ZN3aaa9GG3311132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311132E, buf);
    ::aaa::GG3311132 *dp, &lv = *(dp=new (buf) ::aaa::GG3311132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311132E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3311132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3311132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3311132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311132E);
    dp->::aaa::GG3311132::~GG3311132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311132E(Test__ZN3aaa9GG3311132E, "_ZN3aaa9GG3311132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311132C1Ev();
extern void _ZN3aaa9GG3311132D1Ev();
Name_Map name_map__ZN3aaa9GG3311132E[] = {
  NSPAIR(_ZN3aaa9GG3311132C1Ev),
  NSPAIR(_ZN3aaa9GG3311132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3311132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311132E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33111323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33111323barEv,_ZThn8_N3aaa9GG33111323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33111323barEv,_ZThn20_N3aaa9GG33111323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33111323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111323barEv,_ZThn8_N3aaa9GG33111323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111323barEv,_ZThn20_N3aaa9GG33111323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311132E[];
Class_Descriptor cd__ZN3aaa9GG3311132E = {  "_ZN3aaa9GG3311132E", // class name
  bases__ZN3aaa9GG3311132E, 6,
  &(vtc__ZN3aaa9GG3311132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311133  : ::aaa::EE331 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33111333fooEv
  virtual void  bar(); // _ZN3aaa9GG33111333barEv
  ~GG3311133(); // tgen
  GG3311133(); // tgen
};
//SIG(1 _ZN3aaa9GG3311133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33111333fooEv");}
void  aaa::GG3311133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33111333barEv");}
aaa::GG3311133 ::~GG3311133(){ note_dtor("_ZN3aaa9GG3311133E", this);} // tgen
aaa::GG3311133 ::GG3311133(){ note_ctor("_ZN3aaa9GG3311133E", this);} // tgen
}
static void Test__ZN3aaa9GG3311133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311133E, buf);
    ::aaa::GG3311133 *dp, &lv = *(dp=new (buf) ::aaa::GG3311133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311133E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3311133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3311133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3311133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311133E);
    dp->::aaa::GG3311133::~GG3311133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311133E(Test__ZN3aaa9GG3311133E, "_ZN3aaa9GG3311133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311133C1Ev();
extern void _ZN3aaa9GG3311133D1Ev();
Name_Map name_map__ZN3aaa9GG3311133E[] = {
  NSPAIR(_ZN3aaa9GG3311133C1Ev),
  NSPAIR(_ZN3aaa9GG3311133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3311133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311133E[];
extern void _ZN3aaa9GG33111333fooEv();
extern void _ZN3aaa9GG33111333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33111333fooEv,_ZThn8_N3aaa9GG33111333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33111333barEv,_ZThn8_N3aaa9GG33111333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33111333fooEv,_ZThn20_N3aaa9GG33111333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33111333barEv,_ZThn20_N3aaa9GG33111333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33111333fooEv,_ZThn28_N3aaa9GG33111333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33111333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33111333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111333fooEv,_ZThn8_N3aaa9GG33111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33111333barEv,_ZThn8_N3aaa9GG33111333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111333fooEv,_ZThn20_N3aaa9GG33111333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33111333barEv,_ZThn20_N3aaa9GG33111333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33111333fooEv,_ZThn28_N3aaa9GG33111333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311133E[];
Class_Descriptor cd__ZN3aaa9GG3311133E = {  "_ZN3aaa9GG3311133E", // class name
  bases__ZN3aaa9GG3311133E, 6,
  &(vtc__ZN3aaa9GG3311133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311211  : ::aaa::EE331 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33112113fooEv
  ~GG3311211(); // tgen
  GG3311211(); // tgen
};
//SIG(1 _ZN3aaa9GG3311211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33112113fooEv");}
aaa::GG3311211 ::~GG3311211(){ note_dtor("_ZN3aaa9GG3311211E", this);} // tgen
aaa::GG3311211 ::GG3311211(){ note_ctor("_ZN3aaa9GG3311211E", this);} // tgen
}
static void Test__ZN3aaa9GG3311211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311211E, buf);
    ::aaa::GG3311211 *dp, &lv = *(dp=new (buf) ::aaa::GG3311211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311211E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3311211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3311211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3311211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311211E);
    dp->::aaa::GG3311211::~GG3311211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311211E(Test__ZN3aaa9GG3311211E, "_ZN3aaa9GG3311211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311211C1Ev();
extern void _ZN3aaa9GG3311211D1Ev();
Name_Map name_map__ZN3aaa9GG3311211E[] = {
  NSPAIR(_ZN3aaa9GG3311211C1Ev),
  NSPAIR(_ZN3aaa9GG3311211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3311211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311211E[];
extern void _ZN3aaa9GG33112113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33112113fooEv,_ZThn8_N3aaa9GG33112113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33112113fooEv,_ZThn20_N3aaa9GG33112113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33112113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112113fooEv,_ZThn8_N3aaa9GG33112113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112113fooEv,_ZThn20_N3aaa9GG33112113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311211E[];
Class_Descriptor cd__ZN3aaa9GG3311211E = {  "_ZN3aaa9GG3311211E", // class name
  bases__ZN3aaa9GG3311211E, 6,
  &(vtc__ZN3aaa9GG3311211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311212  : ::aaa::EE331 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33112123barEv
  ~GG3311212(); // tgen
  GG3311212(); // tgen
};
//SIG(1 _ZN3aaa9GG3311212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33112123barEv");}
aaa::GG3311212 ::~GG3311212(){ note_dtor("_ZN3aaa9GG3311212E", this);} // tgen
aaa::GG3311212 ::GG3311212(){ note_ctor("_ZN3aaa9GG3311212E", this);} // tgen
}
static void Test__ZN3aaa9GG3311212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311212E, buf);
    ::aaa::GG3311212 *dp, &lv = *(dp=new (buf) ::aaa::GG3311212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311212E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3311212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3311212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3311212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311212E);
    dp->::aaa::GG3311212::~GG3311212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311212E(Test__ZN3aaa9GG3311212E, "_ZN3aaa9GG3311212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311212C1Ev();
extern void _ZN3aaa9GG3311212D1Ev();
Name_Map name_map__ZN3aaa9GG3311212E[] = {
  NSPAIR(_ZN3aaa9GG3311212C1Ev),
  NSPAIR(_ZN3aaa9GG3311212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3311212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311212E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33112123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33112123barEv,_ZThn8_N3aaa9GG33112123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33112123barEv,_ZThn28_N3aaa9GG33112123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33112123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112123barEv,_ZThn8_N3aaa9GG33112123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33112123barEv,_ZThn28_N3aaa9GG33112123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311212E[];
Class_Descriptor cd__ZN3aaa9GG3311212E = {  "_ZN3aaa9GG3311212E", // class name
  bases__ZN3aaa9GG3311212E, 6,
  &(vtc__ZN3aaa9GG3311212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311213  : ::aaa::EE331 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33112133fooEv
  virtual void  bar(); // _ZN3aaa9GG33112133barEv
  ~GG3311213(); // tgen
  GG3311213(); // tgen
};
//SIG(1 _ZN3aaa9GG3311213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33112133fooEv");}
void  aaa::GG3311213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33112133barEv");}
aaa::GG3311213 ::~GG3311213(){ note_dtor("_ZN3aaa9GG3311213E", this);} // tgen
aaa::GG3311213 ::GG3311213(){ note_ctor("_ZN3aaa9GG3311213E", this);} // tgen
}
static void Test__ZN3aaa9GG3311213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311213E, buf);
    ::aaa::GG3311213 *dp, &lv = *(dp=new (buf) ::aaa::GG3311213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311213E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3311213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3311213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3311213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311213E);
    dp->::aaa::GG3311213::~GG3311213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311213E(Test__ZN3aaa9GG3311213E, "_ZN3aaa9GG3311213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311213C1Ev();
extern void _ZN3aaa9GG3311213D1Ev();
Name_Map name_map__ZN3aaa9GG3311213E[] = {
  NSPAIR(_ZN3aaa9GG3311213C1Ev),
  NSPAIR(_ZN3aaa9GG3311213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3311213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311213E[];
extern void _ZN3aaa9GG33112133fooEv();
extern void _ZN3aaa9GG33112133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33112133fooEv,_ZThn8_N3aaa9GG33112133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33112133barEv,_ZThn8_N3aaa9GG33112133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33112133fooEv,_ZThn20_N3aaa9GG33112133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33112133barEv,_ZThn28_N3aaa9GG33112133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33112133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33112133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112133fooEv,_ZThn8_N3aaa9GG33112133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112133barEv,_ZThn8_N3aaa9GG33112133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112133fooEv,_ZThn20_N3aaa9GG33112133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33112133barEv,_ZThn28_N3aaa9GG33112133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311213E[];
Class_Descriptor cd__ZN3aaa9GG3311213E = {  "_ZN3aaa9GG3311213E", // class name
  bases__ZN3aaa9GG3311213E, 6,
  &(vtc__ZN3aaa9GG3311213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311221  : ::aaa::EE331 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33112213fooEv
  ~GG3311221(); // tgen
  GG3311221(); // tgen
};
//SIG(1 _ZN3aaa9GG3311221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33112213fooEv");}
aaa::GG3311221 ::~GG3311221(){ note_dtor("_ZN3aaa9GG3311221E", this);} // tgen
aaa::GG3311221 ::GG3311221(){ note_ctor("_ZN3aaa9GG3311221E", this);} // tgen
}
static void Test__ZN3aaa9GG3311221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311221E, buf);
    ::aaa::GG3311221 *dp, &lv = *(dp=new (buf) ::aaa::GG3311221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311221E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3311221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3311221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3311221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311221E);
    dp->::aaa::GG3311221::~GG3311221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311221E(Test__ZN3aaa9GG3311221E, "_ZN3aaa9GG3311221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311221C1Ev();
extern void _ZN3aaa9GG3311221D1Ev();
Name_Map name_map__ZN3aaa9GG3311221E[] = {
  NSPAIR(_ZN3aaa9GG3311221C1Ev),
  NSPAIR(_ZN3aaa9GG3311221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3311221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311221E[];
extern void _ZN3aaa9GG33112213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33112213fooEv,_ZThn8_N3aaa9GG33112213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33112213fooEv,_ZThn20_N3aaa9GG33112213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33112213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112213fooEv,_ZThn8_N3aaa9GG33112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112213fooEv,_ZThn20_N3aaa9GG33112213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311221E[];
Class_Descriptor cd__ZN3aaa9GG3311221E = {  "_ZN3aaa9GG3311221E", // class name
  bases__ZN3aaa9GG3311221E, 6,
  &(vtc__ZN3aaa9GG3311221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311222  : ::aaa::EE331 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33112223barEv
  ~GG3311222(); // tgen
  GG3311222(); // tgen
};
//SIG(1 _ZN3aaa9GG3311222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33112223barEv");}
aaa::GG3311222 ::~GG3311222(){ note_dtor("_ZN3aaa9GG3311222E", this);} // tgen
aaa::GG3311222 ::GG3311222(){ note_ctor("_ZN3aaa9GG3311222E", this);} // tgen
}
static void Test__ZN3aaa9GG3311222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311222E, buf);
    ::aaa::GG3311222 *dp, &lv = *(dp=new (buf) ::aaa::GG3311222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311222E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3311222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3311222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3311222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311222E);
    dp->::aaa::GG3311222::~GG3311222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311222E(Test__ZN3aaa9GG3311222E, "_ZN3aaa9GG3311222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311222C1Ev();
extern void _ZN3aaa9GG3311222D1Ev();
Name_Map name_map__ZN3aaa9GG3311222E[] = {
  NSPAIR(_ZN3aaa9GG3311222C1Ev),
  NSPAIR(_ZN3aaa9GG3311222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3311222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311222E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33112223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33112223barEv,_ZThn8_N3aaa9GG33112223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33112223barEv,_ZThn20_N3aaa9GG33112223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33112223barEv,_ZThn28_N3aaa9GG33112223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33112223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112223barEv,_ZThn8_N3aaa9GG33112223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112223barEv,_ZThn20_N3aaa9GG33112223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33112223barEv,_ZThn28_N3aaa9GG33112223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311222E[];
Class_Descriptor cd__ZN3aaa9GG3311222E = {  "_ZN3aaa9GG3311222E", // class name
  bases__ZN3aaa9GG3311222E, 6,
  &(vtc__ZN3aaa9GG3311222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311223  : ::aaa::EE331 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33112233fooEv
  virtual void  bar(); // _ZN3aaa9GG33112233barEv
  ~GG3311223(); // tgen
  GG3311223(); // tgen
};
//SIG(1 _ZN3aaa9GG3311223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33112233fooEv");}
void  aaa::GG3311223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33112233barEv");}
aaa::GG3311223 ::~GG3311223(){ note_dtor("_ZN3aaa9GG3311223E", this);} // tgen
aaa::GG3311223 ::GG3311223(){ note_ctor("_ZN3aaa9GG3311223E", this);} // tgen
}
static void Test__ZN3aaa9GG3311223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311223E, buf);
    ::aaa::GG3311223 *dp, &lv = *(dp=new (buf) ::aaa::GG3311223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311223E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3311223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3311223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3311223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311223E);
    dp->::aaa::GG3311223::~GG3311223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311223E(Test__ZN3aaa9GG3311223E, "_ZN3aaa9GG3311223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311223C1Ev();
extern void _ZN3aaa9GG3311223D1Ev();
Name_Map name_map__ZN3aaa9GG3311223E[] = {
  NSPAIR(_ZN3aaa9GG3311223C1Ev),
  NSPAIR(_ZN3aaa9GG3311223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3311223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311223E[];
extern void _ZN3aaa9GG33112233fooEv();
extern void _ZN3aaa9GG33112233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33112233fooEv,_ZThn8_N3aaa9GG33112233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33112233barEv,_ZThn8_N3aaa9GG33112233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33112233fooEv,_ZThn20_N3aaa9GG33112233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33112233barEv,_ZThn20_N3aaa9GG33112233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33112233barEv,_ZThn28_N3aaa9GG33112233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33112233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33112233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112233fooEv,_ZThn8_N3aaa9GG33112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112233barEv,_ZThn8_N3aaa9GG33112233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112233fooEv,_ZThn20_N3aaa9GG33112233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112233barEv,_ZThn20_N3aaa9GG33112233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33112233barEv,_ZThn28_N3aaa9GG33112233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311223E[];
Class_Descriptor cd__ZN3aaa9GG3311223E = {  "_ZN3aaa9GG3311223E", // class name
  bases__ZN3aaa9GG3311223E, 6,
  &(vtc__ZN3aaa9GG3311223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311231  : ::aaa::EE331 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33112313fooEv
  ~GG3311231(); // tgen
  GG3311231(); // tgen
};
//SIG(1 _ZN3aaa9GG3311231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33112313fooEv");}
aaa::GG3311231 ::~GG3311231(){ note_dtor("_ZN3aaa9GG3311231E", this);} // tgen
aaa::GG3311231 ::GG3311231(){ note_ctor("_ZN3aaa9GG3311231E", this);} // tgen
}
static void Test__ZN3aaa9GG3311231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311231E, buf);
    ::aaa::GG3311231 *dp, &lv = *(dp=new (buf) ::aaa::GG3311231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311231E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3311231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3311231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3311231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311231E);
    dp->::aaa::GG3311231::~GG3311231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311231E(Test__ZN3aaa9GG3311231E, "_ZN3aaa9GG3311231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311231C1Ev();
extern void _ZN3aaa9GG3311231D1Ev();
Name_Map name_map__ZN3aaa9GG3311231E[] = {
  NSPAIR(_ZN3aaa9GG3311231C1Ev),
  NSPAIR(_ZN3aaa9GG3311231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3311231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311231E[];
extern void _ZN3aaa9GG33112313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33112313fooEv,_ZThn8_N3aaa9GG33112313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33112313fooEv,_ZThn20_N3aaa9GG33112313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33112313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112313fooEv,_ZThn8_N3aaa9GG33112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112313fooEv,_ZThn20_N3aaa9GG33112313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311231E[];
Class_Descriptor cd__ZN3aaa9GG3311231E = {  "_ZN3aaa9GG3311231E", // class name
  bases__ZN3aaa9GG3311231E, 6,
  &(vtc__ZN3aaa9GG3311231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311232  : ::aaa::EE331 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33112323barEv
  ~GG3311232(); // tgen
  GG3311232(); // tgen
};
//SIG(1 _ZN3aaa9GG3311232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33112323barEv");}
aaa::GG3311232 ::~GG3311232(){ note_dtor("_ZN3aaa9GG3311232E", this);} // tgen
aaa::GG3311232 ::GG3311232(){ note_ctor("_ZN3aaa9GG3311232E", this);} // tgen
}
static void Test__ZN3aaa9GG3311232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311232E, buf);
    ::aaa::GG3311232 *dp, &lv = *(dp=new (buf) ::aaa::GG3311232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311232E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3311232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3311232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3311232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311232E);
    dp->::aaa::GG3311232::~GG3311232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311232E(Test__ZN3aaa9GG3311232E, "_ZN3aaa9GG3311232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311232C1Ev();
extern void _ZN3aaa9GG3311232D1Ev();
Name_Map name_map__ZN3aaa9GG3311232E[] = {
  NSPAIR(_ZN3aaa9GG3311232C1Ev),
  NSPAIR(_ZN3aaa9GG3311232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3311232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311232E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33112323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33112323barEv,_ZThn8_N3aaa9GG33112323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33112323barEv,_ZThn20_N3aaa9GG33112323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33112323barEv,_ZThn28_N3aaa9GG33112323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33112323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112323barEv,_ZThn8_N3aaa9GG33112323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112323barEv,_ZThn20_N3aaa9GG33112323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33112323barEv,_ZThn28_N3aaa9GG33112323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311232E[];
Class_Descriptor cd__ZN3aaa9GG3311232E = {  "_ZN3aaa9GG3311232E", // class name
  bases__ZN3aaa9GG3311232E, 6,
  &(vtc__ZN3aaa9GG3311232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311233  : ::aaa::EE331 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33112333fooEv
  virtual void  bar(); // _ZN3aaa9GG33112333barEv
  ~GG3311233(); // tgen
  GG3311233(); // tgen
};
//SIG(1 _ZN3aaa9GG3311233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33112333fooEv");}
void  aaa::GG3311233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33112333barEv");}
aaa::GG3311233 ::~GG3311233(){ note_dtor("_ZN3aaa9GG3311233E", this);} // tgen
aaa::GG3311233 ::GG3311233(){ note_ctor("_ZN3aaa9GG3311233E", this);} // tgen
}
static void Test__ZN3aaa9GG3311233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311233E, buf);
    ::aaa::GG3311233 *dp, &lv = *(dp=new (buf) ::aaa::GG3311233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311233E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3311233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3311233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3311233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311233E);
    dp->::aaa::GG3311233::~GG3311233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311233E(Test__ZN3aaa9GG3311233E, "_ZN3aaa9GG3311233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311233C1Ev();
extern void _ZN3aaa9GG3311233D1Ev();
Name_Map name_map__ZN3aaa9GG3311233E[] = {
  NSPAIR(_ZN3aaa9GG3311233C1Ev),
  NSPAIR(_ZN3aaa9GG3311233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3311233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311233E[];
extern void _ZN3aaa9GG33112333fooEv();
extern void _ZN3aaa9GG33112333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33112333fooEv,_ZThn8_N3aaa9GG33112333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33112333barEv,_ZThn8_N3aaa9GG33112333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33112333fooEv,_ZThn20_N3aaa9GG33112333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33112333barEv,_ZThn20_N3aaa9GG33112333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33112333barEv,_ZThn28_N3aaa9GG33112333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33112333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33112333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112333fooEv,_ZThn8_N3aaa9GG33112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33112333barEv,_ZThn8_N3aaa9GG33112333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112333fooEv,_ZThn20_N3aaa9GG33112333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33112333barEv,_ZThn20_N3aaa9GG33112333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33112333barEv,_ZThn28_N3aaa9GG33112333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311233E[];
Class_Descriptor cd__ZN3aaa9GG3311233E = {  "_ZN3aaa9GG3311233E", // class name
  bases__ZN3aaa9GG3311233E, 6,
  &(vtc__ZN3aaa9GG3311233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311311  : ::aaa::EE331 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33113113fooEv
  ~GG3311311(); // tgen
  GG3311311(); // tgen
};
//SIG(1 _ZN3aaa9GG3311311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33113113fooEv");}
aaa::GG3311311 ::~GG3311311(){ note_dtor("_ZN3aaa9GG3311311E", this);} // tgen
aaa::GG3311311 ::GG3311311(){ note_ctor("_ZN3aaa9GG3311311E", this);} // tgen
}
static void Test__ZN3aaa9GG3311311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311311E, buf);
    ::aaa::GG3311311 *dp, &lv = *(dp=new (buf) ::aaa::GG3311311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311311E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3311311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3311311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3311311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311311E);
    dp->::aaa::GG3311311::~GG3311311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311311E(Test__ZN3aaa9GG3311311E, "_ZN3aaa9GG3311311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311311C1Ev();
extern void _ZN3aaa9GG3311311D1Ev();
Name_Map name_map__ZN3aaa9GG3311311E[] = {
  NSPAIR(_ZN3aaa9GG3311311C1Ev),
  NSPAIR(_ZN3aaa9GG3311311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3311311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311311E[];
extern void _ZN3aaa9GG33113113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33113113fooEv,_ZThn8_N3aaa9GG33113113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33113113fooEv,_ZThn20_N3aaa9GG33113113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113113fooEv,_ZThn28_N3aaa9GG33113113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33113113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113113fooEv,_ZThn8_N3aaa9GG33113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113113fooEv,_ZThn20_N3aaa9GG33113113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113113fooEv,_ZThn28_N3aaa9GG33113113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311311E[];
Class_Descriptor cd__ZN3aaa9GG3311311E = {  "_ZN3aaa9GG3311311E", // class name
  bases__ZN3aaa9GG3311311E, 6,
  &(vtc__ZN3aaa9GG3311311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311312  : ::aaa::EE331 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33113123barEv
  ~GG3311312(); // tgen
  GG3311312(); // tgen
};
//SIG(1 _ZN3aaa9GG3311312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33113123barEv");}
aaa::GG3311312 ::~GG3311312(){ note_dtor("_ZN3aaa9GG3311312E", this);} // tgen
aaa::GG3311312 ::GG3311312(){ note_ctor("_ZN3aaa9GG3311312E", this);} // tgen
}
static void Test__ZN3aaa9GG3311312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311312E, buf);
    ::aaa::GG3311312 *dp, &lv = *(dp=new (buf) ::aaa::GG3311312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311312E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3311312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3311312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3311312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311312E);
    dp->::aaa::GG3311312::~GG3311312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311312E(Test__ZN3aaa9GG3311312E, "_ZN3aaa9GG3311312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311312C1Ev();
extern void _ZN3aaa9GG3311312D1Ev();
Name_Map name_map__ZN3aaa9GG3311312E[] = {
  NSPAIR(_ZN3aaa9GG3311312C1Ev),
  NSPAIR(_ZN3aaa9GG3311312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3311312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311312E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33113123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33113123barEv,_ZThn8_N3aaa9GG33113123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113123barEv,_ZThn28_N3aaa9GG33113123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33113123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113123barEv,_ZThn8_N3aaa9GG33113123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113123barEv,_ZThn28_N3aaa9GG33113123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311312E[];
Class_Descriptor cd__ZN3aaa9GG3311312E = {  "_ZN3aaa9GG3311312E", // class name
  bases__ZN3aaa9GG3311312E, 6,
  &(vtc__ZN3aaa9GG3311312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311313  : ::aaa::EE331 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33113133fooEv
  virtual void  bar(); // _ZN3aaa9GG33113133barEv
  ~GG3311313(); // tgen
  GG3311313(); // tgen
};
//SIG(1 _ZN3aaa9GG3311313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33113133fooEv");}
void  aaa::GG3311313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33113133barEv");}
aaa::GG3311313 ::~GG3311313(){ note_dtor("_ZN3aaa9GG3311313E", this);} // tgen
aaa::GG3311313 ::GG3311313(){ note_ctor("_ZN3aaa9GG3311313E", this);} // tgen
}
static void Test__ZN3aaa9GG3311313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311313E, buf);
    ::aaa::GG3311313 *dp, &lv = *(dp=new (buf) ::aaa::GG3311313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311313E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3311313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3311313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3311313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311313E);
    dp->::aaa::GG3311313::~GG3311313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311313E(Test__ZN3aaa9GG3311313E, "_ZN3aaa9GG3311313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311313C1Ev();
extern void _ZN3aaa9GG3311313D1Ev();
Name_Map name_map__ZN3aaa9GG3311313E[] = {
  NSPAIR(_ZN3aaa9GG3311313C1Ev),
  NSPAIR(_ZN3aaa9GG3311313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3311313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311313E[];
extern void _ZN3aaa9GG33113133fooEv();
extern void _ZN3aaa9GG33113133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33113133fooEv,_ZThn8_N3aaa9GG33113133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33113133barEv,_ZThn8_N3aaa9GG33113133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33113133fooEv,_ZThn20_N3aaa9GG33113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113133fooEv,_ZThn28_N3aaa9GG33113133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113133barEv,_ZThn28_N3aaa9GG33113133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33113133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33113133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113133fooEv,_ZThn8_N3aaa9GG33113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113133barEv,_ZThn8_N3aaa9GG33113133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113133fooEv,_ZThn20_N3aaa9GG33113133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113133fooEv,_ZThn28_N3aaa9GG33113133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113133barEv,_ZThn28_N3aaa9GG33113133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311313E[];
Class_Descriptor cd__ZN3aaa9GG3311313E = {  "_ZN3aaa9GG3311313E", // class name
  bases__ZN3aaa9GG3311313E, 6,
  &(vtc__ZN3aaa9GG3311313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311321  : ::aaa::EE331 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33113213fooEv
  ~GG3311321(); // tgen
  GG3311321(); // tgen
};
//SIG(1 _ZN3aaa9GG3311321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33113213fooEv");}
aaa::GG3311321 ::~GG3311321(){ note_dtor("_ZN3aaa9GG3311321E", this);} // tgen
aaa::GG3311321 ::GG3311321(){ note_ctor("_ZN3aaa9GG3311321E", this);} // tgen
}
static void Test__ZN3aaa9GG3311321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311321E, buf);
    ::aaa::GG3311321 *dp, &lv = *(dp=new (buf) ::aaa::GG3311321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311321E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3311321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3311321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3311321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311321E);
    dp->::aaa::GG3311321::~GG3311321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311321E(Test__ZN3aaa9GG3311321E, "_ZN3aaa9GG3311321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311321C1Ev();
extern void _ZN3aaa9GG3311321D1Ev();
Name_Map name_map__ZN3aaa9GG3311321E[] = {
  NSPAIR(_ZN3aaa9GG3311321C1Ev),
  NSPAIR(_ZN3aaa9GG3311321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3311321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311321E[];
extern void _ZN3aaa9GG33113213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33113213fooEv,_ZThn8_N3aaa9GG33113213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33113213fooEv,_ZThn20_N3aaa9GG33113213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33113213fooEv,_ZThn28_N3aaa9GG33113213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33113213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113213fooEv,_ZThn8_N3aaa9GG33113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113213fooEv,_ZThn20_N3aaa9GG33113213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113213fooEv,_ZThn28_N3aaa9GG33113213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311321E[];
Class_Descriptor cd__ZN3aaa9GG3311321E = {  "_ZN3aaa9GG3311321E", // class name
  bases__ZN3aaa9GG3311321E, 6,
  &(vtc__ZN3aaa9GG3311321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311322  : ::aaa::EE331 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33113223barEv
  ~GG3311322(); // tgen
  GG3311322(); // tgen
};
//SIG(1 _ZN3aaa9GG3311322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33113223barEv");}
aaa::GG3311322 ::~GG3311322(){ note_dtor("_ZN3aaa9GG3311322E", this);} // tgen
aaa::GG3311322 ::GG3311322(){ note_ctor("_ZN3aaa9GG3311322E", this);} // tgen
}
static void Test__ZN3aaa9GG3311322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311322E, buf);
    ::aaa::GG3311322 *dp, &lv = *(dp=new (buf) ::aaa::GG3311322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311322E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3311322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3311322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3311322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311322E);
    dp->::aaa::GG3311322::~GG3311322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311322E(Test__ZN3aaa9GG3311322E, "_ZN3aaa9GG3311322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311322C1Ev();
extern void _ZN3aaa9GG3311322D1Ev();
Name_Map name_map__ZN3aaa9GG3311322E[] = {
  NSPAIR(_ZN3aaa9GG3311322C1Ev),
  NSPAIR(_ZN3aaa9GG3311322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3311322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311322E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33113223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33113223barEv,_ZThn8_N3aaa9GG33113223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33113223barEv,_ZThn20_N3aaa9GG33113223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33113223barEv,_ZThn28_N3aaa9GG33113223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33113223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113223barEv,_ZThn8_N3aaa9GG33113223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113223barEv,_ZThn20_N3aaa9GG33113223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113223barEv,_ZThn28_N3aaa9GG33113223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311322E[];
Class_Descriptor cd__ZN3aaa9GG3311322E = {  "_ZN3aaa9GG3311322E", // class name
  bases__ZN3aaa9GG3311322E, 6,
  &(vtc__ZN3aaa9GG3311322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311323  : ::aaa::EE331 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33113233fooEv
  virtual void  bar(); // _ZN3aaa9GG33113233barEv
  ~GG3311323(); // tgen
  GG3311323(); // tgen
};
//SIG(1 _ZN3aaa9GG3311323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33113233fooEv");}
void  aaa::GG3311323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33113233barEv");}
aaa::GG3311323 ::~GG3311323(){ note_dtor("_ZN3aaa9GG3311323E", this);} // tgen
aaa::GG3311323 ::GG3311323(){ note_ctor("_ZN3aaa9GG3311323E", this);} // tgen
}
static void Test__ZN3aaa9GG3311323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311323E, buf);
    ::aaa::GG3311323 *dp, &lv = *(dp=new (buf) ::aaa::GG3311323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311323E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3311323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3311323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3311323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311323E);
    dp->::aaa::GG3311323::~GG3311323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311323E(Test__ZN3aaa9GG3311323E, "_ZN3aaa9GG3311323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311323C1Ev();
extern void _ZN3aaa9GG3311323D1Ev();
Name_Map name_map__ZN3aaa9GG3311323E[] = {
  NSPAIR(_ZN3aaa9GG3311323C1Ev),
  NSPAIR(_ZN3aaa9GG3311323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3311323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311323E[];
extern void _ZN3aaa9GG33113233fooEv();
extern void _ZN3aaa9GG33113233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33113233fooEv,_ZThn8_N3aaa9GG33113233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33113233barEv,_ZThn8_N3aaa9GG33113233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33113233fooEv,_ZThn20_N3aaa9GG33113233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33113233barEv,_ZThn20_N3aaa9GG33113233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113233fooEv,_ZThn28_N3aaa9GG33113233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113233barEv,_ZThn28_N3aaa9GG33113233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33113233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33113233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113233fooEv,_ZThn8_N3aaa9GG33113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113233barEv,_ZThn8_N3aaa9GG33113233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113233fooEv,_ZThn20_N3aaa9GG33113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113233barEv,_ZThn20_N3aaa9GG33113233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113233fooEv,_ZThn28_N3aaa9GG33113233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113233barEv,_ZThn28_N3aaa9GG33113233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311323E[];
Class_Descriptor cd__ZN3aaa9GG3311323E = {  "_ZN3aaa9GG3311323E", // class name
  bases__ZN3aaa9GG3311323E, 6,
  &(vtc__ZN3aaa9GG3311323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311331  : ::aaa::EE331 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33113313fooEv
  ~GG3311331(); // tgen
  GG3311331(); // tgen
};
//SIG(1 _ZN3aaa9GG3311331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33113313fooEv");}
aaa::GG3311331 ::~GG3311331(){ note_dtor("_ZN3aaa9GG3311331E", this);} // tgen
aaa::GG3311331 ::GG3311331(){ note_ctor("_ZN3aaa9GG3311331E", this);} // tgen
}
static void Test__ZN3aaa9GG3311331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311331E, buf);
    ::aaa::GG3311331 *dp, &lv = *(dp=new (buf) ::aaa::GG3311331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311331E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3311331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3311331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3311331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311331E);
    dp->::aaa::GG3311331::~GG3311331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311331E(Test__ZN3aaa9GG3311331E, "_ZN3aaa9GG3311331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311331C1Ev();
extern void _ZN3aaa9GG3311331D1Ev();
Name_Map name_map__ZN3aaa9GG3311331E[] = {
  NSPAIR(_ZN3aaa9GG3311331C1Ev),
  NSPAIR(_ZN3aaa9GG3311331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3311331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311331E[];
extern void _ZN3aaa9GG33113313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33113313fooEv,_ZThn8_N3aaa9GG33113313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33113313fooEv,_ZThn20_N3aaa9GG33113313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33113313fooEv,_ZThn28_N3aaa9GG33113313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33113313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113313fooEv,_ZThn8_N3aaa9GG33113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113313fooEv,_ZThn20_N3aaa9GG33113313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113313fooEv,_ZThn28_N3aaa9GG33113313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311331E[];
Class_Descriptor cd__ZN3aaa9GG3311331E = {  "_ZN3aaa9GG3311331E", // class name
  bases__ZN3aaa9GG3311331E, 6,
  &(vtc__ZN3aaa9GG3311331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311332  : ::aaa::EE331 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33113323barEv
  ~GG3311332(); // tgen
  GG3311332(); // tgen
};
//SIG(1 _ZN3aaa9GG3311332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3311332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33113323barEv");}
aaa::GG3311332 ::~GG3311332(){ note_dtor("_ZN3aaa9GG3311332E", this);} // tgen
aaa::GG3311332 ::GG3311332(){ note_ctor("_ZN3aaa9GG3311332E", this);} // tgen
}
static void Test__ZN3aaa9GG3311332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311332E, buf);
    ::aaa::GG3311332 *dp, &lv = *(dp=new (buf) ::aaa::GG3311332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311332E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3311332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3311332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3311332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311332E);
    dp->::aaa::GG3311332::~GG3311332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311332E(Test__ZN3aaa9GG3311332E, "_ZN3aaa9GG3311332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311332C1Ev();
extern void _ZN3aaa9GG3311332D1Ev();
Name_Map name_map__ZN3aaa9GG3311332E[] = {
  NSPAIR(_ZN3aaa9GG3311332C1Ev),
  NSPAIR(_ZN3aaa9GG3311332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3311332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311332E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33113323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33113323barEv,_ZThn8_N3aaa9GG33113323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33113323barEv,_ZThn20_N3aaa9GG33113323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113323barEv,_ZThn28_N3aaa9GG33113323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33113323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113323barEv,_ZThn8_N3aaa9GG33113323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113323barEv,_ZThn20_N3aaa9GG33113323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113323barEv,_ZThn28_N3aaa9GG33113323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311332E[];
Class_Descriptor cd__ZN3aaa9GG3311332E = {  "_ZN3aaa9GG3311332E", // class name
  bases__ZN3aaa9GG3311332E, 6,
  &(vtc__ZN3aaa9GG3311332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3311333  : ::aaa::EE331 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33113333fooEv
  virtual void  bar(); // _ZN3aaa9GG33113333barEv
  ~GG3311333(); // tgen
  GG3311333(); // tgen
};
//SIG(1 _ZN3aaa9GG3311333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3311333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33113333fooEv");}
void  aaa::GG3311333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33113333barEv");}
aaa::GG3311333 ::~GG3311333(){ note_dtor("_ZN3aaa9GG3311333E", this);} // tgen
aaa::GG3311333 ::GG3311333(){ note_ctor("_ZN3aaa9GG3311333E", this);} // tgen
}
static void Test__ZN3aaa9GG3311333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3311333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3311333E, buf);
    ::aaa::GG3311333 *dp, &lv = *(dp=new (buf) ::aaa::GG3311333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3311333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3311333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3311333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3311333E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3311333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3311333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3311333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3311333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3311333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3311333E);
    dp->::aaa::GG3311333::~GG3311333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3311333E(Test__ZN3aaa9GG3311333E, "_ZN3aaa9GG3311333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3311333C1Ev();
extern void _ZN3aaa9GG3311333D1Ev();
Name_Map name_map__ZN3aaa9GG3311333E[] = {
  NSPAIR(_ZN3aaa9GG3311333C1Ev),
  NSPAIR(_ZN3aaa9GG3311333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3311333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3311333E[];
extern void _ZN3aaa9GG33113333fooEv();
extern void _ZN3aaa9GG33113333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33113333fooEv,_ZThn8_N3aaa9GG33113333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33113333barEv,_ZThn8_N3aaa9GG33113333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33113333fooEv,_ZThn20_N3aaa9GG33113333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33113333barEv,_ZThn20_N3aaa9GG33113333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113333fooEv,_ZThn28_N3aaa9GG33113333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33113333barEv,_ZThn28_N3aaa9GG33113333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3311333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33113333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33113333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113333fooEv,_ZThn8_N3aaa9GG33113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33113333barEv,_ZThn8_N3aaa9GG33113333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113333fooEv,_ZThn20_N3aaa9GG33113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33113333barEv,_ZThn20_N3aaa9GG33113333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3311333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113333fooEv,_ZThn28_N3aaa9GG33113333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33113333barEv,_ZThn28_N3aaa9GG33113333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3311333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3311333E[];
Class_Descriptor cd__ZN3aaa9GG3311333E = {  "_ZN3aaa9GG3311333E", // class name
  bases__ZN3aaa9GG3311333E, 6,
  &(vtc__ZN3aaa9GG3311333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3311333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3311333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312111  : ::aaa::EE331 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33121113fooEv
  ~GG3312111(); // tgen
  GG3312111(); // tgen
};
//SIG(1 _ZN3aaa9GG3312111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33121113fooEv");}
aaa::GG3312111 ::~GG3312111(){ note_dtor("_ZN3aaa9GG3312111E", this);} // tgen
aaa::GG3312111 ::GG3312111(){ note_ctor("_ZN3aaa9GG3312111E", this);} // tgen
}
static void Test__ZN3aaa9GG3312111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312111E, buf);
    ::aaa::GG3312111 *dp, &lv = *(dp=new (buf) ::aaa::GG3312111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312111E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3312111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3312111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3312111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312111E);
    dp->::aaa::GG3312111::~GG3312111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312111E(Test__ZN3aaa9GG3312111E, "_ZN3aaa9GG3312111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312111C1Ev();
extern void _ZN3aaa9GG3312111D1Ev();
Name_Map name_map__ZN3aaa9GG3312111E[] = {
  NSPAIR(_ZN3aaa9GG3312111C1Ev),
  NSPAIR(_ZN3aaa9GG3312111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3312111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312111E[];
extern void _ZN3aaa9GG33121113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33121113fooEv,_ZThn8_N3aaa9GG33121113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33121113fooEv,_ZThn20_N3aaa9GG33121113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33121113fooEv,_ZThn28_N3aaa9GG33121113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33121113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121113fooEv,_ZThn8_N3aaa9GG33121113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121113fooEv,_ZThn20_N3aaa9GG33121113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33121113fooEv,_ZThn28_N3aaa9GG33121113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312111E[];
Class_Descriptor cd__ZN3aaa9GG3312111E = {  "_ZN3aaa9GG3312111E", // class name
  bases__ZN3aaa9GG3312111E, 6,
  &(vtc__ZN3aaa9GG3312111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312112  : ::aaa::EE331 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33121123barEv
  ~GG3312112(); // tgen
  GG3312112(); // tgen
};
//SIG(1 _ZN3aaa9GG3312112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33121123barEv");}
aaa::GG3312112 ::~GG3312112(){ note_dtor("_ZN3aaa9GG3312112E", this);} // tgen
aaa::GG3312112 ::GG3312112(){ note_ctor("_ZN3aaa9GG3312112E", this);} // tgen
}
static void Test__ZN3aaa9GG3312112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312112E, buf);
    ::aaa::GG3312112 *dp, &lv = *(dp=new (buf) ::aaa::GG3312112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312112E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3312112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3312112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3312112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312112E);
    dp->::aaa::GG3312112::~GG3312112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312112E(Test__ZN3aaa9GG3312112E, "_ZN3aaa9GG3312112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312112C1Ev();
extern void _ZN3aaa9GG3312112D1Ev();
Name_Map name_map__ZN3aaa9GG3312112E[] = {
  NSPAIR(_ZN3aaa9GG3312112C1Ev),
  NSPAIR(_ZN3aaa9GG3312112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3312112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312112E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33121123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33121123barEv,_ZThn8_N3aaa9GG33121123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33121123barEv,_ZThn20_N3aaa9GG33121123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33121123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121123barEv,_ZThn8_N3aaa9GG33121123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121123barEv,_ZThn20_N3aaa9GG33121123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312112E[];
Class_Descriptor cd__ZN3aaa9GG3312112E = {  "_ZN3aaa9GG3312112E", // class name
  bases__ZN3aaa9GG3312112E, 6,
  &(vtc__ZN3aaa9GG3312112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312113  : ::aaa::EE331 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33121133fooEv
  virtual void  bar(); // _ZN3aaa9GG33121133barEv
  ~GG3312113(); // tgen
  GG3312113(); // tgen
};
//SIG(1 _ZN3aaa9GG3312113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33121133fooEv");}
void  aaa::GG3312113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33121133barEv");}
aaa::GG3312113 ::~GG3312113(){ note_dtor("_ZN3aaa9GG3312113E", this);} // tgen
aaa::GG3312113 ::GG3312113(){ note_ctor("_ZN3aaa9GG3312113E", this);} // tgen
}
static void Test__ZN3aaa9GG3312113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312113E, buf);
    ::aaa::GG3312113 *dp, &lv = *(dp=new (buf) ::aaa::GG3312113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312113E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3312113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3312113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3312113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312113E);
    dp->::aaa::GG3312113::~GG3312113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312113E(Test__ZN3aaa9GG3312113E, "_ZN3aaa9GG3312113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312113C1Ev();
extern void _ZN3aaa9GG3312113D1Ev();
Name_Map name_map__ZN3aaa9GG3312113E[] = {
  NSPAIR(_ZN3aaa9GG3312113C1Ev),
  NSPAIR(_ZN3aaa9GG3312113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3312113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312113E[];
extern void _ZN3aaa9GG33121133fooEv();
extern void _ZN3aaa9GG33121133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33121133fooEv,_ZThn8_N3aaa9GG33121133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33121133barEv,_ZThn8_N3aaa9GG33121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33121133barEv,_ZThn20_N3aaa9GG33121133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33121133fooEv,_ZThn20_N3aaa9GG33121133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33121133fooEv,_ZThn28_N3aaa9GG33121133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33121133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33121133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121133fooEv,_ZThn8_N3aaa9GG33121133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121133barEv,_ZThn8_N3aaa9GG33121133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121133barEv,_ZThn20_N3aaa9GG33121133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121133fooEv,_ZThn20_N3aaa9GG33121133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33121133fooEv,_ZThn28_N3aaa9GG33121133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312113E[];
Class_Descriptor cd__ZN3aaa9GG3312113E = {  "_ZN3aaa9GG3312113E", // class name
  bases__ZN3aaa9GG3312113E, 6,
  &(vtc__ZN3aaa9GG3312113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312121  : ::aaa::EE331 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33121213fooEv
  ~GG3312121(); // tgen
  GG3312121(); // tgen
};
//SIG(1 _ZN3aaa9GG3312121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33121213fooEv");}
aaa::GG3312121 ::~GG3312121(){ note_dtor("_ZN3aaa9GG3312121E", this);} // tgen
aaa::GG3312121 ::GG3312121(){ note_ctor("_ZN3aaa9GG3312121E", this);} // tgen
}
static void Test__ZN3aaa9GG3312121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312121E, buf);
    ::aaa::GG3312121 *dp, &lv = *(dp=new (buf) ::aaa::GG3312121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312121E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3312121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3312121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3312121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312121E);
    dp->::aaa::GG3312121::~GG3312121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312121E(Test__ZN3aaa9GG3312121E, "_ZN3aaa9GG3312121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312121C1Ev();
extern void _ZN3aaa9GG3312121D1Ev();
Name_Map name_map__ZN3aaa9GG3312121E[] = {
  NSPAIR(_ZN3aaa9GG3312121C1Ev),
  NSPAIR(_ZN3aaa9GG3312121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3312121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312121E[];
extern void _ZN3aaa9GG33121213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33121213fooEv,_ZThn8_N3aaa9GG33121213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33121213fooEv,_ZThn28_N3aaa9GG33121213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33121213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121213fooEv,_ZThn8_N3aaa9GG33121213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33121213fooEv,_ZThn28_N3aaa9GG33121213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312121E[];
Class_Descriptor cd__ZN3aaa9GG3312121E = {  "_ZN3aaa9GG3312121E", // class name
  bases__ZN3aaa9GG3312121E, 6,
  &(vtc__ZN3aaa9GG3312121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312122  : ::aaa::EE331 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33121223barEv
  ~GG3312122(); // tgen
  GG3312122(); // tgen
};
//SIG(1 _ZN3aaa9GG3312122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33121223barEv");}
aaa::GG3312122 ::~GG3312122(){ note_dtor("_ZN3aaa9GG3312122E", this);} // tgen
aaa::GG3312122 ::GG3312122(){ note_ctor("_ZN3aaa9GG3312122E", this);} // tgen
}
static void Test__ZN3aaa9GG3312122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312122E, buf);
    ::aaa::GG3312122 *dp, &lv = *(dp=new (buf) ::aaa::GG3312122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312122E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3312122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3312122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3312122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312122E);
    dp->::aaa::GG3312122::~GG3312122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312122E(Test__ZN3aaa9GG3312122E, "_ZN3aaa9GG3312122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312122C1Ev();
extern void _ZN3aaa9GG3312122D1Ev();
Name_Map name_map__ZN3aaa9GG3312122E[] = {
  NSPAIR(_ZN3aaa9GG3312122C1Ev),
  NSPAIR(_ZN3aaa9GG3312122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3312122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312122E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33121223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33121223barEv,_ZThn8_N3aaa9GG33121223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33121223barEv,_ZThn20_N3aaa9GG33121223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33121223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121223barEv,_ZThn8_N3aaa9GG33121223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121223barEv,_ZThn20_N3aaa9GG33121223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312122E[];
Class_Descriptor cd__ZN3aaa9GG3312122E = {  "_ZN3aaa9GG3312122E", // class name
  bases__ZN3aaa9GG3312122E, 6,
  &(vtc__ZN3aaa9GG3312122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312123  : ::aaa::EE331 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33121233fooEv
  virtual void  bar(); // _ZN3aaa9GG33121233barEv
  ~GG3312123(); // tgen
  GG3312123(); // tgen
};
//SIG(1 _ZN3aaa9GG3312123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33121233fooEv");}
void  aaa::GG3312123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33121233barEv");}
aaa::GG3312123 ::~GG3312123(){ note_dtor("_ZN3aaa9GG3312123E", this);} // tgen
aaa::GG3312123 ::GG3312123(){ note_ctor("_ZN3aaa9GG3312123E", this);} // tgen
}
static void Test__ZN3aaa9GG3312123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312123E, buf);
    ::aaa::GG3312123 *dp, &lv = *(dp=new (buf) ::aaa::GG3312123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312123E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3312123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3312123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3312123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312123E);
    dp->::aaa::GG3312123::~GG3312123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312123E(Test__ZN3aaa9GG3312123E, "_ZN3aaa9GG3312123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312123C1Ev();
extern void _ZN3aaa9GG3312123D1Ev();
Name_Map name_map__ZN3aaa9GG3312123E[] = {
  NSPAIR(_ZN3aaa9GG3312123C1Ev),
  NSPAIR(_ZN3aaa9GG3312123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3312123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312123E[];
extern void _ZN3aaa9GG33121233fooEv();
extern void _ZN3aaa9GG33121233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33121233fooEv,_ZThn8_N3aaa9GG33121233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33121233barEv,_ZThn8_N3aaa9GG33121233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33121233barEv,_ZThn20_N3aaa9GG33121233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33121233fooEv,_ZThn28_N3aaa9GG33121233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33121233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33121233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121233fooEv,_ZThn8_N3aaa9GG33121233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121233barEv,_ZThn8_N3aaa9GG33121233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121233barEv,_ZThn20_N3aaa9GG33121233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33121233fooEv,_ZThn28_N3aaa9GG33121233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312123E[];
Class_Descriptor cd__ZN3aaa9GG3312123E = {  "_ZN3aaa9GG3312123E", // class name
  bases__ZN3aaa9GG3312123E, 6,
  &(vtc__ZN3aaa9GG3312123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312131  : ::aaa::EE331 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33121313fooEv
  ~GG3312131(); // tgen
  GG3312131(); // tgen
};
//SIG(1 _ZN3aaa9GG3312131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33121313fooEv");}
aaa::GG3312131 ::~GG3312131(){ note_dtor("_ZN3aaa9GG3312131E", this);} // tgen
aaa::GG3312131 ::GG3312131(){ note_ctor("_ZN3aaa9GG3312131E", this);} // tgen
}
static void Test__ZN3aaa9GG3312131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312131E, buf);
    ::aaa::GG3312131 *dp, &lv = *(dp=new (buf) ::aaa::GG3312131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312131E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3312131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3312131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3312131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312131E);
    dp->::aaa::GG3312131::~GG3312131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312131E(Test__ZN3aaa9GG3312131E, "_ZN3aaa9GG3312131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312131C1Ev();
extern void _ZN3aaa9GG3312131D1Ev();
Name_Map name_map__ZN3aaa9GG3312131E[] = {
  NSPAIR(_ZN3aaa9GG3312131C1Ev),
  NSPAIR(_ZN3aaa9GG3312131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3312131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312131E[];
extern void _ZN3aaa9GG33121313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33121313fooEv,_ZThn8_N3aaa9GG33121313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33121313fooEv,_ZThn20_N3aaa9GG33121313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33121313fooEv,_ZThn28_N3aaa9GG33121313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33121313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121313fooEv,_ZThn8_N3aaa9GG33121313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121313fooEv,_ZThn20_N3aaa9GG33121313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33121313fooEv,_ZThn28_N3aaa9GG33121313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312131E[];
Class_Descriptor cd__ZN3aaa9GG3312131E = {  "_ZN3aaa9GG3312131E", // class name
  bases__ZN3aaa9GG3312131E, 6,
  &(vtc__ZN3aaa9GG3312131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312132  : ::aaa::EE331 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33121323barEv
  ~GG3312132(); // tgen
  GG3312132(); // tgen
};
//SIG(1 _ZN3aaa9GG3312132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33121323barEv");}
aaa::GG3312132 ::~GG3312132(){ note_dtor("_ZN3aaa9GG3312132E", this);} // tgen
aaa::GG3312132 ::GG3312132(){ note_ctor("_ZN3aaa9GG3312132E", this);} // tgen
}
static void Test__ZN3aaa9GG3312132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312132E, buf);
    ::aaa::GG3312132 *dp, &lv = *(dp=new (buf) ::aaa::GG3312132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312132E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3312132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3312132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3312132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312132E);
    dp->::aaa::GG3312132::~GG3312132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312132E(Test__ZN3aaa9GG3312132E, "_ZN3aaa9GG3312132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312132C1Ev();
extern void _ZN3aaa9GG3312132D1Ev();
Name_Map name_map__ZN3aaa9GG3312132E[] = {
  NSPAIR(_ZN3aaa9GG3312132C1Ev),
  NSPAIR(_ZN3aaa9GG3312132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3312132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312132E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33121323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33121323barEv,_ZThn8_N3aaa9GG33121323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33121323barEv,_ZThn20_N3aaa9GG33121323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33121323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121323barEv,_ZThn8_N3aaa9GG33121323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121323barEv,_ZThn20_N3aaa9GG33121323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312132E[];
Class_Descriptor cd__ZN3aaa9GG3312132E = {  "_ZN3aaa9GG3312132E", // class name
  bases__ZN3aaa9GG3312132E, 6,
  &(vtc__ZN3aaa9GG3312132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312133  : ::aaa::EE331 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33121333fooEv
  virtual void  bar(); // _ZN3aaa9GG33121333barEv
  ~GG3312133(); // tgen
  GG3312133(); // tgen
};
//SIG(1 _ZN3aaa9GG3312133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33121333fooEv");}
void  aaa::GG3312133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33121333barEv");}
aaa::GG3312133 ::~GG3312133(){ note_dtor("_ZN3aaa9GG3312133E", this);} // tgen
aaa::GG3312133 ::GG3312133(){ note_ctor("_ZN3aaa9GG3312133E", this);} // tgen
}
static void Test__ZN3aaa9GG3312133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312133E, buf);
    ::aaa::GG3312133 *dp, &lv = *(dp=new (buf) ::aaa::GG3312133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312133E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3312133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3312133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3312133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312133E);
    dp->::aaa::GG3312133::~GG3312133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312133E(Test__ZN3aaa9GG3312133E, "_ZN3aaa9GG3312133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312133C1Ev();
extern void _ZN3aaa9GG3312133D1Ev();
Name_Map name_map__ZN3aaa9GG3312133E[] = {
  NSPAIR(_ZN3aaa9GG3312133C1Ev),
  NSPAIR(_ZN3aaa9GG3312133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3312133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312133E[];
extern void _ZN3aaa9GG33121333fooEv();
extern void _ZN3aaa9GG33121333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33121333fooEv,_ZThn8_N3aaa9GG33121333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33121333barEv,_ZThn8_N3aaa9GG33121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33121333barEv,_ZThn20_N3aaa9GG33121333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33121333fooEv,_ZThn20_N3aaa9GG33121333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33121333fooEv,_ZThn28_N3aaa9GG33121333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33121333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33121333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121333fooEv,_ZThn8_N3aaa9GG33121333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33121333barEv,_ZThn8_N3aaa9GG33121333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121333barEv,_ZThn20_N3aaa9GG33121333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33121333fooEv,_ZThn20_N3aaa9GG33121333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33121333fooEv,_ZThn28_N3aaa9GG33121333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312133E[];
Class_Descriptor cd__ZN3aaa9GG3312133E = {  "_ZN3aaa9GG3312133E", // class name
  bases__ZN3aaa9GG3312133E, 6,
  &(vtc__ZN3aaa9GG3312133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312211  : ::aaa::EE331 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33122113fooEv
  ~GG3312211(); // tgen
  GG3312211(); // tgen
};
//SIG(1 _ZN3aaa9GG3312211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v5 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33122113fooEv");}
aaa::GG3312211 ::~GG3312211(){ note_dtor("_ZN3aaa9GG3312211E", this);} // tgen
aaa::GG3312211 ::GG3312211(){ note_ctor("_ZN3aaa9GG3312211E", this);} // tgen
}
static void Test__ZN3aaa9GG3312211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312211E, buf);
    ::aaa::GG3312211 *dp, &lv = *(dp=new (buf) ::aaa::GG3312211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312211E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3312211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3312211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3312211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312211E);
    dp->::aaa::GG3312211::~GG3312211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312211E(Test__ZN3aaa9GG3312211E, "_ZN3aaa9GG3312211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312211C1Ev();
extern void _ZN3aaa9GG3312211D1Ev();
Name_Map name_map__ZN3aaa9GG3312211E[] = {
  NSPAIR(_ZN3aaa9GG3312211C1Ev),
  NSPAIR(_ZN3aaa9GG3312211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3312211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312211E[];
extern void _ZN3aaa9GG33122113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33122113fooEv,_ZThn8_N3aaa9GG33122113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33122113fooEv,_ZThn20_N3aaa9GG33122113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33122113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122113fooEv,_ZThn8_N3aaa9GG33122113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122113fooEv,_ZThn20_N3aaa9GG33122113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312211E[];
Class_Descriptor cd__ZN3aaa9GG3312211E = {  "_ZN3aaa9GG3312211E", // class name
  bases__ZN3aaa9GG3312211E, 6,
  &(vtc__ZN3aaa9GG3312211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312212  : ::aaa::EE331 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33122123barEv
  ~GG3312212(); // tgen
  GG3312212(); // tgen
};
//SIG(1 _ZN3aaa9GG3312212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33122123barEv");}
aaa::GG3312212 ::~GG3312212(){ note_dtor("_ZN3aaa9GG3312212E", this);} // tgen
aaa::GG3312212 ::GG3312212(){ note_ctor("_ZN3aaa9GG3312212E", this);} // tgen
}
static void Test__ZN3aaa9GG3312212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312212E, buf);
    ::aaa::GG3312212 *dp, &lv = *(dp=new (buf) ::aaa::GG3312212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312212E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3312212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3312212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3312212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312212E);
    dp->::aaa::GG3312212::~GG3312212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312212E(Test__ZN3aaa9GG3312212E, "_ZN3aaa9GG3312212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312212C1Ev();
extern void _ZN3aaa9GG3312212D1Ev();
Name_Map name_map__ZN3aaa9GG3312212E[] = {
  NSPAIR(_ZN3aaa9GG3312212C1Ev),
  NSPAIR(_ZN3aaa9GG3312212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3312212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312212E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33122123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33122123barEv,_ZThn8_N3aaa9GG33122123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33122123barEv,_ZThn20_N3aaa9GG33122123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33122123barEv,_ZThn28_N3aaa9GG33122123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33122123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122123barEv,_ZThn8_N3aaa9GG33122123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122123barEv,_ZThn20_N3aaa9GG33122123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33122123barEv,_ZThn28_N3aaa9GG33122123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312212E[];
Class_Descriptor cd__ZN3aaa9GG3312212E = {  "_ZN3aaa9GG3312212E", // class name
  bases__ZN3aaa9GG3312212E, 6,
  &(vtc__ZN3aaa9GG3312212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312213  : ::aaa::EE331 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33122133fooEv
  virtual void  bar(); // _ZN3aaa9GG33122133barEv
  ~GG3312213(); // tgen
  GG3312213(); // tgen
};
//SIG(1 _ZN3aaa9GG3312213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33122133fooEv");}
void  aaa::GG3312213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33122133barEv");}
aaa::GG3312213 ::~GG3312213(){ note_dtor("_ZN3aaa9GG3312213E", this);} // tgen
aaa::GG3312213 ::GG3312213(){ note_ctor("_ZN3aaa9GG3312213E", this);} // tgen
}
static void Test__ZN3aaa9GG3312213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312213E, buf);
    ::aaa::GG3312213 *dp, &lv = *(dp=new (buf) ::aaa::GG3312213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312213E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3312213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3312213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3312213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312213E);
    dp->::aaa::GG3312213::~GG3312213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312213E(Test__ZN3aaa9GG3312213E, "_ZN3aaa9GG3312213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312213C1Ev();
extern void _ZN3aaa9GG3312213D1Ev();
Name_Map name_map__ZN3aaa9GG3312213E[] = {
  NSPAIR(_ZN3aaa9GG3312213C1Ev),
  NSPAIR(_ZN3aaa9GG3312213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3312213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312213E[];
extern void _ZN3aaa9GG33122133fooEv();
extern void _ZN3aaa9GG33122133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33122133fooEv,_ZThn8_N3aaa9GG33122133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33122133barEv,_ZThn8_N3aaa9GG33122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33122133barEv,_ZThn20_N3aaa9GG33122133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33122133fooEv,_ZThn20_N3aaa9GG33122133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33122133barEv,_ZThn28_N3aaa9GG33122133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33122133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33122133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122133fooEv,_ZThn8_N3aaa9GG33122133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122133barEv,_ZThn8_N3aaa9GG33122133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122133barEv,_ZThn20_N3aaa9GG33122133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122133fooEv,_ZThn20_N3aaa9GG33122133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33122133barEv,_ZThn28_N3aaa9GG33122133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312213E[];
Class_Descriptor cd__ZN3aaa9GG3312213E = {  "_ZN3aaa9GG3312213E", // class name
  bases__ZN3aaa9GG3312213E, 6,
  &(vtc__ZN3aaa9GG3312213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312221  : ::aaa::EE331 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33122213fooEv
  ~GG3312221(); // tgen
  GG3312221(); // tgen
};
//SIG(1 _ZN3aaa9GG3312221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33122213fooEv");}
aaa::GG3312221 ::~GG3312221(){ note_dtor("_ZN3aaa9GG3312221E", this);} // tgen
aaa::GG3312221 ::GG3312221(){ note_ctor("_ZN3aaa9GG3312221E", this);} // tgen
}
static void Test__ZN3aaa9GG3312221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312221E, buf);
    ::aaa::GG3312221 *dp, &lv = *(dp=new (buf) ::aaa::GG3312221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312221E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3312221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3312221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3312221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312221E);
    dp->::aaa::GG3312221::~GG3312221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312221E(Test__ZN3aaa9GG3312221E, "_ZN3aaa9GG3312221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312221C1Ev();
extern void _ZN3aaa9GG3312221D1Ev();
Name_Map name_map__ZN3aaa9GG3312221E[] = {
  NSPAIR(_ZN3aaa9GG3312221C1Ev),
  NSPAIR(_ZN3aaa9GG3312221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3312221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312221E[];
extern void _ZN3aaa9GG33122213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33122213fooEv,_ZThn8_N3aaa9GG33122213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33122213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122213fooEv,_ZThn8_N3aaa9GG33122213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312221E[];
Class_Descriptor cd__ZN3aaa9GG3312221E = {  "_ZN3aaa9GG3312221E", // class name
  bases__ZN3aaa9GG3312221E, 6,
  &(vtc__ZN3aaa9GG3312221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312222  : ::aaa::EE331 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33122223barEv
  ~GG3312222(); // tgen
  GG3312222(); // tgen
};
//SIG(1 _ZN3aaa9GG3312222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33122223barEv");}
aaa::GG3312222 ::~GG3312222(){ note_dtor("_ZN3aaa9GG3312222E", this);} // tgen
aaa::GG3312222 ::GG3312222(){ note_ctor("_ZN3aaa9GG3312222E", this);} // tgen
}
static void Test__ZN3aaa9GG3312222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312222E, buf);
    ::aaa::GG3312222 *dp, &lv = *(dp=new (buf) ::aaa::GG3312222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312222E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3312222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3312222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3312222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312222E);
    dp->::aaa::GG3312222::~GG3312222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312222E(Test__ZN3aaa9GG3312222E, "_ZN3aaa9GG3312222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312222C1Ev();
extern void _ZN3aaa9GG3312222D1Ev();
Name_Map name_map__ZN3aaa9GG3312222E[] = {
  NSPAIR(_ZN3aaa9GG3312222C1Ev),
  NSPAIR(_ZN3aaa9GG3312222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3312222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312222E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33122223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33122223barEv,_ZThn8_N3aaa9GG33122223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33122223barEv,_ZThn20_N3aaa9GG33122223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33122223barEv,_ZThn28_N3aaa9GG33122223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33122223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122223barEv,_ZThn8_N3aaa9GG33122223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122223barEv,_ZThn20_N3aaa9GG33122223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33122223barEv,_ZThn28_N3aaa9GG33122223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312222E[];
Class_Descriptor cd__ZN3aaa9GG3312222E = {  "_ZN3aaa9GG3312222E", // class name
  bases__ZN3aaa9GG3312222E, 6,
  &(vtc__ZN3aaa9GG3312222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312223  : ::aaa::EE331 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33122233fooEv
  virtual void  bar(); // _ZN3aaa9GG33122233barEv
  ~GG3312223(); // tgen
  GG3312223(); // tgen
};
//SIG(1 _ZN3aaa9GG3312223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33122233fooEv");}
void  aaa::GG3312223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33122233barEv");}
aaa::GG3312223 ::~GG3312223(){ note_dtor("_ZN3aaa9GG3312223E", this);} // tgen
aaa::GG3312223 ::GG3312223(){ note_ctor("_ZN3aaa9GG3312223E", this);} // tgen
}
static void Test__ZN3aaa9GG3312223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312223E, buf);
    ::aaa::GG3312223 *dp, &lv = *(dp=new (buf) ::aaa::GG3312223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312223E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3312223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3312223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3312223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312223E);
    dp->::aaa::GG3312223::~GG3312223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312223E(Test__ZN3aaa9GG3312223E, "_ZN3aaa9GG3312223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312223C1Ev();
extern void _ZN3aaa9GG3312223D1Ev();
Name_Map name_map__ZN3aaa9GG3312223E[] = {
  NSPAIR(_ZN3aaa9GG3312223C1Ev),
  NSPAIR(_ZN3aaa9GG3312223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3312223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312223E[];
extern void _ZN3aaa9GG33122233fooEv();
extern void _ZN3aaa9GG33122233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33122233fooEv,_ZThn8_N3aaa9GG33122233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33122233barEv,_ZThn8_N3aaa9GG33122233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33122233barEv,_ZThn20_N3aaa9GG33122233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33122233barEv,_ZThn28_N3aaa9GG33122233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33122233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33122233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122233fooEv,_ZThn8_N3aaa9GG33122233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122233barEv,_ZThn8_N3aaa9GG33122233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122233barEv,_ZThn20_N3aaa9GG33122233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33122233barEv,_ZThn28_N3aaa9GG33122233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312223E[];
Class_Descriptor cd__ZN3aaa9GG3312223E = {  "_ZN3aaa9GG3312223E", // class name
  bases__ZN3aaa9GG3312223E, 6,
  &(vtc__ZN3aaa9GG3312223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312231  : ::aaa::EE331 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33122313fooEv
  ~GG3312231(); // tgen
  GG3312231(); // tgen
};
//SIG(1 _ZN3aaa9GG3312231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33122313fooEv");}
aaa::GG3312231 ::~GG3312231(){ note_dtor("_ZN3aaa9GG3312231E", this);} // tgen
aaa::GG3312231 ::GG3312231(){ note_ctor("_ZN3aaa9GG3312231E", this);} // tgen
}
static void Test__ZN3aaa9GG3312231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312231E, buf);
    ::aaa::GG3312231 *dp, &lv = *(dp=new (buf) ::aaa::GG3312231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312231E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3312231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3312231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3312231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312231E);
    dp->::aaa::GG3312231::~GG3312231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312231E(Test__ZN3aaa9GG3312231E, "_ZN3aaa9GG3312231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312231C1Ev();
extern void _ZN3aaa9GG3312231D1Ev();
Name_Map name_map__ZN3aaa9GG3312231E[] = {
  NSPAIR(_ZN3aaa9GG3312231C1Ev),
  NSPAIR(_ZN3aaa9GG3312231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3312231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312231E[];
extern void _ZN3aaa9GG33122313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33122313fooEv,_ZThn8_N3aaa9GG33122313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33122313fooEv,_ZThn20_N3aaa9GG33122313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33122313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122313fooEv,_ZThn8_N3aaa9GG33122313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122313fooEv,_ZThn20_N3aaa9GG33122313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312231E[];
Class_Descriptor cd__ZN3aaa9GG3312231E = {  "_ZN3aaa9GG3312231E", // class name
  bases__ZN3aaa9GG3312231E, 6,
  &(vtc__ZN3aaa9GG3312231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312232  : ::aaa::EE331 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33122323barEv
  ~GG3312232(); // tgen
  GG3312232(); // tgen
};
//SIG(1 _ZN3aaa9GG3312232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33122323barEv");}
aaa::GG3312232 ::~GG3312232(){ note_dtor("_ZN3aaa9GG3312232E", this);} // tgen
aaa::GG3312232 ::GG3312232(){ note_ctor("_ZN3aaa9GG3312232E", this);} // tgen
}
static void Test__ZN3aaa9GG3312232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312232E, buf);
    ::aaa::GG3312232 *dp, &lv = *(dp=new (buf) ::aaa::GG3312232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312232E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3312232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3312232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3312232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312232E);
    dp->::aaa::GG3312232::~GG3312232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312232E(Test__ZN3aaa9GG3312232E, "_ZN3aaa9GG3312232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312232C1Ev();
extern void _ZN3aaa9GG3312232D1Ev();
Name_Map name_map__ZN3aaa9GG3312232E[] = {
  NSPAIR(_ZN3aaa9GG3312232C1Ev),
  NSPAIR(_ZN3aaa9GG3312232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3312232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312232E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33122323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33122323barEv,_ZThn8_N3aaa9GG33122323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33122323barEv,_ZThn20_N3aaa9GG33122323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33122323barEv,_ZThn28_N3aaa9GG33122323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33122323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122323barEv,_ZThn8_N3aaa9GG33122323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122323barEv,_ZThn20_N3aaa9GG33122323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33122323barEv,_ZThn28_N3aaa9GG33122323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312232E[];
Class_Descriptor cd__ZN3aaa9GG3312232E = {  "_ZN3aaa9GG3312232E", // class name
  bases__ZN3aaa9GG3312232E, 6,
  &(vtc__ZN3aaa9GG3312232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312233  : ::aaa::EE331 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33122333fooEv
  virtual void  bar(); // _ZN3aaa9GG33122333barEv
  ~GG3312233(); // tgen
  GG3312233(); // tgen
};
//SIG(1 _ZN3aaa9GG3312233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33122333fooEv");}
void  aaa::GG3312233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33122333barEv");}
aaa::GG3312233 ::~GG3312233(){ note_dtor("_ZN3aaa9GG3312233E", this);} // tgen
aaa::GG3312233 ::GG3312233(){ note_ctor("_ZN3aaa9GG3312233E", this);} // tgen
}
static void Test__ZN3aaa9GG3312233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312233E, buf);
    ::aaa::GG3312233 *dp, &lv = *(dp=new (buf) ::aaa::GG3312233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312233E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3312233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3312233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3312233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312233E);
    dp->::aaa::GG3312233::~GG3312233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312233E(Test__ZN3aaa9GG3312233E, "_ZN3aaa9GG3312233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312233C1Ev();
extern void _ZN3aaa9GG3312233D1Ev();
Name_Map name_map__ZN3aaa9GG3312233E[] = {
  NSPAIR(_ZN3aaa9GG3312233C1Ev),
  NSPAIR(_ZN3aaa9GG3312233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3312233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312233E[];
extern void _ZN3aaa9GG33122333fooEv();
extern void _ZN3aaa9GG33122333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33122333fooEv,_ZThn8_N3aaa9GG33122333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33122333barEv,_ZThn8_N3aaa9GG33122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33122333barEv,_ZThn20_N3aaa9GG33122333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33122333fooEv,_ZThn20_N3aaa9GG33122333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33122333barEv,_ZThn28_N3aaa9GG33122333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33122333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33122333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122333fooEv,_ZThn8_N3aaa9GG33122333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33122333barEv,_ZThn8_N3aaa9GG33122333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122333barEv,_ZThn20_N3aaa9GG33122333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33122333fooEv,_ZThn20_N3aaa9GG33122333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33122333barEv,_ZThn28_N3aaa9GG33122333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312233E[];
Class_Descriptor cd__ZN3aaa9GG3312233E = {  "_ZN3aaa9GG3312233E", // class name
  bases__ZN3aaa9GG3312233E, 6,
  &(vtc__ZN3aaa9GG3312233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312311  : ::aaa::EE331 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33123113fooEv
  ~GG3312311(); // tgen
  GG3312311(); // tgen
};
//SIG(1 _ZN3aaa9GG3312311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33123113fooEv");}
aaa::GG3312311 ::~GG3312311(){ note_dtor("_ZN3aaa9GG3312311E", this);} // tgen
aaa::GG3312311 ::GG3312311(){ note_ctor("_ZN3aaa9GG3312311E", this);} // tgen
}
static void Test__ZN3aaa9GG3312311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312311E, buf);
    ::aaa::GG3312311 *dp, &lv = *(dp=new (buf) ::aaa::GG3312311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312311E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3312311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3312311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3312311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312311E);
    dp->::aaa::GG3312311::~GG3312311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312311E(Test__ZN3aaa9GG3312311E, "_ZN3aaa9GG3312311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312311C1Ev();
extern void _ZN3aaa9GG3312311D1Ev();
Name_Map name_map__ZN3aaa9GG3312311E[] = {
  NSPAIR(_ZN3aaa9GG3312311C1Ev),
  NSPAIR(_ZN3aaa9GG3312311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3312311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312311E[];
extern void _ZN3aaa9GG33123113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33123113fooEv,_ZThn8_N3aaa9GG33123113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33123113fooEv,_ZThn20_N3aaa9GG33123113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123113fooEv,_ZThn28_N3aaa9GG33123113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33123113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123113fooEv,_ZThn8_N3aaa9GG33123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123113fooEv,_ZThn20_N3aaa9GG33123113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123113fooEv,_ZThn28_N3aaa9GG33123113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312311E[];
Class_Descriptor cd__ZN3aaa9GG3312311E = {  "_ZN3aaa9GG3312311E", // class name
  bases__ZN3aaa9GG3312311E, 6,
  &(vtc__ZN3aaa9GG3312311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312312  : ::aaa::EE331 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33123123barEv
  ~GG3312312(); // tgen
  GG3312312(); // tgen
};
//SIG(1 _ZN3aaa9GG3312312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33123123barEv");}
aaa::GG3312312 ::~GG3312312(){ note_dtor("_ZN3aaa9GG3312312E", this);} // tgen
aaa::GG3312312 ::GG3312312(){ note_ctor("_ZN3aaa9GG3312312E", this);} // tgen
}
static void Test__ZN3aaa9GG3312312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312312E, buf);
    ::aaa::GG3312312 *dp, &lv = *(dp=new (buf) ::aaa::GG3312312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312312E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3312312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3312312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3312312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312312E);
    dp->::aaa::GG3312312::~GG3312312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312312E(Test__ZN3aaa9GG3312312E, "_ZN3aaa9GG3312312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312312C1Ev();
extern void _ZN3aaa9GG3312312D1Ev();
Name_Map name_map__ZN3aaa9GG3312312E[] = {
  NSPAIR(_ZN3aaa9GG3312312C1Ev),
  NSPAIR(_ZN3aaa9GG3312312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3312312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312312E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33123123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33123123barEv,_ZThn8_N3aaa9GG33123123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33123123barEv,_ZThn20_N3aaa9GG33123123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123123barEv,_ZThn28_N3aaa9GG33123123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33123123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123123barEv,_ZThn8_N3aaa9GG33123123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123123barEv,_ZThn20_N3aaa9GG33123123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123123barEv,_ZThn28_N3aaa9GG33123123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312312E[];
Class_Descriptor cd__ZN3aaa9GG3312312E = {  "_ZN3aaa9GG3312312E", // class name
  bases__ZN3aaa9GG3312312E, 6,
  &(vtc__ZN3aaa9GG3312312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312313  : ::aaa::EE331 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33123133fooEv
  virtual void  bar(); // _ZN3aaa9GG33123133barEv
  ~GG3312313(); // tgen
  GG3312313(); // tgen
};
//SIG(1 _ZN3aaa9GG3312313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33123133fooEv");}
void  aaa::GG3312313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33123133barEv");}
aaa::GG3312313 ::~GG3312313(){ note_dtor("_ZN3aaa9GG3312313E", this);} // tgen
aaa::GG3312313 ::GG3312313(){ note_ctor("_ZN3aaa9GG3312313E", this);} // tgen
}
static void Test__ZN3aaa9GG3312313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312313E, buf);
    ::aaa::GG3312313 *dp, &lv = *(dp=new (buf) ::aaa::GG3312313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312313E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3312313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3312313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3312313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312313E);
    dp->::aaa::GG3312313::~GG3312313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312313E(Test__ZN3aaa9GG3312313E, "_ZN3aaa9GG3312313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312313C1Ev();
extern void _ZN3aaa9GG3312313D1Ev();
Name_Map name_map__ZN3aaa9GG3312313E[] = {
  NSPAIR(_ZN3aaa9GG3312313C1Ev),
  NSPAIR(_ZN3aaa9GG3312313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3312313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312313E[];
extern void _ZN3aaa9GG33123133fooEv();
extern void _ZN3aaa9GG33123133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33123133fooEv,_ZThn8_N3aaa9GG33123133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33123133barEv,_ZThn8_N3aaa9GG33123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33123133barEv,_ZThn20_N3aaa9GG33123133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33123133fooEv,_ZThn20_N3aaa9GG33123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123133fooEv,_ZThn28_N3aaa9GG33123133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123133barEv,_ZThn28_N3aaa9GG33123133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33123133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33123133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123133fooEv,_ZThn8_N3aaa9GG33123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123133barEv,_ZThn8_N3aaa9GG33123133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123133barEv,_ZThn20_N3aaa9GG33123133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123133fooEv,_ZThn20_N3aaa9GG33123133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123133fooEv,_ZThn28_N3aaa9GG33123133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123133barEv,_ZThn28_N3aaa9GG33123133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312313E[];
Class_Descriptor cd__ZN3aaa9GG3312313E = {  "_ZN3aaa9GG3312313E", // class name
  bases__ZN3aaa9GG3312313E, 6,
  &(vtc__ZN3aaa9GG3312313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312321  : ::aaa::EE331 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33123213fooEv
  ~GG3312321(); // tgen
  GG3312321(); // tgen
};
//SIG(1 _ZN3aaa9GG3312321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33123213fooEv");}
aaa::GG3312321 ::~GG3312321(){ note_dtor("_ZN3aaa9GG3312321E", this);} // tgen
aaa::GG3312321 ::GG3312321(){ note_ctor("_ZN3aaa9GG3312321E", this);} // tgen
}
static void Test__ZN3aaa9GG3312321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312321E, buf);
    ::aaa::GG3312321 *dp, &lv = *(dp=new (buf) ::aaa::GG3312321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312321E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3312321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3312321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3312321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312321E);
    dp->::aaa::GG3312321::~GG3312321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312321E(Test__ZN3aaa9GG3312321E, "_ZN3aaa9GG3312321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312321C1Ev();
extern void _ZN3aaa9GG3312321D1Ev();
Name_Map name_map__ZN3aaa9GG3312321E[] = {
  NSPAIR(_ZN3aaa9GG3312321C1Ev),
  NSPAIR(_ZN3aaa9GG3312321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3312321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312321E[];
extern void _ZN3aaa9GG33123213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33123213fooEv,_ZThn8_N3aaa9GG33123213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33123213fooEv,_ZThn28_N3aaa9GG33123213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33123213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123213fooEv,_ZThn8_N3aaa9GG33123213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123213fooEv,_ZThn28_N3aaa9GG33123213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312321E[];
Class_Descriptor cd__ZN3aaa9GG3312321E = {  "_ZN3aaa9GG3312321E", // class name
  bases__ZN3aaa9GG3312321E, 6,
  &(vtc__ZN3aaa9GG3312321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312322  : ::aaa::EE331 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33123223barEv
  ~GG3312322(); // tgen
  GG3312322(); // tgen
};
//SIG(1 _ZN3aaa9GG3312322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33123223barEv");}
aaa::GG3312322 ::~GG3312322(){ note_dtor("_ZN3aaa9GG3312322E", this);} // tgen
aaa::GG3312322 ::GG3312322(){ note_ctor("_ZN3aaa9GG3312322E", this);} // tgen
}
static void Test__ZN3aaa9GG3312322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312322E, buf);
    ::aaa::GG3312322 *dp, &lv = *(dp=new (buf) ::aaa::GG3312322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312322E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3312322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3312322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3312322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312322E);
    dp->::aaa::GG3312322::~GG3312322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312322E(Test__ZN3aaa9GG3312322E, "_ZN3aaa9GG3312322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312322C1Ev();
extern void _ZN3aaa9GG3312322D1Ev();
Name_Map name_map__ZN3aaa9GG3312322E[] = {
  NSPAIR(_ZN3aaa9GG3312322C1Ev),
  NSPAIR(_ZN3aaa9GG3312322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3312322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312322E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33123223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33123223barEv,_ZThn8_N3aaa9GG33123223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33123223barEv,_ZThn20_N3aaa9GG33123223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33123223barEv,_ZThn28_N3aaa9GG33123223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33123223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123223barEv,_ZThn8_N3aaa9GG33123223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123223barEv,_ZThn20_N3aaa9GG33123223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123223barEv,_ZThn28_N3aaa9GG33123223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312322E[];
Class_Descriptor cd__ZN3aaa9GG3312322E = {  "_ZN3aaa9GG3312322E", // class name
  bases__ZN3aaa9GG3312322E, 6,
  &(vtc__ZN3aaa9GG3312322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312323  : ::aaa::EE331 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33123233fooEv
  virtual void  bar(); // _ZN3aaa9GG33123233barEv
  ~GG3312323(); // tgen
  GG3312323(); // tgen
};
//SIG(1 _ZN3aaa9GG3312323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33123233fooEv");}
void  aaa::GG3312323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33123233barEv");}
aaa::GG3312323 ::~GG3312323(){ note_dtor("_ZN3aaa9GG3312323E", this);} // tgen
aaa::GG3312323 ::GG3312323(){ note_ctor("_ZN3aaa9GG3312323E", this);} // tgen
}
static void Test__ZN3aaa9GG3312323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312323E, buf);
    ::aaa::GG3312323 *dp, &lv = *(dp=new (buf) ::aaa::GG3312323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312323E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3312323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3312323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3312323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312323E);
    dp->::aaa::GG3312323::~GG3312323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312323E(Test__ZN3aaa9GG3312323E, "_ZN3aaa9GG3312323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312323C1Ev();
extern void _ZN3aaa9GG3312323D1Ev();
Name_Map name_map__ZN3aaa9GG3312323E[] = {
  NSPAIR(_ZN3aaa9GG3312323C1Ev),
  NSPAIR(_ZN3aaa9GG3312323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3312323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312323E[];
extern void _ZN3aaa9GG33123233fooEv();
extern void _ZN3aaa9GG33123233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33123233fooEv,_ZThn8_N3aaa9GG33123233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33123233barEv,_ZThn8_N3aaa9GG33123233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33123233barEv,_ZThn20_N3aaa9GG33123233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123233fooEv,_ZThn28_N3aaa9GG33123233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123233barEv,_ZThn28_N3aaa9GG33123233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33123233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33123233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123233fooEv,_ZThn8_N3aaa9GG33123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123233barEv,_ZThn8_N3aaa9GG33123233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123233barEv,_ZThn20_N3aaa9GG33123233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123233fooEv,_ZThn28_N3aaa9GG33123233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123233barEv,_ZThn28_N3aaa9GG33123233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312323E[];
Class_Descriptor cd__ZN3aaa9GG3312323E = {  "_ZN3aaa9GG3312323E", // class name
  bases__ZN3aaa9GG3312323E, 6,
  &(vtc__ZN3aaa9GG3312323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312331  : ::aaa::EE331 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33123313fooEv
  ~GG3312331(); // tgen
  GG3312331(); // tgen
};
//SIG(1 _ZN3aaa9GG3312331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33123313fooEv");}
aaa::GG3312331 ::~GG3312331(){ note_dtor("_ZN3aaa9GG3312331E", this);} // tgen
aaa::GG3312331 ::GG3312331(){ note_ctor("_ZN3aaa9GG3312331E", this);} // tgen
}
static void Test__ZN3aaa9GG3312331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312331E, buf);
    ::aaa::GG3312331 *dp, &lv = *(dp=new (buf) ::aaa::GG3312331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312331E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3312331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3312331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3312331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312331E);
    dp->::aaa::GG3312331::~GG3312331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312331E(Test__ZN3aaa9GG3312331E, "_ZN3aaa9GG3312331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312331C1Ev();
extern void _ZN3aaa9GG3312331D1Ev();
Name_Map name_map__ZN3aaa9GG3312331E[] = {
  NSPAIR(_ZN3aaa9GG3312331C1Ev),
  NSPAIR(_ZN3aaa9GG3312331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3312331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312331E[];
extern void _ZN3aaa9GG33123313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33123313fooEv,_ZThn8_N3aaa9GG33123313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33123313fooEv,_ZThn20_N3aaa9GG33123313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123313fooEv,_ZThn28_N3aaa9GG33123313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33123313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123313fooEv,_ZThn8_N3aaa9GG33123313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123313fooEv,_ZThn20_N3aaa9GG33123313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123313fooEv,_ZThn28_N3aaa9GG33123313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312331E[];
Class_Descriptor cd__ZN3aaa9GG3312331E = {  "_ZN3aaa9GG3312331E", // class name
  bases__ZN3aaa9GG3312331E, 6,
  &(vtc__ZN3aaa9GG3312331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312332  : ::aaa::EE331 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33123323barEv
  ~GG3312332(); // tgen
  GG3312332(); // tgen
};
//SIG(1 _ZN3aaa9GG3312332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3312332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33123323barEv");}
aaa::GG3312332 ::~GG3312332(){ note_dtor("_ZN3aaa9GG3312332E", this);} // tgen
aaa::GG3312332 ::GG3312332(){ note_ctor("_ZN3aaa9GG3312332E", this);} // tgen
}
static void Test__ZN3aaa9GG3312332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312332E, buf);
    ::aaa::GG3312332 *dp, &lv = *(dp=new (buf) ::aaa::GG3312332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312332E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3312332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3312332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3312332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312332E);
    dp->::aaa::GG3312332::~GG3312332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312332E(Test__ZN3aaa9GG3312332E, "_ZN3aaa9GG3312332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312332C1Ev();
extern void _ZN3aaa9GG3312332D1Ev();
Name_Map name_map__ZN3aaa9GG3312332E[] = {
  NSPAIR(_ZN3aaa9GG3312332C1Ev),
  NSPAIR(_ZN3aaa9GG3312332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3312332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312332E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33123323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33123323barEv,_ZThn8_N3aaa9GG33123323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33123323barEv,_ZThn20_N3aaa9GG33123323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123323barEv,_ZThn28_N3aaa9GG33123323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33123323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123323barEv,_ZThn8_N3aaa9GG33123323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123323barEv,_ZThn20_N3aaa9GG33123323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123323barEv,_ZThn28_N3aaa9GG33123323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312332E[];
Class_Descriptor cd__ZN3aaa9GG3312332E = {  "_ZN3aaa9GG3312332E", // class name
  bases__ZN3aaa9GG3312332E, 6,
  &(vtc__ZN3aaa9GG3312332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3312333  : ::aaa::EE331 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33123333fooEv
  virtual void  bar(); // _ZN3aaa9GG33123333barEv
  ~GG3312333(); // tgen
  GG3312333(); // tgen
};
//SIG(1 _ZN3aaa9GG3312333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3312333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33123333fooEv");}
void  aaa::GG3312333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33123333barEv");}
aaa::GG3312333 ::~GG3312333(){ note_dtor("_ZN3aaa9GG3312333E", this);} // tgen
aaa::GG3312333 ::GG3312333(){ note_ctor("_ZN3aaa9GG3312333E", this);} // tgen
}
static void Test__ZN3aaa9GG3312333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3312333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3312333E, buf);
    ::aaa::GG3312333 *dp, &lv = *(dp=new (buf) ::aaa::GG3312333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3312333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3312333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3312333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3312333E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3312333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3312333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3312333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3312333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3312333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3312333E);
    dp->::aaa::GG3312333::~GG3312333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3312333E(Test__ZN3aaa9GG3312333E, "_ZN3aaa9GG3312333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3312333C1Ev();
extern void _ZN3aaa9GG3312333D1Ev();
Name_Map name_map__ZN3aaa9GG3312333E[] = {
  NSPAIR(_ZN3aaa9GG3312333C1Ev),
  NSPAIR(_ZN3aaa9GG3312333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3312333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3312333E[];
extern void _ZN3aaa9GG33123333fooEv();
extern void _ZN3aaa9GG33123333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33123333fooEv,_ZThn8_N3aaa9GG33123333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33123333barEv,_ZThn8_N3aaa9GG33123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33123333barEv,_ZThn20_N3aaa9GG33123333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33123333fooEv,_ZThn20_N3aaa9GG33123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123333fooEv,_ZThn28_N3aaa9GG33123333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33123333barEv,_ZThn28_N3aaa9GG33123333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3312333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33123333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33123333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123333fooEv,_ZThn8_N3aaa9GG33123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33123333barEv,_ZThn8_N3aaa9GG33123333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123333barEv,_ZThn20_N3aaa9GG33123333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33123333fooEv,_ZThn20_N3aaa9GG33123333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3312333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123333fooEv,_ZThn28_N3aaa9GG33123333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33123333barEv,_ZThn28_N3aaa9GG33123333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3312333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3312333E[];
Class_Descriptor cd__ZN3aaa9GG3312333E = {  "_ZN3aaa9GG3312333E", // class name
  bases__ZN3aaa9GG3312333E, 6,
  &(vtc__ZN3aaa9GG3312333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3312333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3312333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313111  : ::aaa::EE331 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33131113fooEv
  ~GG3313111(); // tgen
  GG3313111(); // tgen
};
//SIG(1 _ZN3aaa9GG3313111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33131113fooEv");}
aaa::GG3313111 ::~GG3313111(){ note_dtor("_ZN3aaa9GG3313111E", this);} // tgen
aaa::GG3313111 ::GG3313111(){ note_ctor("_ZN3aaa9GG3313111E", this);} // tgen
}
static void Test__ZN3aaa9GG3313111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313111E, buf);
    ::aaa::GG3313111 *dp, &lv = *(dp=new (buf) ::aaa::GG3313111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313111E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3313111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3313111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3313111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313111E);
    dp->::aaa::GG3313111::~GG3313111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313111E(Test__ZN3aaa9GG3313111E, "_ZN3aaa9GG3313111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313111C1Ev();
extern void _ZN3aaa9GG3313111D1Ev();
Name_Map name_map__ZN3aaa9GG3313111E[] = {
  NSPAIR(_ZN3aaa9GG3313111C1Ev),
  NSPAIR(_ZN3aaa9GG3313111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3313111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313111E[];
extern void _ZN3aaa9GG33131113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33131113fooEv,_ZThn8_N3aaa9GG33131113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33131113fooEv,_ZThn20_N3aaa9GG33131113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33131113fooEv,_ZThn28_N3aaa9GG33131113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33131113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131113fooEv,_ZThn8_N3aaa9GG33131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131113fooEv,_ZThn20_N3aaa9GG33131113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33131113fooEv,_ZThn28_N3aaa9GG33131113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313111E[];
Class_Descriptor cd__ZN3aaa9GG3313111E = {  "_ZN3aaa9GG3313111E", // class name
  bases__ZN3aaa9GG3313111E, 6,
  &(vtc__ZN3aaa9GG3313111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313112  : ::aaa::EE331 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33131123barEv
  ~GG3313112(); // tgen
  GG3313112(); // tgen
};
//SIG(1 _ZN3aaa9GG3313112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33131123barEv");}
aaa::GG3313112 ::~GG3313112(){ note_dtor("_ZN3aaa9GG3313112E", this);} // tgen
aaa::GG3313112 ::GG3313112(){ note_ctor("_ZN3aaa9GG3313112E", this);} // tgen
}
static void Test__ZN3aaa9GG3313112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313112E, buf);
    ::aaa::GG3313112 *dp, &lv = *(dp=new (buf) ::aaa::GG3313112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313112E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3313112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3313112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3313112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313112E);
    dp->::aaa::GG3313112::~GG3313112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313112E(Test__ZN3aaa9GG3313112E, "_ZN3aaa9GG3313112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313112C1Ev();
extern void _ZN3aaa9GG3313112D1Ev();
Name_Map name_map__ZN3aaa9GG3313112E[] = {
  NSPAIR(_ZN3aaa9GG3313112C1Ev),
  NSPAIR(_ZN3aaa9GG3313112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3313112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313112E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33131123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33131123barEv,_ZThn8_N3aaa9GG33131123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33131123barEv,_ZThn20_N3aaa9GG33131123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33131123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131123barEv,_ZThn8_N3aaa9GG33131123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131123barEv,_ZThn20_N3aaa9GG33131123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313112E[];
Class_Descriptor cd__ZN3aaa9GG3313112E = {  "_ZN3aaa9GG3313112E", // class name
  bases__ZN3aaa9GG3313112E, 6,
  &(vtc__ZN3aaa9GG3313112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313113  : ::aaa::EE331 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33131133fooEv
  virtual void  bar(); // _ZN3aaa9GG33131133barEv
  ~GG3313113(); // tgen
  GG3313113(); // tgen
};
//SIG(1 _ZN3aaa9GG3313113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33131133fooEv");}
void  aaa::GG3313113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33131133barEv");}
aaa::GG3313113 ::~GG3313113(){ note_dtor("_ZN3aaa9GG3313113E", this);} // tgen
aaa::GG3313113 ::GG3313113(){ note_ctor("_ZN3aaa9GG3313113E", this);} // tgen
}
static void Test__ZN3aaa9GG3313113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313113E, buf);
    ::aaa::GG3313113 *dp, &lv = *(dp=new (buf) ::aaa::GG3313113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313113E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3313113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3313113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3313113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313113E);
    dp->::aaa::GG3313113::~GG3313113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313113E(Test__ZN3aaa9GG3313113E, "_ZN3aaa9GG3313113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313113C1Ev();
extern void _ZN3aaa9GG3313113D1Ev();
Name_Map name_map__ZN3aaa9GG3313113E[] = {
  NSPAIR(_ZN3aaa9GG3313113C1Ev),
  NSPAIR(_ZN3aaa9GG3313113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3313113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313113E[];
extern void _ZN3aaa9GG33131133fooEv();
extern void _ZN3aaa9GG33131133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33131133fooEv,_ZThn8_N3aaa9GG33131133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33131133barEv,_ZThn8_N3aaa9GG33131133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33131133fooEv,_ZThn20_N3aaa9GG33131133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33131133barEv,_ZThn20_N3aaa9GG33131133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33131133fooEv,_ZThn28_N3aaa9GG33131133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33131133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33131133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131133fooEv,_ZThn8_N3aaa9GG33131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131133barEv,_ZThn8_N3aaa9GG33131133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131133fooEv,_ZThn20_N3aaa9GG33131133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131133barEv,_ZThn20_N3aaa9GG33131133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33131133fooEv,_ZThn28_N3aaa9GG33131133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313113E[];
Class_Descriptor cd__ZN3aaa9GG3313113E = {  "_ZN3aaa9GG3313113E", // class name
  bases__ZN3aaa9GG3313113E, 6,
  &(vtc__ZN3aaa9GG3313113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313121  : ::aaa::EE331 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33131213fooEv
  ~GG3313121(); // tgen
  GG3313121(); // tgen
};
//SIG(1 _ZN3aaa9GG3313121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33131213fooEv");}
aaa::GG3313121 ::~GG3313121(){ note_dtor("_ZN3aaa9GG3313121E", this);} // tgen
aaa::GG3313121 ::GG3313121(){ note_ctor("_ZN3aaa9GG3313121E", this);} // tgen
}
static void Test__ZN3aaa9GG3313121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313121E, buf);
    ::aaa::GG3313121 *dp, &lv = *(dp=new (buf) ::aaa::GG3313121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313121E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3313121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3313121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3313121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313121E);
    dp->::aaa::GG3313121::~GG3313121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313121E(Test__ZN3aaa9GG3313121E, "_ZN3aaa9GG3313121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313121C1Ev();
extern void _ZN3aaa9GG3313121D1Ev();
Name_Map name_map__ZN3aaa9GG3313121E[] = {
  NSPAIR(_ZN3aaa9GG3313121C1Ev),
  NSPAIR(_ZN3aaa9GG3313121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3313121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313121E[];
extern void _ZN3aaa9GG33131213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33131213fooEv,_ZThn8_N3aaa9GG33131213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33131213fooEv,_ZThn20_N3aaa9GG33131213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33131213fooEv,_ZThn28_N3aaa9GG33131213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33131213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131213fooEv,_ZThn8_N3aaa9GG33131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131213fooEv,_ZThn20_N3aaa9GG33131213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33131213fooEv,_ZThn28_N3aaa9GG33131213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313121E[];
Class_Descriptor cd__ZN3aaa9GG3313121E = {  "_ZN3aaa9GG3313121E", // class name
  bases__ZN3aaa9GG3313121E, 6,
  &(vtc__ZN3aaa9GG3313121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313122  : ::aaa::EE331 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33131223barEv
  ~GG3313122(); // tgen
  GG3313122(); // tgen
};
//SIG(1 _ZN3aaa9GG3313122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33131223barEv");}
aaa::GG3313122 ::~GG3313122(){ note_dtor("_ZN3aaa9GG3313122E", this);} // tgen
aaa::GG3313122 ::GG3313122(){ note_ctor("_ZN3aaa9GG3313122E", this);} // tgen
}
static void Test__ZN3aaa9GG3313122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313122E, buf);
    ::aaa::GG3313122 *dp, &lv = *(dp=new (buf) ::aaa::GG3313122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313122E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3313122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3313122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3313122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313122E);
    dp->::aaa::GG3313122::~GG3313122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313122E(Test__ZN3aaa9GG3313122E, "_ZN3aaa9GG3313122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313122C1Ev();
extern void _ZN3aaa9GG3313122D1Ev();
Name_Map name_map__ZN3aaa9GG3313122E[] = {
  NSPAIR(_ZN3aaa9GG3313122C1Ev),
  NSPAIR(_ZN3aaa9GG3313122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3313122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313122E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33131223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33131223barEv,_ZThn8_N3aaa9GG33131223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33131223barEv,_ZThn20_N3aaa9GG33131223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33131223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131223barEv,_ZThn8_N3aaa9GG33131223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131223barEv,_ZThn20_N3aaa9GG33131223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313122E[];
Class_Descriptor cd__ZN3aaa9GG3313122E = {  "_ZN3aaa9GG3313122E", // class name
  bases__ZN3aaa9GG3313122E, 6,
  &(vtc__ZN3aaa9GG3313122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313123  : ::aaa::EE331 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33131233fooEv
  virtual void  bar(); // _ZN3aaa9GG33131233barEv
  ~GG3313123(); // tgen
  GG3313123(); // tgen
};
//SIG(1 _ZN3aaa9GG3313123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33131233fooEv");}
void  aaa::GG3313123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33131233barEv");}
aaa::GG3313123 ::~GG3313123(){ note_dtor("_ZN3aaa9GG3313123E", this);} // tgen
aaa::GG3313123 ::GG3313123(){ note_ctor("_ZN3aaa9GG3313123E", this);} // tgen
}
static void Test__ZN3aaa9GG3313123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313123E, buf);
    ::aaa::GG3313123 *dp, &lv = *(dp=new (buf) ::aaa::GG3313123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313123E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3313123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3313123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3313123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313123E);
    dp->::aaa::GG3313123::~GG3313123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313123E(Test__ZN3aaa9GG3313123E, "_ZN3aaa9GG3313123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313123C1Ev();
extern void _ZN3aaa9GG3313123D1Ev();
Name_Map name_map__ZN3aaa9GG3313123E[] = {
  NSPAIR(_ZN3aaa9GG3313123C1Ev),
  NSPAIR(_ZN3aaa9GG3313123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3313123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313123E[];
extern void _ZN3aaa9GG33131233fooEv();
extern void _ZN3aaa9GG33131233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33131233fooEv,_ZThn8_N3aaa9GG33131233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33131233barEv,_ZThn8_N3aaa9GG33131233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33131233fooEv,_ZThn20_N3aaa9GG33131233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33131233barEv,_ZThn20_N3aaa9GG33131233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33131233fooEv,_ZThn28_N3aaa9GG33131233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33131233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33131233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131233fooEv,_ZThn8_N3aaa9GG33131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131233barEv,_ZThn8_N3aaa9GG33131233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131233fooEv,_ZThn20_N3aaa9GG33131233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131233barEv,_ZThn20_N3aaa9GG33131233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33131233fooEv,_ZThn28_N3aaa9GG33131233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313123E[];
Class_Descriptor cd__ZN3aaa9GG3313123E = {  "_ZN3aaa9GG3313123E", // class name
  bases__ZN3aaa9GG3313123E, 6,
  &(vtc__ZN3aaa9GG3313123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313131  : ::aaa::EE331 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33131313fooEv
  ~GG3313131(); // tgen
  GG3313131(); // tgen
};
//SIG(1 _ZN3aaa9GG3313131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33131313fooEv");}
aaa::GG3313131 ::~GG3313131(){ note_dtor("_ZN3aaa9GG3313131E", this);} // tgen
aaa::GG3313131 ::GG3313131(){ note_ctor("_ZN3aaa9GG3313131E", this);} // tgen
}
static void Test__ZN3aaa9GG3313131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313131E, buf);
    ::aaa::GG3313131 *dp, &lv = *(dp=new (buf) ::aaa::GG3313131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313131E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3313131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3313131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3313131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313131E);
    dp->::aaa::GG3313131::~GG3313131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313131E(Test__ZN3aaa9GG3313131E, "_ZN3aaa9GG3313131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313131C1Ev();
extern void _ZN3aaa9GG3313131D1Ev();
Name_Map name_map__ZN3aaa9GG3313131E[] = {
  NSPAIR(_ZN3aaa9GG3313131C1Ev),
  NSPAIR(_ZN3aaa9GG3313131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3313131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313131E[];
extern void _ZN3aaa9GG33131313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33131313fooEv,_ZThn8_N3aaa9GG33131313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33131313fooEv,_ZThn20_N3aaa9GG33131313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33131313fooEv,_ZThn28_N3aaa9GG33131313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33131313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131313fooEv,_ZThn8_N3aaa9GG33131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131313fooEv,_ZThn20_N3aaa9GG33131313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33131313fooEv,_ZThn28_N3aaa9GG33131313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313131E[];
Class_Descriptor cd__ZN3aaa9GG3313131E = {  "_ZN3aaa9GG3313131E", // class name
  bases__ZN3aaa9GG3313131E, 6,
  &(vtc__ZN3aaa9GG3313131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313132  : ::aaa::EE331 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33131323barEv
  ~GG3313132(); // tgen
  GG3313132(); // tgen
};
//SIG(1 _ZN3aaa9GG3313132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33131323barEv");}
aaa::GG3313132 ::~GG3313132(){ note_dtor("_ZN3aaa9GG3313132E", this);} // tgen
aaa::GG3313132 ::GG3313132(){ note_ctor("_ZN3aaa9GG3313132E", this);} // tgen
}
static void Test__ZN3aaa9GG3313132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313132E, buf);
    ::aaa::GG3313132 *dp, &lv = *(dp=new (buf) ::aaa::GG3313132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313132E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3313132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3313132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3313132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313132E);
    dp->::aaa::GG3313132::~GG3313132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313132E(Test__ZN3aaa9GG3313132E, "_ZN3aaa9GG3313132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313132C1Ev();
extern void _ZN3aaa9GG3313132D1Ev();
Name_Map name_map__ZN3aaa9GG3313132E[] = {
  NSPAIR(_ZN3aaa9GG3313132C1Ev),
  NSPAIR(_ZN3aaa9GG3313132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3313132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313132E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33131323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33131323barEv,_ZThn8_N3aaa9GG33131323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33131323barEv,_ZThn20_N3aaa9GG33131323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33131323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131323barEv,_ZThn8_N3aaa9GG33131323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131323barEv,_ZThn20_N3aaa9GG33131323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313132E[];
Class_Descriptor cd__ZN3aaa9GG3313132E = {  "_ZN3aaa9GG3313132E", // class name
  bases__ZN3aaa9GG3313132E, 6,
  &(vtc__ZN3aaa9GG3313132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313133  : ::aaa::EE331 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33131333fooEv
  virtual void  bar(); // _ZN3aaa9GG33131333barEv
  ~GG3313133(); // tgen
  GG3313133(); // tgen
};
//SIG(1 _ZN3aaa9GG3313133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33131333fooEv");}
void  aaa::GG3313133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33131333barEv");}
aaa::GG3313133 ::~GG3313133(){ note_dtor("_ZN3aaa9GG3313133E", this);} // tgen
aaa::GG3313133 ::GG3313133(){ note_ctor("_ZN3aaa9GG3313133E", this);} // tgen
}
static void Test__ZN3aaa9GG3313133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313133E, buf);
    ::aaa::GG3313133 *dp, &lv = *(dp=new (buf) ::aaa::GG3313133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313133E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3313133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3313133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3313133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313133E);
    dp->::aaa::GG3313133::~GG3313133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313133E(Test__ZN3aaa9GG3313133E, "_ZN3aaa9GG3313133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313133C1Ev();
extern void _ZN3aaa9GG3313133D1Ev();
Name_Map name_map__ZN3aaa9GG3313133E[] = {
  NSPAIR(_ZN3aaa9GG3313133C1Ev),
  NSPAIR(_ZN3aaa9GG3313133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3313133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313133E[];
extern void _ZN3aaa9GG33131333fooEv();
extern void _ZN3aaa9GG33131333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33131333fooEv,_ZThn8_N3aaa9GG33131333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33131333barEv,_ZThn8_N3aaa9GG33131333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33131333fooEv,_ZThn20_N3aaa9GG33131333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33131333barEv,_ZThn20_N3aaa9GG33131333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33131333fooEv,_ZThn28_N3aaa9GG33131333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33131333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33131333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131333fooEv,_ZThn8_N3aaa9GG33131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33131333barEv,_ZThn8_N3aaa9GG33131333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131333fooEv,_ZThn20_N3aaa9GG33131333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33131333barEv,_ZThn20_N3aaa9GG33131333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33131333fooEv,_ZThn28_N3aaa9GG33131333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313133E[];
Class_Descriptor cd__ZN3aaa9GG3313133E = {  "_ZN3aaa9GG3313133E", // class name
  bases__ZN3aaa9GG3313133E, 6,
  &(vtc__ZN3aaa9GG3313133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313211  : ::aaa::EE331 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33132113fooEv
  ~GG3313211(); // tgen
  GG3313211(); // tgen
};
//SIG(1 _ZN3aaa9GG3313211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33132113fooEv");}
aaa::GG3313211 ::~GG3313211(){ note_dtor("_ZN3aaa9GG3313211E", this);} // tgen
aaa::GG3313211 ::GG3313211(){ note_ctor("_ZN3aaa9GG3313211E", this);} // tgen
}
static void Test__ZN3aaa9GG3313211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313211E, buf);
    ::aaa::GG3313211 *dp, &lv = *(dp=new (buf) ::aaa::GG3313211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313211E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3313211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3313211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3313211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313211E);
    dp->::aaa::GG3313211::~GG3313211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313211E(Test__ZN3aaa9GG3313211E, "_ZN3aaa9GG3313211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313211C1Ev();
extern void _ZN3aaa9GG3313211D1Ev();
Name_Map name_map__ZN3aaa9GG3313211E[] = {
  NSPAIR(_ZN3aaa9GG3313211C1Ev),
  NSPAIR(_ZN3aaa9GG3313211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3313211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313211E[];
extern void _ZN3aaa9GG33132113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33132113fooEv,_ZThn8_N3aaa9GG33132113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33132113fooEv,_ZThn20_N3aaa9GG33132113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33132113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132113fooEv,_ZThn8_N3aaa9GG33132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132113fooEv,_ZThn20_N3aaa9GG33132113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313211E[];
Class_Descriptor cd__ZN3aaa9GG3313211E = {  "_ZN3aaa9GG3313211E", // class name
  bases__ZN3aaa9GG3313211E, 6,
  &(vtc__ZN3aaa9GG3313211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313212  : ::aaa::EE331 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33132123barEv
  ~GG3313212(); // tgen
  GG3313212(); // tgen
};
//SIG(1 _ZN3aaa9GG3313212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33132123barEv");}
aaa::GG3313212 ::~GG3313212(){ note_dtor("_ZN3aaa9GG3313212E", this);} // tgen
aaa::GG3313212 ::GG3313212(){ note_ctor("_ZN3aaa9GG3313212E", this);} // tgen
}
static void Test__ZN3aaa9GG3313212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313212E, buf);
    ::aaa::GG3313212 *dp, &lv = *(dp=new (buf) ::aaa::GG3313212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313212E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3313212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3313212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3313212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313212E);
    dp->::aaa::GG3313212::~GG3313212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313212E(Test__ZN3aaa9GG3313212E, "_ZN3aaa9GG3313212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313212C1Ev();
extern void _ZN3aaa9GG3313212D1Ev();
Name_Map name_map__ZN3aaa9GG3313212E[] = {
  NSPAIR(_ZN3aaa9GG3313212C1Ev),
  NSPAIR(_ZN3aaa9GG3313212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3313212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313212E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33132123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33132123barEv,_ZThn8_N3aaa9GG33132123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33132123barEv,_ZThn20_N3aaa9GG33132123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33132123barEv,_ZThn28_N3aaa9GG33132123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33132123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132123barEv,_ZThn8_N3aaa9GG33132123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132123barEv,_ZThn20_N3aaa9GG33132123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33132123barEv,_ZThn28_N3aaa9GG33132123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313212E[];
Class_Descriptor cd__ZN3aaa9GG3313212E = {  "_ZN3aaa9GG3313212E", // class name
  bases__ZN3aaa9GG3313212E, 6,
  &(vtc__ZN3aaa9GG3313212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313213  : ::aaa::EE331 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33132133fooEv
  virtual void  bar(); // _ZN3aaa9GG33132133barEv
  ~GG3313213(); // tgen
  GG3313213(); // tgen
};
//SIG(1 _ZN3aaa9GG3313213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33132133fooEv");}
void  aaa::GG3313213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33132133barEv");}
aaa::GG3313213 ::~GG3313213(){ note_dtor("_ZN3aaa9GG3313213E", this);} // tgen
aaa::GG3313213 ::GG3313213(){ note_ctor("_ZN3aaa9GG3313213E", this);} // tgen
}
static void Test__ZN3aaa9GG3313213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313213E, buf);
    ::aaa::GG3313213 *dp, &lv = *(dp=new (buf) ::aaa::GG3313213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313213E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3313213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3313213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3313213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313213E);
    dp->::aaa::GG3313213::~GG3313213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313213E(Test__ZN3aaa9GG3313213E, "_ZN3aaa9GG3313213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313213C1Ev();
extern void _ZN3aaa9GG3313213D1Ev();
Name_Map name_map__ZN3aaa9GG3313213E[] = {
  NSPAIR(_ZN3aaa9GG3313213C1Ev),
  NSPAIR(_ZN3aaa9GG3313213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3313213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313213E[];
extern void _ZN3aaa9GG33132133fooEv();
extern void _ZN3aaa9GG33132133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33132133fooEv,_ZThn8_N3aaa9GG33132133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33132133barEv,_ZThn8_N3aaa9GG33132133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33132133fooEv,_ZThn20_N3aaa9GG33132133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33132133barEv,_ZThn20_N3aaa9GG33132133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33132133barEv,_ZThn28_N3aaa9GG33132133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33132133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33132133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132133fooEv,_ZThn8_N3aaa9GG33132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132133barEv,_ZThn8_N3aaa9GG33132133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132133fooEv,_ZThn20_N3aaa9GG33132133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132133barEv,_ZThn20_N3aaa9GG33132133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33132133barEv,_ZThn28_N3aaa9GG33132133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313213E[];
Class_Descriptor cd__ZN3aaa9GG3313213E = {  "_ZN3aaa9GG3313213E", // class name
  bases__ZN3aaa9GG3313213E, 6,
  &(vtc__ZN3aaa9GG3313213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313221  : ::aaa::EE331 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33132213fooEv
  ~GG3313221(); // tgen
  GG3313221(); // tgen
};
//SIG(1 _ZN3aaa9GG3313221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33132213fooEv");}
aaa::GG3313221 ::~GG3313221(){ note_dtor("_ZN3aaa9GG3313221E", this);} // tgen
aaa::GG3313221 ::GG3313221(){ note_ctor("_ZN3aaa9GG3313221E", this);} // tgen
}
static void Test__ZN3aaa9GG3313221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313221E, buf);
    ::aaa::GG3313221 *dp, &lv = *(dp=new (buf) ::aaa::GG3313221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313221E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3313221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3313221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3313221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313221E);
    dp->::aaa::GG3313221::~GG3313221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313221E(Test__ZN3aaa9GG3313221E, "_ZN3aaa9GG3313221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313221C1Ev();
extern void _ZN3aaa9GG3313221D1Ev();
Name_Map name_map__ZN3aaa9GG3313221E[] = {
  NSPAIR(_ZN3aaa9GG3313221C1Ev),
  NSPAIR(_ZN3aaa9GG3313221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3313221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313221E[];
extern void _ZN3aaa9GG33132213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33132213fooEv,_ZThn8_N3aaa9GG33132213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33132213fooEv,_ZThn20_N3aaa9GG33132213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33132213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132213fooEv,_ZThn8_N3aaa9GG33132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132213fooEv,_ZThn20_N3aaa9GG33132213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313221E[];
Class_Descriptor cd__ZN3aaa9GG3313221E = {  "_ZN3aaa9GG3313221E", // class name
  bases__ZN3aaa9GG3313221E, 6,
  &(vtc__ZN3aaa9GG3313221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313222  : ::aaa::EE331 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33132223barEv
  ~GG3313222(); // tgen
  GG3313222(); // tgen
};
//SIG(1 _ZN3aaa9GG3313222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33132223barEv");}
aaa::GG3313222 ::~GG3313222(){ note_dtor("_ZN3aaa9GG3313222E", this);} // tgen
aaa::GG3313222 ::GG3313222(){ note_ctor("_ZN3aaa9GG3313222E", this);} // tgen
}
static void Test__ZN3aaa9GG3313222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313222E, buf);
    ::aaa::GG3313222 *dp, &lv = *(dp=new (buf) ::aaa::GG3313222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313222E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3313222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3313222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3313222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313222E);
    dp->::aaa::GG3313222::~GG3313222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313222E(Test__ZN3aaa9GG3313222E, "_ZN3aaa9GG3313222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313222C1Ev();
extern void _ZN3aaa9GG3313222D1Ev();
Name_Map name_map__ZN3aaa9GG3313222E[] = {
  NSPAIR(_ZN3aaa9GG3313222C1Ev),
  NSPAIR(_ZN3aaa9GG3313222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3313222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313222E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33132223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33132223barEv,_ZThn8_N3aaa9GG33132223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33132223barEv,_ZThn20_N3aaa9GG33132223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33132223barEv,_ZThn28_N3aaa9GG33132223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33132223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132223barEv,_ZThn8_N3aaa9GG33132223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132223barEv,_ZThn20_N3aaa9GG33132223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33132223barEv,_ZThn28_N3aaa9GG33132223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313222E[];
Class_Descriptor cd__ZN3aaa9GG3313222E = {  "_ZN3aaa9GG3313222E", // class name
  bases__ZN3aaa9GG3313222E, 6,
  &(vtc__ZN3aaa9GG3313222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313223  : ::aaa::EE331 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33132233fooEv
  virtual void  bar(); // _ZN3aaa9GG33132233barEv
  ~GG3313223(); // tgen
  GG3313223(); // tgen
};
//SIG(1 _ZN3aaa9GG3313223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33132233fooEv");}
void  aaa::GG3313223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33132233barEv");}
aaa::GG3313223 ::~GG3313223(){ note_dtor("_ZN3aaa9GG3313223E", this);} // tgen
aaa::GG3313223 ::GG3313223(){ note_ctor("_ZN3aaa9GG3313223E", this);} // tgen
}
static void Test__ZN3aaa9GG3313223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313223E, buf);
    ::aaa::GG3313223 *dp, &lv = *(dp=new (buf) ::aaa::GG3313223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313223E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3313223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3313223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3313223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313223E);
    dp->::aaa::GG3313223::~GG3313223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313223E(Test__ZN3aaa9GG3313223E, "_ZN3aaa9GG3313223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313223C1Ev();
extern void _ZN3aaa9GG3313223D1Ev();
Name_Map name_map__ZN3aaa9GG3313223E[] = {
  NSPAIR(_ZN3aaa9GG3313223C1Ev),
  NSPAIR(_ZN3aaa9GG3313223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3313223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313223E[];
extern void _ZN3aaa9GG33132233fooEv();
extern void _ZN3aaa9GG33132233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33132233fooEv,_ZThn8_N3aaa9GG33132233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33132233barEv,_ZThn8_N3aaa9GG33132233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33132233fooEv,_ZThn20_N3aaa9GG33132233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33132233barEv,_ZThn20_N3aaa9GG33132233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33132233barEv,_ZThn28_N3aaa9GG33132233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33132233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33132233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132233fooEv,_ZThn8_N3aaa9GG33132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132233barEv,_ZThn8_N3aaa9GG33132233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132233fooEv,_ZThn20_N3aaa9GG33132233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132233barEv,_ZThn20_N3aaa9GG33132233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33132233barEv,_ZThn28_N3aaa9GG33132233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313223E[];
Class_Descriptor cd__ZN3aaa9GG3313223E = {  "_ZN3aaa9GG3313223E", // class name
  bases__ZN3aaa9GG3313223E, 6,
  &(vtc__ZN3aaa9GG3313223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313231  : ::aaa::EE331 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33132313fooEv
  ~GG3313231(); // tgen
  GG3313231(); // tgen
};
//SIG(1 _ZN3aaa9GG3313231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33132313fooEv");}
aaa::GG3313231 ::~GG3313231(){ note_dtor("_ZN3aaa9GG3313231E", this);} // tgen
aaa::GG3313231 ::GG3313231(){ note_ctor("_ZN3aaa9GG3313231E", this);} // tgen
}
static void Test__ZN3aaa9GG3313231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313231E, buf);
    ::aaa::GG3313231 *dp, &lv = *(dp=new (buf) ::aaa::GG3313231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313231E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3313231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3313231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3313231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313231E);
    dp->::aaa::GG3313231::~GG3313231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313231E(Test__ZN3aaa9GG3313231E, "_ZN3aaa9GG3313231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313231C1Ev();
extern void _ZN3aaa9GG3313231D1Ev();
Name_Map name_map__ZN3aaa9GG3313231E[] = {
  NSPAIR(_ZN3aaa9GG3313231C1Ev),
  NSPAIR(_ZN3aaa9GG3313231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3313231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313231E[];
extern void _ZN3aaa9GG33132313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33132313fooEv,_ZThn8_N3aaa9GG33132313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33132313fooEv,_ZThn20_N3aaa9GG33132313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33132313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132313fooEv,_ZThn8_N3aaa9GG33132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132313fooEv,_ZThn20_N3aaa9GG33132313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313231E[];
Class_Descriptor cd__ZN3aaa9GG3313231E = {  "_ZN3aaa9GG3313231E", // class name
  bases__ZN3aaa9GG3313231E, 6,
  &(vtc__ZN3aaa9GG3313231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313232  : ::aaa::EE331 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33132323barEv
  ~GG3313232(); // tgen
  GG3313232(); // tgen
};
//SIG(1 _ZN3aaa9GG3313232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33132323barEv");}
aaa::GG3313232 ::~GG3313232(){ note_dtor("_ZN3aaa9GG3313232E", this);} // tgen
aaa::GG3313232 ::GG3313232(){ note_ctor("_ZN3aaa9GG3313232E", this);} // tgen
}
static void Test__ZN3aaa9GG3313232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313232E, buf);
    ::aaa::GG3313232 *dp, &lv = *(dp=new (buf) ::aaa::GG3313232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313232E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3313232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3313232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3313232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313232E);
    dp->::aaa::GG3313232::~GG3313232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313232E(Test__ZN3aaa9GG3313232E, "_ZN3aaa9GG3313232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313232C1Ev();
extern void _ZN3aaa9GG3313232D1Ev();
Name_Map name_map__ZN3aaa9GG3313232E[] = {
  NSPAIR(_ZN3aaa9GG3313232C1Ev),
  NSPAIR(_ZN3aaa9GG3313232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3313232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313232E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33132323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33132323barEv,_ZThn8_N3aaa9GG33132323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33132323barEv,_ZThn20_N3aaa9GG33132323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33132323barEv,_ZThn28_N3aaa9GG33132323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33132323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132323barEv,_ZThn8_N3aaa9GG33132323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132323barEv,_ZThn20_N3aaa9GG33132323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33132323barEv,_ZThn28_N3aaa9GG33132323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313232E[];
Class_Descriptor cd__ZN3aaa9GG3313232E = {  "_ZN3aaa9GG3313232E", // class name
  bases__ZN3aaa9GG3313232E, 6,
  &(vtc__ZN3aaa9GG3313232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313233  : ::aaa::EE331 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33132333fooEv
  virtual void  bar(); // _ZN3aaa9GG33132333barEv
  ~GG3313233(); // tgen
  GG3313233(); // tgen
};
//SIG(1 _ZN3aaa9GG3313233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33132333fooEv");}
void  aaa::GG3313233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33132333barEv");}
aaa::GG3313233 ::~GG3313233(){ note_dtor("_ZN3aaa9GG3313233E", this);} // tgen
aaa::GG3313233 ::GG3313233(){ note_ctor("_ZN3aaa9GG3313233E", this);} // tgen
}
static void Test__ZN3aaa9GG3313233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313233E, buf);
    ::aaa::GG3313233 *dp, &lv = *(dp=new (buf) ::aaa::GG3313233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313233E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3313233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3313233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3313233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313233E);
    dp->::aaa::GG3313233::~GG3313233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313233E(Test__ZN3aaa9GG3313233E, "_ZN3aaa9GG3313233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313233C1Ev();
extern void _ZN3aaa9GG3313233D1Ev();
Name_Map name_map__ZN3aaa9GG3313233E[] = {
  NSPAIR(_ZN3aaa9GG3313233C1Ev),
  NSPAIR(_ZN3aaa9GG3313233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3313233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313233E[];
extern void _ZN3aaa9GG33132333fooEv();
extern void _ZN3aaa9GG33132333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33132333fooEv,_ZThn8_N3aaa9GG33132333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33132333barEv,_ZThn8_N3aaa9GG33132333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33132333fooEv,_ZThn20_N3aaa9GG33132333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33132333barEv,_ZThn20_N3aaa9GG33132333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33132333barEv,_ZThn28_N3aaa9GG33132333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33132333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33132333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132333fooEv,_ZThn8_N3aaa9GG33132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33132333barEv,_ZThn8_N3aaa9GG33132333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132333fooEv,_ZThn20_N3aaa9GG33132333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33132333barEv,_ZThn20_N3aaa9GG33132333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33132333barEv,_ZThn28_N3aaa9GG33132333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313233E[];
Class_Descriptor cd__ZN3aaa9GG3313233E = {  "_ZN3aaa9GG3313233E", // class name
  bases__ZN3aaa9GG3313233E, 6,
  &(vtc__ZN3aaa9GG3313233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313311  : ::aaa::EE331 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33133113fooEv
  ~GG3313311(); // tgen
  GG3313311(); // tgen
};
//SIG(1 _ZN3aaa9GG3313311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33133113fooEv");}
aaa::GG3313311 ::~GG3313311(){ note_dtor("_ZN3aaa9GG3313311E", this);} // tgen
aaa::GG3313311 ::GG3313311(){ note_ctor("_ZN3aaa9GG3313311E", this);} // tgen
}
static void Test__ZN3aaa9GG3313311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313311E, buf);
    ::aaa::GG3313311 *dp, &lv = *(dp=new (buf) ::aaa::GG3313311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313311E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3313311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3313311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3313311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313311E);
    dp->::aaa::GG3313311::~GG3313311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313311E(Test__ZN3aaa9GG3313311E, "_ZN3aaa9GG3313311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313311C1Ev();
extern void _ZN3aaa9GG3313311D1Ev();
Name_Map name_map__ZN3aaa9GG3313311E[] = {
  NSPAIR(_ZN3aaa9GG3313311C1Ev),
  NSPAIR(_ZN3aaa9GG3313311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3313311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313311E[];
extern void _ZN3aaa9GG33133113fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33133113fooEv,_ZThn8_N3aaa9GG33133113fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33133113fooEv,_ZThn20_N3aaa9GG33133113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33133113fooEv,_ZThn28_N3aaa9GG33133113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33133113fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133113fooEv,_ZThn8_N3aaa9GG33133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133113fooEv,_ZThn20_N3aaa9GG33133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133113fooEv,_ZThn28_N3aaa9GG33133113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313311E[];
Class_Descriptor cd__ZN3aaa9GG3313311E = {  "_ZN3aaa9GG3313311E", // class name
  bases__ZN3aaa9GG3313311E, 6,
  &(vtc__ZN3aaa9GG3313311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313312  : ::aaa::EE331 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33133123barEv
  ~GG3313312(); // tgen
  GG3313312(); // tgen
};
//SIG(1 _ZN3aaa9GG3313312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33133123barEv");}
aaa::GG3313312 ::~GG3313312(){ note_dtor("_ZN3aaa9GG3313312E", this);} // tgen
aaa::GG3313312 ::GG3313312(){ note_ctor("_ZN3aaa9GG3313312E", this);} // tgen
}
static void Test__ZN3aaa9GG3313312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313312E, buf);
    ::aaa::GG3313312 *dp, &lv = *(dp=new (buf) ::aaa::GG3313312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313312E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3313312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3313312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3313312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313312E);
    dp->::aaa::GG3313312::~GG3313312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313312E(Test__ZN3aaa9GG3313312E, "_ZN3aaa9GG3313312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313312C1Ev();
extern void _ZN3aaa9GG3313312D1Ev();
Name_Map name_map__ZN3aaa9GG3313312E[] = {
  NSPAIR(_ZN3aaa9GG3313312C1Ev),
  NSPAIR(_ZN3aaa9GG3313312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3313312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313312E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33133123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33133123barEv,_ZThn8_N3aaa9GG33133123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33133123barEv,_ZThn20_N3aaa9GG33133123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33133123barEv,_ZThn28_N3aaa9GG33133123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33133123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133123barEv,_ZThn8_N3aaa9GG33133123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133123barEv,_ZThn20_N3aaa9GG33133123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133123barEv,_ZThn28_N3aaa9GG33133123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313312E[];
Class_Descriptor cd__ZN3aaa9GG3313312E = {  "_ZN3aaa9GG3313312E", // class name
  bases__ZN3aaa9GG3313312E, 6,
  &(vtc__ZN3aaa9GG3313312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313313  : ::aaa::EE331 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33133133fooEv
  virtual void  bar(); // _ZN3aaa9GG33133133barEv
  ~GG3313313(); // tgen
  GG3313313(); // tgen
};
//SIG(1 _ZN3aaa9GG3313313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33133133fooEv");}
void  aaa::GG3313313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33133133barEv");}
aaa::GG3313313 ::~GG3313313(){ note_dtor("_ZN3aaa9GG3313313E", this);} // tgen
aaa::GG3313313 ::GG3313313(){ note_ctor("_ZN3aaa9GG3313313E", this);} // tgen
}
static void Test__ZN3aaa9GG3313313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313313E, buf);
    ::aaa::GG3313313 *dp, &lv = *(dp=new (buf) ::aaa::GG3313313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313313E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3313313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3313313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3313313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313313E);
    dp->::aaa::GG3313313::~GG3313313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313313E(Test__ZN3aaa9GG3313313E, "_ZN3aaa9GG3313313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313313C1Ev();
extern void _ZN3aaa9GG3313313D1Ev();
Name_Map name_map__ZN3aaa9GG3313313E[] = {
  NSPAIR(_ZN3aaa9GG3313313C1Ev),
  NSPAIR(_ZN3aaa9GG3313313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3313313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313313E[];
extern void _ZN3aaa9GG33133133fooEv();
extern void _ZN3aaa9GG33133133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33133133fooEv,_ZThn8_N3aaa9GG33133133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33133133barEv,_ZThn8_N3aaa9GG33133133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33133133fooEv,_ZThn20_N3aaa9GG33133133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33133133barEv,_ZThn20_N3aaa9GG33133133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33133133fooEv,_ZThn28_N3aaa9GG33133133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33133133barEv,_ZThn28_N3aaa9GG33133133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33133133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33133133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133133fooEv,_ZThn8_N3aaa9GG33133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133133barEv,_ZThn8_N3aaa9GG33133133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133133fooEv,_ZThn20_N3aaa9GG33133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133133barEv,_ZThn20_N3aaa9GG33133133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133133fooEv,_ZThn28_N3aaa9GG33133133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133133barEv,_ZThn28_N3aaa9GG33133133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313313E[];
Class_Descriptor cd__ZN3aaa9GG3313313E = {  "_ZN3aaa9GG3313313E", // class name
  bases__ZN3aaa9GG3313313E, 6,
  &(vtc__ZN3aaa9GG3313313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313321  : ::aaa::EE331 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33133213fooEv
  ~GG3313321(); // tgen
  GG3313321(); // tgen
};
//SIG(1 _ZN3aaa9GG3313321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33133213fooEv");}
aaa::GG3313321 ::~GG3313321(){ note_dtor("_ZN3aaa9GG3313321E", this);} // tgen
aaa::GG3313321 ::GG3313321(){ note_ctor("_ZN3aaa9GG3313321E", this);} // tgen
}
static void Test__ZN3aaa9GG3313321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313321E, buf);
    ::aaa::GG3313321 *dp, &lv = *(dp=new (buf) ::aaa::GG3313321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313321E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3313321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3313321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3313321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313321E);
    dp->::aaa::GG3313321::~GG3313321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313321E(Test__ZN3aaa9GG3313321E, "_ZN3aaa9GG3313321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313321C1Ev();
extern void _ZN3aaa9GG3313321D1Ev();
Name_Map name_map__ZN3aaa9GG3313321E[] = {
  NSPAIR(_ZN3aaa9GG3313321C1Ev),
  NSPAIR(_ZN3aaa9GG3313321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3313321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313321E[];
extern void _ZN3aaa9GG33133213fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33133213fooEv,_ZThn8_N3aaa9GG33133213fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33133213fooEv,_ZThn20_N3aaa9GG33133213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33133213fooEv,_ZThn28_N3aaa9GG33133213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33133213fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133213fooEv,_ZThn8_N3aaa9GG33133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133213fooEv,_ZThn20_N3aaa9GG33133213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133213fooEv,_ZThn28_N3aaa9GG33133213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313321E[];
Class_Descriptor cd__ZN3aaa9GG3313321E = {  "_ZN3aaa9GG3313321E", // class name
  bases__ZN3aaa9GG3313321E, 6,
  &(vtc__ZN3aaa9GG3313321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313322  : ::aaa::EE331 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33133223barEv
  ~GG3313322(); // tgen
  GG3313322(); // tgen
};
//SIG(1 _ZN3aaa9GG3313322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33133223barEv");}
aaa::GG3313322 ::~GG3313322(){ note_dtor("_ZN3aaa9GG3313322E", this);} // tgen
aaa::GG3313322 ::GG3313322(){ note_ctor("_ZN3aaa9GG3313322E", this);} // tgen
}
static void Test__ZN3aaa9GG3313322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313322E, buf);
    ::aaa::GG3313322 *dp, &lv = *(dp=new (buf) ::aaa::GG3313322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313322E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3313322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3313322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3313322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313322E);
    dp->::aaa::GG3313322::~GG3313322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313322E(Test__ZN3aaa9GG3313322E, "_ZN3aaa9GG3313322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313322C1Ev();
extern void _ZN3aaa9GG3313322D1Ev();
Name_Map name_map__ZN3aaa9GG3313322E[] = {
  NSPAIR(_ZN3aaa9GG3313322C1Ev),
  NSPAIR(_ZN3aaa9GG3313322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3313322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313322E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33133223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33133223barEv,_ZThn8_N3aaa9GG33133223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33133223barEv,_ZThn20_N3aaa9GG33133223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33133223barEv,_ZThn28_N3aaa9GG33133223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33133223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133223barEv,_ZThn8_N3aaa9GG33133223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133223barEv,_ZThn20_N3aaa9GG33133223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133223barEv,_ZThn28_N3aaa9GG33133223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313322E[];
Class_Descriptor cd__ZN3aaa9GG3313322E = {  "_ZN3aaa9GG3313322E", // class name
  bases__ZN3aaa9GG3313322E, 6,
  &(vtc__ZN3aaa9GG3313322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313323  : ::aaa::EE331 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33133233fooEv
  virtual void  bar(); // _ZN3aaa9GG33133233barEv
  ~GG3313323(); // tgen
  GG3313323(); // tgen
};
//SIG(1 _ZN3aaa9GG3313323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33133233fooEv");}
void  aaa::GG3313323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33133233barEv");}
aaa::GG3313323 ::~GG3313323(){ note_dtor("_ZN3aaa9GG3313323E", this);} // tgen
aaa::GG3313323 ::GG3313323(){ note_ctor("_ZN3aaa9GG3313323E", this);} // tgen
}
static void Test__ZN3aaa9GG3313323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313323E, buf);
    ::aaa::GG3313323 *dp, &lv = *(dp=new (buf) ::aaa::GG3313323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313323E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3313323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3313323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3313323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313323E);
    dp->::aaa::GG3313323::~GG3313323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313323E(Test__ZN3aaa9GG3313323E, "_ZN3aaa9GG3313323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313323C1Ev();
extern void _ZN3aaa9GG3313323D1Ev();
Name_Map name_map__ZN3aaa9GG3313323E[] = {
  NSPAIR(_ZN3aaa9GG3313323C1Ev),
  NSPAIR(_ZN3aaa9GG3313323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3313323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313323E[];
extern void _ZN3aaa9GG33133233fooEv();
extern void _ZN3aaa9GG33133233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33133233fooEv,_ZThn8_N3aaa9GG33133233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33133233barEv,_ZThn8_N3aaa9GG33133233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33133233fooEv,_ZThn20_N3aaa9GG33133233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33133233barEv,_ZThn20_N3aaa9GG33133233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33133233fooEv,_ZThn28_N3aaa9GG33133233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33133233barEv,_ZThn28_N3aaa9GG33133233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33133233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33133233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133233fooEv,_ZThn8_N3aaa9GG33133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133233barEv,_ZThn8_N3aaa9GG33133233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133233fooEv,_ZThn20_N3aaa9GG33133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133233barEv,_ZThn20_N3aaa9GG33133233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133233fooEv,_ZThn28_N3aaa9GG33133233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133233barEv,_ZThn28_N3aaa9GG33133233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313323E[];
Class_Descriptor cd__ZN3aaa9GG3313323E = {  "_ZN3aaa9GG3313323E", // class name
  bases__ZN3aaa9GG3313323E, 6,
  &(vtc__ZN3aaa9GG3313323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313331  : ::aaa::EE331 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33133313fooEv
  ~GG3313331(); // tgen
  GG3313331(); // tgen
};
//SIG(1 _ZN3aaa9GG3313331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v3 Fi} v1 Fi} BC5{ BC3 BC4 v1 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33133313fooEv");}
aaa::GG3313331 ::~GG3313331(){ note_dtor("_ZN3aaa9GG3313331E", this);} // tgen
aaa::GG3313331 ::GG3313331(){ note_ctor("_ZN3aaa9GG3313331E", this);} // tgen
}
static void Test__ZN3aaa9GG3313331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313331E, buf);
    ::aaa::GG3313331 *dp, &lv = *(dp=new (buf) ::aaa::GG3313331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313331E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3313331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3313331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3313331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313331E);
    dp->::aaa::GG3313331::~GG3313331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313331E(Test__ZN3aaa9GG3313331E, "_ZN3aaa9GG3313331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313331C1Ev();
extern void _ZN3aaa9GG3313331D1Ev();
Name_Map name_map__ZN3aaa9GG3313331E[] = {
  NSPAIR(_ZN3aaa9GG3313331C1Ev),
  NSPAIR(_ZN3aaa9GG3313331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3313331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313331E[];
extern void _ZN3aaa9GG33133313fooEv();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33133313fooEv,_ZThn8_N3aaa9GG33133313fooEv)();
extern void _ZN3aaa3BB33barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33133313fooEv,_ZThn20_N3aaa9GG33133313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33133313fooEv,_ZThn28_N3aaa9GG33133313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33133313fooEv,
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133313fooEv,_ZThn8_N3aaa9GG33133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133313fooEv,_ZThn20_N3aaa9GG33133313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133313fooEv,_ZThn28_N3aaa9GG33133313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313331E[];
Class_Descriptor cd__ZN3aaa9GG3313331E = {  "_ZN3aaa9GG3313331E", // class name
  bases__ZN3aaa9GG3313331E, 6,
  &(vtc__ZN3aaa9GG3313331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313332  : ::aaa::EE331 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33133323barEv
  ~GG3313332(); // tgen
  GG3313332(); // tgen
};
//SIG(1 _ZN3aaa9GG3313332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3313332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33133323barEv");}
aaa::GG3313332 ::~GG3313332(){ note_dtor("_ZN3aaa9GG3313332E", this);} // tgen
aaa::GG3313332 ::GG3313332(){ note_ctor("_ZN3aaa9GG3313332E", this);} // tgen
}
static void Test__ZN3aaa9GG3313332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313332E, buf);
    ::aaa::GG3313332 *dp, &lv = *(dp=new (buf) ::aaa::GG3313332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313332E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3313332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3313332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3313332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313332E);
    dp->::aaa::GG3313332::~GG3313332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313332E(Test__ZN3aaa9GG3313332E, "_ZN3aaa9GG3313332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313332C1Ev();
extern void _ZN3aaa9GG3313332D1Ev();
Name_Map name_map__ZN3aaa9GG3313332E[] = {
  NSPAIR(_ZN3aaa9GG3313332C1Ev),
  NSPAIR(_ZN3aaa9GG3313332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3313332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313332E[];
extern void _ZN3aaa5EE3313fooEv();
extern void _ZN3aaa9GG33133323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33133323barEv,_ZThn8_N3aaa9GG33133323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33133323barEv,_ZThn20_N3aaa9GG33133323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33133323barEv,_ZThn28_N3aaa9GG33133323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3313fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33133323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3313fooEv,_ZThn8_N3aaa5EE3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133323barEv,_ZThn8_N3aaa9GG33133323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133323barEv,_ZThn20_N3aaa9GG33133323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133323barEv,_ZThn28_N3aaa9GG33133323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313332E[];
Class_Descriptor cd__ZN3aaa9GG3313332E = {  "_ZN3aaa9GG3313332E", // class name
  bases__ZN3aaa9GG3313332E, 6,
  &(vtc__ZN3aaa9GG3313332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3313333  : ::aaa::EE331 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33133333fooEv
  virtual void  bar(); // _ZN3aaa9GG33133333barEv
  ~GG3313333(); // tgen
  GG3313333(); // tgen
};
//SIG(1 _ZN3aaa9GG3313333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3313333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33133333fooEv");}
void  aaa::GG3313333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33133333barEv");}
aaa::GG3313333 ::~GG3313333(){ note_dtor("_ZN3aaa9GG3313333E", this);} // tgen
aaa::GG3313333 ::GG3313333(){ note_ctor("_ZN3aaa9GG3313333E", this);} // tgen
}
static void Test__ZN3aaa9GG3313333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3313333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3313333E, buf);
    ::aaa::GG3313333 *dp, &lv = *(dp=new (buf) ::aaa::GG3313333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3313333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3313333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE331*), 0, "_ZN3aaa9GG3313333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE331*), ABISELECT(16,8), "_ZN3aaa9GG3313333E");
    check_base_class_offset(lv, (::aaa::EE331*), 0, "_ZN3aaa9GG3313333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3313333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3313333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3313333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3313333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3313333E);
    dp->::aaa::GG3313333::~GG3313333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3313333E(Test__ZN3aaa9GG3313333E, "_ZN3aaa9GG3313333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3313333C1Ev();
extern void _ZN3aaa9GG3313333D1Ev();
Name_Map name_map__ZN3aaa9GG3313333E[] = {
  NSPAIR(_ZN3aaa9GG3313333C1Ev),
  NSPAIR(_ZN3aaa9GG3313333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE331E;
extern VTBL_ENTRY _ZTIN3aaa5EE331E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE331E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3313333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE331E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3313333E[];
extern void _ZN3aaa9GG33133333fooEv();
extern void _ZN3aaa9GG33133333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33133333fooEv,_ZThn8_N3aaa9GG33133333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33133333barEv,_ZThn8_N3aaa9GG33133333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33133333fooEv,_ZThn20_N3aaa9GG33133333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33133333barEv,_ZThn20_N3aaa9GG33133333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33133333fooEv,_ZThn28_N3aaa9GG33133333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33133333barEv,_ZThn28_N3aaa9GG33133333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3313333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33133333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33133333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133333fooEv,_ZThn8_N3aaa9GG33133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33133333barEv,_ZThn8_N3aaa9GG33133333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133333fooEv,_ZThn20_N3aaa9GG33133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33133333barEv,_ZThn20_N3aaa9GG33133333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3313333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133333fooEv,_ZThn28_N3aaa9GG33133333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33133333barEv,_ZThn28_N3aaa9GG33133333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3313333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3313333E[];
Class_Descriptor cd__ZN3aaa9GG3313333E = {  "_ZN3aaa9GG3313333E", // class name
  bases__ZN3aaa9GG3313333E, 6,
  &(vtc__ZN3aaa9GG3313333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3313333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3313333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321111  : ::aaa::EE332 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33211113fooEv
  ~GG3321111(); // tgen
  GG3321111(); // tgen
};
//SIG(1 _ZN3aaa9GG3321111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33211113fooEv");}
aaa::GG3321111 ::~GG3321111(){ note_dtor("_ZN3aaa9GG3321111E", this);} // tgen
aaa::GG3321111 ::GG3321111(){ note_ctor("_ZN3aaa9GG3321111E", this);} // tgen
}
static void Test__ZN3aaa9GG3321111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321111E, buf);
    ::aaa::GG3321111 *dp, &lv = *(dp=new (buf) ::aaa::GG3321111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321111E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3321111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3321111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3321111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321111E);
    dp->::aaa::GG3321111::~GG3321111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321111E(Test__ZN3aaa9GG3321111E, "_ZN3aaa9GG3321111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321111C1Ev();
extern void _ZN3aaa9GG3321111D1Ev();
Name_Map name_map__ZN3aaa9GG3321111E[] = {
  NSPAIR(_ZN3aaa9GG3321111C1Ev),
  NSPAIR(_ZN3aaa9GG3321111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3321111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321111E[];
extern void _ZN3aaa9GG33211113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211113fooEv,_ZThn8_N3aaa9GG33211113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33211113fooEv,_ZThn20_N3aaa9GG33211113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33211113fooEv,_ZThn28_N3aaa9GG33211113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33211113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211113fooEv,_ZThn8_N3aaa9GG33211113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211113fooEv,_ZThn20_N3aaa9GG33211113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33211113fooEv,_ZThn28_N3aaa9GG33211113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321111E[];
Class_Descriptor cd__ZN3aaa9GG3321111E = {  "_ZN3aaa9GG3321111E", // class name
  bases__ZN3aaa9GG3321111E, 6,
  &(vtc__ZN3aaa9GG3321111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321112  : ::aaa::EE332 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33211123barEv
  ~GG3321112(); // tgen
  GG3321112(); // tgen
};
//SIG(1 _ZN3aaa9GG3321112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33211123barEv");}
aaa::GG3321112 ::~GG3321112(){ note_dtor("_ZN3aaa9GG3321112E", this);} // tgen
aaa::GG3321112 ::GG3321112(){ note_ctor("_ZN3aaa9GG3321112E", this);} // tgen
}
static void Test__ZN3aaa9GG3321112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321112E, buf);
    ::aaa::GG3321112 *dp, &lv = *(dp=new (buf) ::aaa::GG3321112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321112E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3321112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3321112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3321112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321112E);
    dp->::aaa::GG3321112::~GG3321112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321112E(Test__ZN3aaa9GG3321112E, "_ZN3aaa9GG3321112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321112C1Ev();
extern void _ZN3aaa9GG3321112D1Ev();
Name_Map name_map__ZN3aaa9GG3321112E[] = {
  NSPAIR(_ZN3aaa9GG3321112C1Ev),
  NSPAIR(_ZN3aaa9GG3321112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3321112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33211123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211123barEv,_ZThn8_N3aaa9GG33211123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33211123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211123barEv,_ZThn8_N3aaa9GG33211123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321112E[];
Class_Descriptor cd__ZN3aaa9GG3321112E = {  "_ZN3aaa9GG3321112E", // class name
  bases__ZN3aaa9GG3321112E, 6,
  &(vtc__ZN3aaa9GG3321112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321113  : ::aaa::EE332 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33211133fooEv
  virtual void  bar(); // _ZN3aaa9GG33211133barEv
  ~GG3321113(); // tgen
  GG3321113(); // tgen
};
//SIG(1 _ZN3aaa9GG3321113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33211133fooEv");}
void  aaa::GG3321113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33211133barEv");}
aaa::GG3321113 ::~GG3321113(){ note_dtor("_ZN3aaa9GG3321113E", this);} // tgen
aaa::GG3321113 ::GG3321113(){ note_ctor("_ZN3aaa9GG3321113E", this);} // tgen
}
static void Test__ZN3aaa9GG3321113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321113E, buf);
    ::aaa::GG3321113 *dp, &lv = *(dp=new (buf) ::aaa::GG3321113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321113E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3321113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3321113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3321113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321113E);
    dp->::aaa::GG3321113::~GG3321113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321113E(Test__ZN3aaa9GG3321113E, "_ZN3aaa9GG3321113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321113C1Ev();
extern void _ZN3aaa9GG3321113D1Ev();
Name_Map name_map__ZN3aaa9GG3321113E[] = {
  NSPAIR(_ZN3aaa9GG3321113C1Ev),
  NSPAIR(_ZN3aaa9GG3321113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3321113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321113E[];
extern void _ZN3aaa9GG33211133fooEv();
extern void _ZN3aaa9GG33211133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211133fooEv,_ZThn8_N3aaa9GG33211133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33211133barEv,_ZThn8_N3aaa9GG33211133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33211133fooEv,_ZThn20_N3aaa9GG33211133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33211133fooEv,_ZThn28_N3aaa9GG33211133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33211133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33211133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211133fooEv,_ZThn8_N3aaa9GG33211133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211133barEv,_ZThn8_N3aaa9GG33211133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211133fooEv,_ZThn20_N3aaa9GG33211133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33211133fooEv,_ZThn28_N3aaa9GG33211133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321113E[];
Class_Descriptor cd__ZN3aaa9GG3321113E = {  "_ZN3aaa9GG3321113E", // class name
  bases__ZN3aaa9GG3321113E, 6,
  &(vtc__ZN3aaa9GG3321113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321121  : ::aaa::EE332 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33211213fooEv
  ~GG3321121(); // tgen
  GG3321121(); // tgen
};
//SIG(1 _ZN3aaa9GG3321121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33211213fooEv");}
aaa::GG3321121 ::~GG3321121(){ note_dtor("_ZN3aaa9GG3321121E", this);} // tgen
aaa::GG3321121 ::GG3321121(){ note_ctor("_ZN3aaa9GG3321121E", this);} // tgen
}
static void Test__ZN3aaa9GG3321121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321121E, buf);
    ::aaa::GG3321121 *dp, &lv = *(dp=new (buf) ::aaa::GG3321121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321121E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3321121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3321121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3321121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321121E);
    dp->::aaa::GG3321121::~GG3321121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321121E(Test__ZN3aaa9GG3321121E, "_ZN3aaa9GG3321121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321121C1Ev();
extern void _ZN3aaa9GG3321121D1Ev();
Name_Map name_map__ZN3aaa9GG3321121E[] = {
  NSPAIR(_ZN3aaa9GG3321121C1Ev),
  NSPAIR(_ZN3aaa9GG3321121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3321121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321121E[];
extern void _ZN3aaa9GG33211213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211213fooEv,_ZThn8_N3aaa9GG33211213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33211213fooEv,_ZThn20_N3aaa9GG33211213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33211213fooEv,_ZThn28_N3aaa9GG33211213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33211213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211213fooEv,_ZThn8_N3aaa9GG33211213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211213fooEv,_ZThn20_N3aaa9GG33211213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33211213fooEv,_ZThn28_N3aaa9GG33211213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321121E[];
Class_Descriptor cd__ZN3aaa9GG3321121E = {  "_ZN3aaa9GG3321121E", // class name
  bases__ZN3aaa9GG3321121E, 6,
  &(vtc__ZN3aaa9GG3321121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321122  : ::aaa::EE332 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33211223barEv
  ~GG3321122(); // tgen
  GG3321122(); // tgen
};
//SIG(1 _ZN3aaa9GG3321122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v5 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33211223barEv");}
aaa::GG3321122 ::~GG3321122(){ note_dtor("_ZN3aaa9GG3321122E", this);} // tgen
aaa::GG3321122 ::GG3321122(){ note_ctor("_ZN3aaa9GG3321122E", this);} // tgen
}
static void Test__ZN3aaa9GG3321122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321122E, buf);
    ::aaa::GG3321122 *dp, &lv = *(dp=new (buf) ::aaa::GG3321122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321122E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3321122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3321122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3321122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321122E);
    dp->::aaa::GG3321122::~GG3321122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321122E(Test__ZN3aaa9GG3321122E, "_ZN3aaa9GG3321122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321122C1Ev();
extern void _ZN3aaa9GG3321122D1Ev();
Name_Map name_map__ZN3aaa9GG3321122E[] = {
  NSPAIR(_ZN3aaa9GG3321122C1Ev),
  NSPAIR(_ZN3aaa9GG3321122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3321122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33211223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211223barEv,_ZThn8_N3aaa9GG33211223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33211223barEv,_ZThn20_N3aaa9GG33211223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33211223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211223barEv,_ZThn8_N3aaa9GG33211223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211223barEv,_ZThn20_N3aaa9GG33211223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321122E[];
Class_Descriptor cd__ZN3aaa9GG3321122E = {  "_ZN3aaa9GG3321122E", // class name
  bases__ZN3aaa9GG3321122E, 6,
  &(vtc__ZN3aaa9GG3321122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321123  : ::aaa::EE332 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33211233fooEv
  virtual void  bar(); // _ZN3aaa9GG33211233barEv
  ~GG3321123(); // tgen
  GG3321123(); // tgen
};
//SIG(1 _ZN3aaa9GG3321123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33211233fooEv");}
void  aaa::GG3321123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33211233barEv");}
aaa::GG3321123 ::~GG3321123(){ note_dtor("_ZN3aaa9GG3321123E", this);} // tgen
aaa::GG3321123 ::GG3321123(){ note_ctor("_ZN3aaa9GG3321123E", this);} // tgen
}
static void Test__ZN3aaa9GG3321123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321123E, buf);
    ::aaa::GG3321123 *dp, &lv = *(dp=new (buf) ::aaa::GG3321123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321123E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3321123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3321123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3321123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321123E);
    dp->::aaa::GG3321123::~GG3321123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321123E(Test__ZN3aaa9GG3321123E, "_ZN3aaa9GG3321123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321123C1Ev();
extern void _ZN3aaa9GG3321123D1Ev();
Name_Map name_map__ZN3aaa9GG3321123E[] = {
  NSPAIR(_ZN3aaa9GG3321123C1Ev),
  NSPAIR(_ZN3aaa9GG3321123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3321123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321123E[];
extern void _ZN3aaa9GG33211233fooEv();
extern void _ZN3aaa9GG33211233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211233fooEv,_ZThn8_N3aaa9GG33211233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33211233barEv,_ZThn8_N3aaa9GG33211233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33211233fooEv,_ZThn20_N3aaa9GG33211233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33211233barEv,_ZThn20_N3aaa9GG33211233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33211233fooEv,_ZThn28_N3aaa9GG33211233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33211233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33211233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211233fooEv,_ZThn8_N3aaa9GG33211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211233barEv,_ZThn8_N3aaa9GG33211233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211233fooEv,_ZThn20_N3aaa9GG33211233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211233barEv,_ZThn20_N3aaa9GG33211233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33211233fooEv,_ZThn28_N3aaa9GG33211233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321123E[];
Class_Descriptor cd__ZN3aaa9GG3321123E = {  "_ZN3aaa9GG3321123E", // class name
  bases__ZN3aaa9GG3321123E, 6,
  &(vtc__ZN3aaa9GG3321123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321131  : ::aaa::EE332 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33211313fooEv
  ~GG3321131(); // tgen
  GG3321131(); // tgen
};
//SIG(1 _ZN3aaa9GG3321131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33211313fooEv");}
aaa::GG3321131 ::~GG3321131(){ note_dtor("_ZN3aaa9GG3321131E", this);} // tgen
aaa::GG3321131 ::GG3321131(){ note_ctor("_ZN3aaa9GG3321131E", this);} // tgen
}
static void Test__ZN3aaa9GG3321131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321131E, buf);
    ::aaa::GG3321131 *dp, &lv = *(dp=new (buf) ::aaa::GG3321131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321131E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3321131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3321131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3321131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321131E);
    dp->::aaa::GG3321131::~GG3321131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321131E(Test__ZN3aaa9GG3321131E, "_ZN3aaa9GG3321131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321131C1Ev();
extern void _ZN3aaa9GG3321131D1Ev();
Name_Map name_map__ZN3aaa9GG3321131E[] = {
  NSPAIR(_ZN3aaa9GG3321131C1Ev),
  NSPAIR(_ZN3aaa9GG3321131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3321131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321131E[];
extern void _ZN3aaa9GG33211313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211313fooEv,_ZThn8_N3aaa9GG33211313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33211313fooEv,_ZThn20_N3aaa9GG33211313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33211313fooEv,_ZThn28_N3aaa9GG33211313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33211313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211313fooEv,_ZThn8_N3aaa9GG33211313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211313fooEv,_ZThn20_N3aaa9GG33211313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33211313fooEv,_ZThn28_N3aaa9GG33211313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321131E[];
Class_Descriptor cd__ZN3aaa9GG3321131E = {  "_ZN3aaa9GG3321131E", // class name
  bases__ZN3aaa9GG3321131E, 6,
  &(vtc__ZN3aaa9GG3321131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321132  : ::aaa::EE332 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33211323barEv
  ~GG3321132(); // tgen
  GG3321132(); // tgen
};
//SIG(1 _ZN3aaa9GG3321132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v4 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33211323barEv");}
aaa::GG3321132 ::~GG3321132(){ note_dtor("_ZN3aaa9GG3321132E", this);} // tgen
aaa::GG3321132 ::GG3321132(){ note_ctor("_ZN3aaa9GG3321132E", this);} // tgen
}
static void Test__ZN3aaa9GG3321132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321132E, buf);
    ::aaa::GG3321132 *dp, &lv = *(dp=new (buf) ::aaa::GG3321132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321132E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3321132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3321132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3321132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321132E);
    dp->::aaa::GG3321132::~GG3321132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321132E(Test__ZN3aaa9GG3321132E, "_ZN3aaa9GG3321132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321132C1Ev();
extern void _ZN3aaa9GG3321132D1Ev();
Name_Map name_map__ZN3aaa9GG3321132E[] = {
  NSPAIR(_ZN3aaa9GG3321132C1Ev),
  NSPAIR(_ZN3aaa9GG3321132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3321132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33211323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211323barEv,_ZThn8_N3aaa9GG33211323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33211323barEv,_ZThn20_N3aaa9GG33211323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33211323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211323barEv,_ZThn8_N3aaa9GG33211323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211323barEv,_ZThn20_N3aaa9GG33211323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321132E[];
Class_Descriptor cd__ZN3aaa9GG3321132E = {  "_ZN3aaa9GG3321132E", // class name
  bases__ZN3aaa9GG3321132E, 6,
  &(vtc__ZN3aaa9GG3321132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321133  : ::aaa::EE332 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33211333fooEv
  virtual void  bar(); // _ZN3aaa9GG33211333barEv
  ~GG3321133(); // tgen
  GG3321133(); // tgen
};
//SIG(1 _ZN3aaa9GG3321133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33211333fooEv");}
void  aaa::GG3321133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33211333barEv");}
aaa::GG3321133 ::~GG3321133(){ note_dtor("_ZN3aaa9GG3321133E", this);} // tgen
aaa::GG3321133 ::GG3321133(){ note_ctor("_ZN3aaa9GG3321133E", this);} // tgen
}
static void Test__ZN3aaa9GG3321133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321133E, buf);
    ::aaa::GG3321133 *dp, &lv = *(dp=new (buf) ::aaa::GG3321133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321133E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3321133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3321133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3321133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321133E);
    dp->::aaa::GG3321133::~GG3321133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321133E(Test__ZN3aaa9GG3321133E, "_ZN3aaa9GG3321133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321133C1Ev();
extern void _ZN3aaa9GG3321133D1Ev();
Name_Map name_map__ZN3aaa9GG3321133E[] = {
  NSPAIR(_ZN3aaa9GG3321133C1Ev),
  NSPAIR(_ZN3aaa9GG3321133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3321133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321133E[];
extern void _ZN3aaa9GG33211333fooEv();
extern void _ZN3aaa9GG33211333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33211333fooEv,_ZThn8_N3aaa9GG33211333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33211333barEv,_ZThn8_N3aaa9GG33211333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33211333fooEv,_ZThn20_N3aaa9GG33211333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33211333barEv,_ZThn20_N3aaa9GG33211333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33211333fooEv,_ZThn28_N3aaa9GG33211333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33211333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33211333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211333fooEv,_ZThn8_N3aaa9GG33211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33211333barEv,_ZThn8_N3aaa9GG33211333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211333fooEv,_ZThn20_N3aaa9GG33211333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33211333barEv,_ZThn20_N3aaa9GG33211333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33211333fooEv,_ZThn28_N3aaa9GG33211333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321133E[];
Class_Descriptor cd__ZN3aaa9GG3321133E = {  "_ZN3aaa9GG3321133E", // class name
  bases__ZN3aaa9GG3321133E, 6,
  &(vtc__ZN3aaa9GG3321133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321211  : ::aaa::EE332 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33212113fooEv
  ~GG3321211(); // tgen
  GG3321211(); // tgen
};
//SIG(1 _ZN3aaa9GG3321211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33212113fooEv");}
aaa::GG3321211 ::~GG3321211(){ note_dtor("_ZN3aaa9GG3321211E", this);} // tgen
aaa::GG3321211 ::GG3321211(){ note_ctor("_ZN3aaa9GG3321211E", this);} // tgen
}
static void Test__ZN3aaa9GG3321211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321211E, buf);
    ::aaa::GG3321211 *dp, &lv = *(dp=new (buf) ::aaa::GG3321211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321211E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3321211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3321211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3321211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321211E);
    dp->::aaa::GG3321211::~GG3321211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321211E(Test__ZN3aaa9GG3321211E, "_ZN3aaa9GG3321211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321211C1Ev();
extern void _ZN3aaa9GG3321211D1Ev();
Name_Map name_map__ZN3aaa9GG3321211E[] = {
  NSPAIR(_ZN3aaa9GG3321211C1Ev),
  NSPAIR(_ZN3aaa9GG3321211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3321211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321211E[];
extern void _ZN3aaa9GG33212113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212113fooEv,_ZThn8_N3aaa9GG33212113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33212113fooEv,_ZThn20_N3aaa9GG33212113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33212113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212113fooEv,_ZThn8_N3aaa9GG33212113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212113fooEv,_ZThn20_N3aaa9GG33212113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321211E[];
Class_Descriptor cd__ZN3aaa9GG3321211E = {  "_ZN3aaa9GG3321211E", // class name
  bases__ZN3aaa9GG3321211E, 6,
  &(vtc__ZN3aaa9GG3321211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321212  : ::aaa::EE332 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33212123barEv
  ~GG3321212(); // tgen
  GG3321212(); // tgen
};
//SIG(1 _ZN3aaa9GG3321212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33212123barEv");}
aaa::GG3321212 ::~GG3321212(){ note_dtor("_ZN3aaa9GG3321212E", this);} // tgen
aaa::GG3321212 ::GG3321212(){ note_ctor("_ZN3aaa9GG3321212E", this);} // tgen
}
static void Test__ZN3aaa9GG3321212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321212E, buf);
    ::aaa::GG3321212 *dp, &lv = *(dp=new (buf) ::aaa::GG3321212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321212E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3321212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3321212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3321212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321212E);
    dp->::aaa::GG3321212::~GG3321212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321212E(Test__ZN3aaa9GG3321212E, "_ZN3aaa9GG3321212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321212C1Ev();
extern void _ZN3aaa9GG3321212D1Ev();
Name_Map name_map__ZN3aaa9GG3321212E[] = {
  NSPAIR(_ZN3aaa9GG3321212C1Ev),
  NSPAIR(_ZN3aaa9GG3321212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3321212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33212123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212123barEv,_ZThn8_N3aaa9GG33212123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33212123barEv,_ZThn28_N3aaa9GG33212123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33212123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212123barEv,_ZThn8_N3aaa9GG33212123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33212123barEv,_ZThn28_N3aaa9GG33212123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321212E[];
Class_Descriptor cd__ZN3aaa9GG3321212E = {  "_ZN3aaa9GG3321212E", // class name
  bases__ZN3aaa9GG3321212E, 6,
  &(vtc__ZN3aaa9GG3321212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321213  : ::aaa::EE332 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33212133fooEv
  virtual void  bar(); // _ZN3aaa9GG33212133barEv
  ~GG3321213(); // tgen
  GG3321213(); // tgen
};
//SIG(1 _ZN3aaa9GG3321213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33212133fooEv");}
void  aaa::GG3321213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33212133barEv");}
aaa::GG3321213 ::~GG3321213(){ note_dtor("_ZN3aaa9GG3321213E", this);} // tgen
aaa::GG3321213 ::GG3321213(){ note_ctor("_ZN3aaa9GG3321213E", this);} // tgen
}
static void Test__ZN3aaa9GG3321213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321213E, buf);
    ::aaa::GG3321213 *dp, &lv = *(dp=new (buf) ::aaa::GG3321213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321213E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3321213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3321213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3321213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321213E);
    dp->::aaa::GG3321213::~GG3321213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321213E(Test__ZN3aaa9GG3321213E, "_ZN3aaa9GG3321213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321213C1Ev();
extern void _ZN3aaa9GG3321213D1Ev();
Name_Map name_map__ZN3aaa9GG3321213E[] = {
  NSPAIR(_ZN3aaa9GG3321213C1Ev),
  NSPAIR(_ZN3aaa9GG3321213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3321213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321213E[];
extern void _ZN3aaa9GG33212133fooEv();
extern void _ZN3aaa9GG33212133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212133fooEv,_ZThn8_N3aaa9GG33212133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33212133barEv,_ZThn8_N3aaa9GG33212133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33212133fooEv,_ZThn20_N3aaa9GG33212133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33212133barEv,_ZThn28_N3aaa9GG33212133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33212133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33212133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212133fooEv,_ZThn8_N3aaa9GG33212133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212133barEv,_ZThn8_N3aaa9GG33212133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212133fooEv,_ZThn20_N3aaa9GG33212133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33212133barEv,_ZThn28_N3aaa9GG33212133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321213E[];
Class_Descriptor cd__ZN3aaa9GG3321213E = {  "_ZN3aaa9GG3321213E", // class name
  bases__ZN3aaa9GG3321213E, 6,
  &(vtc__ZN3aaa9GG3321213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321221  : ::aaa::EE332 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33212213fooEv
  ~GG3321221(); // tgen
  GG3321221(); // tgen
};
//SIG(1 _ZN3aaa9GG3321221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33212213fooEv");}
aaa::GG3321221 ::~GG3321221(){ note_dtor("_ZN3aaa9GG3321221E", this);} // tgen
aaa::GG3321221 ::GG3321221(){ note_ctor("_ZN3aaa9GG3321221E", this);} // tgen
}
static void Test__ZN3aaa9GG3321221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321221E, buf);
    ::aaa::GG3321221 *dp, &lv = *(dp=new (buf) ::aaa::GG3321221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321221E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3321221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3321221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3321221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321221E);
    dp->::aaa::GG3321221::~GG3321221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321221E(Test__ZN3aaa9GG3321221E, "_ZN3aaa9GG3321221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321221C1Ev();
extern void _ZN3aaa9GG3321221D1Ev();
Name_Map name_map__ZN3aaa9GG3321221E[] = {
  NSPAIR(_ZN3aaa9GG3321221C1Ev),
  NSPAIR(_ZN3aaa9GG3321221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3321221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321221E[];
extern void _ZN3aaa9GG33212213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212213fooEv,_ZThn8_N3aaa9GG33212213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33212213fooEv,_ZThn20_N3aaa9GG33212213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33212213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212213fooEv,_ZThn8_N3aaa9GG33212213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212213fooEv,_ZThn20_N3aaa9GG33212213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321221E[];
Class_Descriptor cd__ZN3aaa9GG3321221E = {  "_ZN3aaa9GG3321221E", // class name
  bases__ZN3aaa9GG3321221E, 6,
  &(vtc__ZN3aaa9GG3321221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321222  : ::aaa::EE332 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33212223barEv
  ~GG3321222(); // tgen
  GG3321222(); // tgen
};
//SIG(1 _ZN3aaa9GG3321222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33212223barEv");}
aaa::GG3321222 ::~GG3321222(){ note_dtor("_ZN3aaa9GG3321222E", this);} // tgen
aaa::GG3321222 ::GG3321222(){ note_ctor("_ZN3aaa9GG3321222E", this);} // tgen
}
static void Test__ZN3aaa9GG3321222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321222E, buf);
    ::aaa::GG3321222 *dp, &lv = *(dp=new (buf) ::aaa::GG3321222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321222E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3321222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3321222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3321222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321222E);
    dp->::aaa::GG3321222::~GG3321222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321222E(Test__ZN3aaa9GG3321222E, "_ZN3aaa9GG3321222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321222C1Ev();
extern void _ZN3aaa9GG3321222D1Ev();
Name_Map name_map__ZN3aaa9GG3321222E[] = {
  NSPAIR(_ZN3aaa9GG3321222C1Ev),
  NSPAIR(_ZN3aaa9GG3321222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3321222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33212223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212223barEv,_ZThn8_N3aaa9GG33212223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33212223barEv,_ZThn20_N3aaa9GG33212223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33212223barEv,_ZThn28_N3aaa9GG33212223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33212223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212223barEv,_ZThn8_N3aaa9GG33212223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212223barEv,_ZThn20_N3aaa9GG33212223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33212223barEv,_ZThn28_N3aaa9GG33212223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321222E[];
Class_Descriptor cd__ZN3aaa9GG3321222E = {  "_ZN3aaa9GG3321222E", // class name
  bases__ZN3aaa9GG3321222E, 6,
  &(vtc__ZN3aaa9GG3321222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321223  : ::aaa::EE332 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33212233fooEv
  virtual void  bar(); // _ZN3aaa9GG33212233barEv
  ~GG3321223(); // tgen
  GG3321223(); // tgen
};
//SIG(1 _ZN3aaa9GG3321223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33212233fooEv");}
void  aaa::GG3321223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33212233barEv");}
aaa::GG3321223 ::~GG3321223(){ note_dtor("_ZN3aaa9GG3321223E", this);} // tgen
aaa::GG3321223 ::GG3321223(){ note_ctor("_ZN3aaa9GG3321223E", this);} // tgen
}
static void Test__ZN3aaa9GG3321223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321223E, buf);
    ::aaa::GG3321223 *dp, &lv = *(dp=new (buf) ::aaa::GG3321223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321223E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3321223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3321223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3321223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321223E);
    dp->::aaa::GG3321223::~GG3321223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321223E(Test__ZN3aaa9GG3321223E, "_ZN3aaa9GG3321223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321223C1Ev();
extern void _ZN3aaa9GG3321223D1Ev();
Name_Map name_map__ZN3aaa9GG3321223E[] = {
  NSPAIR(_ZN3aaa9GG3321223C1Ev),
  NSPAIR(_ZN3aaa9GG3321223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3321223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321223E[];
extern void _ZN3aaa9GG33212233fooEv();
extern void _ZN3aaa9GG33212233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212233fooEv,_ZThn8_N3aaa9GG33212233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33212233barEv,_ZThn8_N3aaa9GG33212233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33212233fooEv,_ZThn20_N3aaa9GG33212233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33212233barEv,_ZThn20_N3aaa9GG33212233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33212233barEv,_ZThn28_N3aaa9GG33212233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33212233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33212233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212233fooEv,_ZThn8_N3aaa9GG33212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212233barEv,_ZThn8_N3aaa9GG33212233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212233fooEv,_ZThn20_N3aaa9GG33212233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212233barEv,_ZThn20_N3aaa9GG33212233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33212233barEv,_ZThn28_N3aaa9GG33212233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321223E[];
Class_Descriptor cd__ZN3aaa9GG3321223E = {  "_ZN3aaa9GG3321223E", // class name
  bases__ZN3aaa9GG3321223E, 6,
  &(vtc__ZN3aaa9GG3321223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321231  : ::aaa::EE332 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33212313fooEv
  ~GG3321231(); // tgen
  GG3321231(); // tgen
};
//SIG(1 _ZN3aaa9GG3321231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33212313fooEv");}
aaa::GG3321231 ::~GG3321231(){ note_dtor("_ZN3aaa9GG3321231E", this);} // tgen
aaa::GG3321231 ::GG3321231(){ note_ctor("_ZN3aaa9GG3321231E", this);} // tgen
}
static void Test__ZN3aaa9GG3321231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321231E, buf);
    ::aaa::GG3321231 *dp, &lv = *(dp=new (buf) ::aaa::GG3321231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321231E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3321231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3321231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3321231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321231E);
    dp->::aaa::GG3321231::~GG3321231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321231E(Test__ZN3aaa9GG3321231E, "_ZN3aaa9GG3321231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321231C1Ev();
extern void _ZN3aaa9GG3321231D1Ev();
Name_Map name_map__ZN3aaa9GG3321231E[] = {
  NSPAIR(_ZN3aaa9GG3321231C1Ev),
  NSPAIR(_ZN3aaa9GG3321231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3321231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321231E[];
extern void _ZN3aaa9GG33212313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212313fooEv,_ZThn8_N3aaa9GG33212313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33212313fooEv,_ZThn20_N3aaa9GG33212313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33212313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212313fooEv,_ZThn8_N3aaa9GG33212313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212313fooEv,_ZThn20_N3aaa9GG33212313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321231E[];
Class_Descriptor cd__ZN3aaa9GG3321231E = {  "_ZN3aaa9GG3321231E", // class name
  bases__ZN3aaa9GG3321231E, 6,
  &(vtc__ZN3aaa9GG3321231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321232  : ::aaa::EE332 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33212323barEv
  ~GG3321232(); // tgen
  GG3321232(); // tgen
};
//SIG(1 _ZN3aaa9GG3321232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC7{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33212323barEv");}
aaa::GG3321232 ::~GG3321232(){ note_dtor("_ZN3aaa9GG3321232E", this);} // tgen
aaa::GG3321232 ::GG3321232(){ note_ctor("_ZN3aaa9GG3321232E", this);} // tgen
}
static void Test__ZN3aaa9GG3321232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321232E, buf);
    ::aaa::GG3321232 *dp, &lv = *(dp=new (buf) ::aaa::GG3321232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321232E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3321232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3321232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3321232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321232E);
    dp->::aaa::GG3321232::~GG3321232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321232E(Test__ZN3aaa9GG3321232E, "_ZN3aaa9GG3321232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321232C1Ev();
extern void _ZN3aaa9GG3321232D1Ev();
Name_Map name_map__ZN3aaa9GG3321232E[] = {
  NSPAIR(_ZN3aaa9GG3321232C1Ev),
  NSPAIR(_ZN3aaa9GG3321232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3321232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33212323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212323barEv,_ZThn8_N3aaa9GG33212323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33212323barEv,_ZThn20_N3aaa9GG33212323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33212323barEv,_ZThn28_N3aaa9GG33212323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33212323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212323barEv,_ZThn8_N3aaa9GG33212323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212323barEv,_ZThn20_N3aaa9GG33212323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33212323barEv,_ZThn28_N3aaa9GG33212323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321232E[];
Class_Descriptor cd__ZN3aaa9GG3321232E = {  "_ZN3aaa9GG3321232E", // class name
  bases__ZN3aaa9GG3321232E, 6,
  &(vtc__ZN3aaa9GG3321232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321233  : ::aaa::EE332 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33212333fooEv
  virtual void  bar(); // _ZN3aaa9GG33212333barEv
  ~GG3321233(); // tgen
  GG3321233(); // tgen
};
//SIG(1 _ZN3aaa9GG3321233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33212333fooEv");}
void  aaa::GG3321233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33212333barEv");}
aaa::GG3321233 ::~GG3321233(){ note_dtor("_ZN3aaa9GG3321233E", this);} // tgen
aaa::GG3321233 ::GG3321233(){ note_ctor("_ZN3aaa9GG3321233E", this);} // tgen
}
static void Test__ZN3aaa9GG3321233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321233E, buf);
    ::aaa::GG3321233 *dp, &lv = *(dp=new (buf) ::aaa::GG3321233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321233E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3321233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3321233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3321233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321233E);
    dp->::aaa::GG3321233::~GG3321233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321233E(Test__ZN3aaa9GG3321233E, "_ZN3aaa9GG3321233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321233C1Ev();
extern void _ZN3aaa9GG3321233D1Ev();
Name_Map name_map__ZN3aaa9GG3321233E[] = {
  NSPAIR(_ZN3aaa9GG3321233C1Ev),
  NSPAIR(_ZN3aaa9GG3321233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3321233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321233E[];
extern void _ZN3aaa9GG33212333fooEv();
extern void _ZN3aaa9GG33212333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33212333fooEv,_ZThn8_N3aaa9GG33212333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33212333barEv,_ZThn8_N3aaa9GG33212333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33212333fooEv,_ZThn20_N3aaa9GG33212333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33212333barEv,_ZThn20_N3aaa9GG33212333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33212333barEv,_ZThn28_N3aaa9GG33212333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33212333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33212333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212333fooEv,_ZThn8_N3aaa9GG33212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33212333barEv,_ZThn8_N3aaa9GG33212333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212333fooEv,_ZThn20_N3aaa9GG33212333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33212333barEv,_ZThn20_N3aaa9GG33212333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33212333barEv,_ZThn28_N3aaa9GG33212333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321233E[];
Class_Descriptor cd__ZN3aaa9GG3321233E = {  "_ZN3aaa9GG3321233E", // class name
  bases__ZN3aaa9GG3321233E, 6,
  &(vtc__ZN3aaa9GG3321233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321311  : ::aaa::EE332 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33213113fooEv
  ~GG3321311(); // tgen
  GG3321311(); // tgen
};
//SIG(1 _ZN3aaa9GG3321311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33213113fooEv");}
aaa::GG3321311 ::~GG3321311(){ note_dtor("_ZN3aaa9GG3321311E", this);} // tgen
aaa::GG3321311 ::GG3321311(){ note_ctor("_ZN3aaa9GG3321311E", this);} // tgen
}
static void Test__ZN3aaa9GG3321311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321311E, buf);
    ::aaa::GG3321311 *dp, &lv = *(dp=new (buf) ::aaa::GG3321311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321311E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3321311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3321311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3321311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321311E);
    dp->::aaa::GG3321311::~GG3321311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321311E(Test__ZN3aaa9GG3321311E, "_ZN3aaa9GG3321311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321311C1Ev();
extern void _ZN3aaa9GG3321311D1Ev();
Name_Map name_map__ZN3aaa9GG3321311E[] = {
  NSPAIR(_ZN3aaa9GG3321311C1Ev),
  NSPAIR(_ZN3aaa9GG3321311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3321311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321311E[];
extern void _ZN3aaa9GG33213113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213113fooEv,_ZThn8_N3aaa9GG33213113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33213113fooEv,_ZThn20_N3aaa9GG33213113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213113fooEv,_ZThn28_N3aaa9GG33213113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33213113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213113fooEv,_ZThn8_N3aaa9GG33213113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213113fooEv,_ZThn20_N3aaa9GG33213113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213113fooEv,_ZThn28_N3aaa9GG33213113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321311E[];
Class_Descriptor cd__ZN3aaa9GG3321311E = {  "_ZN3aaa9GG3321311E", // class name
  bases__ZN3aaa9GG3321311E, 6,
  &(vtc__ZN3aaa9GG3321311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321312  : ::aaa::EE332 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33213123barEv
  ~GG3321312(); // tgen
  GG3321312(); // tgen
};
//SIG(1 _ZN3aaa9GG3321312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33213123barEv");}
aaa::GG3321312 ::~GG3321312(){ note_dtor("_ZN3aaa9GG3321312E", this);} // tgen
aaa::GG3321312 ::GG3321312(){ note_ctor("_ZN3aaa9GG3321312E", this);} // tgen
}
static void Test__ZN3aaa9GG3321312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321312E, buf);
    ::aaa::GG3321312 *dp, &lv = *(dp=new (buf) ::aaa::GG3321312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321312E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3321312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3321312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3321312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321312E);
    dp->::aaa::GG3321312::~GG3321312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321312E(Test__ZN3aaa9GG3321312E, "_ZN3aaa9GG3321312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321312C1Ev();
extern void _ZN3aaa9GG3321312D1Ev();
Name_Map name_map__ZN3aaa9GG3321312E[] = {
  NSPAIR(_ZN3aaa9GG3321312C1Ev),
  NSPAIR(_ZN3aaa9GG3321312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3321312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33213123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213123barEv,_ZThn8_N3aaa9GG33213123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213123barEv,_ZThn28_N3aaa9GG33213123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33213123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213123barEv,_ZThn8_N3aaa9GG33213123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213123barEv,_ZThn28_N3aaa9GG33213123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321312E[];
Class_Descriptor cd__ZN3aaa9GG3321312E = {  "_ZN3aaa9GG3321312E", // class name
  bases__ZN3aaa9GG3321312E, 6,
  &(vtc__ZN3aaa9GG3321312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321313  : ::aaa::EE332 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33213133fooEv
  virtual void  bar(); // _ZN3aaa9GG33213133barEv
  ~GG3321313(); // tgen
  GG3321313(); // tgen
};
//SIG(1 _ZN3aaa9GG3321313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33213133fooEv");}
void  aaa::GG3321313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33213133barEv");}
aaa::GG3321313 ::~GG3321313(){ note_dtor("_ZN3aaa9GG3321313E", this);} // tgen
aaa::GG3321313 ::GG3321313(){ note_ctor("_ZN3aaa9GG3321313E", this);} // tgen
}
static void Test__ZN3aaa9GG3321313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321313E, buf);
    ::aaa::GG3321313 *dp, &lv = *(dp=new (buf) ::aaa::GG3321313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321313E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3321313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3321313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3321313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321313E);
    dp->::aaa::GG3321313::~GG3321313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321313E(Test__ZN3aaa9GG3321313E, "_ZN3aaa9GG3321313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321313C1Ev();
extern void _ZN3aaa9GG3321313D1Ev();
Name_Map name_map__ZN3aaa9GG3321313E[] = {
  NSPAIR(_ZN3aaa9GG3321313C1Ev),
  NSPAIR(_ZN3aaa9GG3321313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3321313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321313E[];
extern void _ZN3aaa9GG33213133fooEv();
extern void _ZN3aaa9GG33213133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213133fooEv,_ZThn8_N3aaa9GG33213133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33213133barEv,_ZThn8_N3aaa9GG33213133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33213133fooEv,_ZThn20_N3aaa9GG33213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213133fooEv,_ZThn28_N3aaa9GG33213133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213133barEv,_ZThn28_N3aaa9GG33213133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33213133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33213133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213133fooEv,_ZThn8_N3aaa9GG33213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213133barEv,_ZThn8_N3aaa9GG33213133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213133fooEv,_ZThn20_N3aaa9GG33213133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213133fooEv,_ZThn28_N3aaa9GG33213133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213133barEv,_ZThn28_N3aaa9GG33213133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321313E[];
Class_Descriptor cd__ZN3aaa9GG3321313E = {  "_ZN3aaa9GG3321313E", // class name
  bases__ZN3aaa9GG3321313E, 6,
  &(vtc__ZN3aaa9GG3321313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321321  : ::aaa::EE332 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33213213fooEv
  ~GG3321321(); // tgen
  GG3321321(); // tgen
};
//SIG(1 _ZN3aaa9GG3321321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33213213fooEv");}
aaa::GG3321321 ::~GG3321321(){ note_dtor("_ZN3aaa9GG3321321E", this);} // tgen
aaa::GG3321321 ::GG3321321(){ note_ctor("_ZN3aaa9GG3321321E", this);} // tgen
}
static void Test__ZN3aaa9GG3321321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321321E, buf);
    ::aaa::GG3321321 *dp, &lv = *(dp=new (buf) ::aaa::GG3321321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321321E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3321321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3321321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3321321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321321E);
    dp->::aaa::GG3321321::~GG3321321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321321E(Test__ZN3aaa9GG3321321E, "_ZN3aaa9GG3321321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321321C1Ev();
extern void _ZN3aaa9GG3321321D1Ev();
Name_Map name_map__ZN3aaa9GG3321321E[] = {
  NSPAIR(_ZN3aaa9GG3321321C1Ev),
  NSPAIR(_ZN3aaa9GG3321321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3321321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321321E[];
extern void _ZN3aaa9GG33213213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213213fooEv,_ZThn8_N3aaa9GG33213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33213213fooEv,_ZThn20_N3aaa9GG33213213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33213213fooEv,_ZThn28_N3aaa9GG33213213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33213213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213213fooEv,_ZThn8_N3aaa9GG33213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213213fooEv,_ZThn20_N3aaa9GG33213213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213213fooEv,_ZThn28_N3aaa9GG33213213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321321E[];
Class_Descriptor cd__ZN3aaa9GG3321321E = {  "_ZN3aaa9GG3321321E", // class name
  bases__ZN3aaa9GG3321321E, 6,
  &(vtc__ZN3aaa9GG3321321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321322  : ::aaa::EE332 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33213223barEv
  ~GG3321322(); // tgen
  GG3321322(); // tgen
};
//SIG(1 _ZN3aaa9GG3321322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33213223barEv");}
aaa::GG3321322 ::~GG3321322(){ note_dtor("_ZN3aaa9GG3321322E", this);} // tgen
aaa::GG3321322 ::GG3321322(){ note_ctor("_ZN3aaa9GG3321322E", this);} // tgen
}
static void Test__ZN3aaa9GG3321322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321322E, buf);
    ::aaa::GG3321322 *dp, &lv = *(dp=new (buf) ::aaa::GG3321322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321322E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3321322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3321322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3321322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321322E);
    dp->::aaa::GG3321322::~GG3321322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321322E(Test__ZN3aaa9GG3321322E, "_ZN3aaa9GG3321322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321322C1Ev();
extern void _ZN3aaa9GG3321322D1Ev();
Name_Map name_map__ZN3aaa9GG3321322E[] = {
  NSPAIR(_ZN3aaa9GG3321322C1Ev),
  NSPAIR(_ZN3aaa9GG3321322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3321322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33213223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213223barEv,_ZThn8_N3aaa9GG33213223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33213223barEv,_ZThn20_N3aaa9GG33213223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33213223barEv,_ZThn28_N3aaa9GG33213223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33213223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213223barEv,_ZThn8_N3aaa9GG33213223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213223barEv,_ZThn20_N3aaa9GG33213223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213223barEv,_ZThn28_N3aaa9GG33213223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321322E[];
Class_Descriptor cd__ZN3aaa9GG3321322E = {  "_ZN3aaa9GG3321322E", // class name
  bases__ZN3aaa9GG3321322E, 6,
  &(vtc__ZN3aaa9GG3321322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321323  : ::aaa::EE332 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33213233fooEv
  virtual void  bar(); // _ZN3aaa9GG33213233barEv
  ~GG3321323(); // tgen
  GG3321323(); // tgen
};
//SIG(1 _ZN3aaa9GG3321323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33213233fooEv");}
void  aaa::GG3321323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33213233barEv");}
aaa::GG3321323 ::~GG3321323(){ note_dtor("_ZN3aaa9GG3321323E", this);} // tgen
aaa::GG3321323 ::GG3321323(){ note_ctor("_ZN3aaa9GG3321323E", this);} // tgen
}
static void Test__ZN3aaa9GG3321323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321323E, buf);
    ::aaa::GG3321323 *dp, &lv = *(dp=new (buf) ::aaa::GG3321323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321323E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3321323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3321323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3321323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321323E);
    dp->::aaa::GG3321323::~GG3321323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321323E(Test__ZN3aaa9GG3321323E, "_ZN3aaa9GG3321323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321323C1Ev();
extern void _ZN3aaa9GG3321323D1Ev();
Name_Map name_map__ZN3aaa9GG3321323E[] = {
  NSPAIR(_ZN3aaa9GG3321323C1Ev),
  NSPAIR(_ZN3aaa9GG3321323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3321323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321323E[];
extern void _ZN3aaa9GG33213233fooEv();
extern void _ZN3aaa9GG33213233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213233fooEv,_ZThn8_N3aaa9GG33213233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33213233barEv,_ZThn8_N3aaa9GG33213233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33213233fooEv,_ZThn20_N3aaa9GG33213233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33213233barEv,_ZThn20_N3aaa9GG33213233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213233fooEv,_ZThn28_N3aaa9GG33213233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213233barEv,_ZThn28_N3aaa9GG33213233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33213233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33213233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213233fooEv,_ZThn8_N3aaa9GG33213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213233barEv,_ZThn8_N3aaa9GG33213233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213233fooEv,_ZThn20_N3aaa9GG33213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213233barEv,_ZThn20_N3aaa9GG33213233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213233fooEv,_ZThn28_N3aaa9GG33213233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213233barEv,_ZThn28_N3aaa9GG33213233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321323E[];
Class_Descriptor cd__ZN3aaa9GG3321323E = {  "_ZN3aaa9GG3321323E", // class name
  bases__ZN3aaa9GG3321323E, 6,
  &(vtc__ZN3aaa9GG3321323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321331  : ::aaa::EE332 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33213313fooEv
  ~GG3321331(); // tgen
  GG3321331(); // tgen
};
//SIG(1 _ZN3aaa9GG3321331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33213313fooEv");}
aaa::GG3321331 ::~GG3321331(){ note_dtor("_ZN3aaa9GG3321331E", this);} // tgen
aaa::GG3321331 ::GG3321331(){ note_ctor("_ZN3aaa9GG3321331E", this);} // tgen
}
static void Test__ZN3aaa9GG3321331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321331E, buf);
    ::aaa::GG3321331 *dp, &lv = *(dp=new (buf) ::aaa::GG3321331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321331E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3321331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3321331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3321331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321331E);
    dp->::aaa::GG3321331::~GG3321331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321331E(Test__ZN3aaa9GG3321331E, "_ZN3aaa9GG3321331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321331C1Ev();
extern void _ZN3aaa9GG3321331D1Ev();
Name_Map name_map__ZN3aaa9GG3321331E[] = {
  NSPAIR(_ZN3aaa9GG3321331C1Ev),
  NSPAIR(_ZN3aaa9GG3321331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3321331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321331E[];
extern void _ZN3aaa9GG33213313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213313fooEv,_ZThn8_N3aaa9GG33213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33213313fooEv,_ZThn20_N3aaa9GG33213313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33213313fooEv,_ZThn28_N3aaa9GG33213313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33213313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213313fooEv,_ZThn8_N3aaa9GG33213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213313fooEv,_ZThn20_N3aaa9GG33213313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213313fooEv,_ZThn28_N3aaa9GG33213313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321331E[];
Class_Descriptor cd__ZN3aaa9GG3321331E = {  "_ZN3aaa9GG3321331E", // class name
  bases__ZN3aaa9GG3321331E, 6,
  &(vtc__ZN3aaa9GG3321331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321332  : ::aaa::EE332 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33213323barEv
  ~GG3321332(); // tgen
  GG3321332(); // tgen
};
//SIG(1 _ZN3aaa9GG3321332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v4 Fi} BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3321332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33213323barEv");}
aaa::GG3321332 ::~GG3321332(){ note_dtor("_ZN3aaa9GG3321332E", this);} // tgen
aaa::GG3321332 ::GG3321332(){ note_ctor("_ZN3aaa9GG3321332E", this);} // tgen
}
static void Test__ZN3aaa9GG3321332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321332E, buf);
    ::aaa::GG3321332 *dp, &lv = *(dp=new (buf) ::aaa::GG3321332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321332E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3321332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3321332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3321332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321332E);
    dp->::aaa::GG3321332::~GG3321332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321332E(Test__ZN3aaa9GG3321332E, "_ZN3aaa9GG3321332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321332C1Ev();
extern void _ZN3aaa9GG3321332D1Ev();
Name_Map name_map__ZN3aaa9GG3321332E[] = {
  NSPAIR(_ZN3aaa9GG3321332C1Ev),
  NSPAIR(_ZN3aaa9GG3321332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3321332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33213323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213323barEv,_ZThn8_N3aaa9GG33213323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33213323barEv,_ZThn20_N3aaa9GG33213323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213323barEv,_ZThn28_N3aaa9GG33213323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33213323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213323barEv,_ZThn8_N3aaa9GG33213323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213323barEv,_ZThn20_N3aaa9GG33213323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213323barEv,_ZThn28_N3aaa9GG33213323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321332E[];
Class_Descriptor cd__ZN3aaa9GG3321332E = {  "_ZN3aaa9GG3321332E", // class name
  bases__ZN3aaa9GG3321332E, 6,
  &(vtc__ZN3aaa9GG3321332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3321333  : ::aaa::EE332 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33213333fooEv
  virtual void  bar(); // _ZN3aaa9GG33213333barEv
  ~GG3321333(); // tgen
  GG3321333(); // tgen
};
//SIG(1 _ZN3aaa9GG3321333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3321333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33213333fooEv");}
void  aaa::GG3321333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33213333barEv");}
aaa::GG3321333 ::~GG3321333(){ note_dtor("_ZN3aaa9GG3321333E", this);} // tgen
aaa::GG3321333 ::GG3321333(){ note_ctor("_ZN3aaa9GG3321333E", this);} // tgen
}
static void Test__ZN3aaa9GG3321333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3321333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3321333E, buf);
    ::aaa::GG3321333 *dp, &lv = *(dp=new (buf) ::aaa::GG3321333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3321333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3321333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3321333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3321333E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3321333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3321333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3321333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3321333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3321333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3321333E);
    dp->::aaa::GG3321333::~GG3321333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3321333E(Test__ZN3aaa9GG3321333E, "_ZN3aaa9GG3321333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3321333C1Ev();
extern void _ZN3aaa9GG3321333D1Ev();
Name_Map name_map__ZN3aaa9GG3321333E[] = {
  NSPAIR(_ZN3aaa9GG3321333C1Ev),
  NSPAIR(_ZN3aaa9GG3321333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3321333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3321333E[];
extern void _ZN3aaa9GG33213333fooEv();
extern void _ZN3aaa9GG33213333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33213333fooEv,_ZThn8_N3aaa9GG33213333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33213333barEv,_ZThn8_N3aaa9GG33213333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33213333fooEv,_ZThn20_N3aaa9GG33213333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33213333barEv,_ZThn20_N3aaa9GG33213333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213333fooEv,_ZThn28_N3aaa9GG33213333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33213333barEv,_ZThn28_N3aaa9GG33213333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3321333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33213333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33213333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213333fooEv,_ZThn8_N3aaa9GG33213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33213333barEv,_ZThn8_N3aaa9GG33213333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213333fooEv,_ZThn20_N3aaa9GG33213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33213333barEv,_ZThn20_N3aaa9GG33213333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3321333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213333fooEv,_ZThn28_N3aaa9GG33213333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33213333barEv,_ZThn28_N3aaa9GG33213333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3321333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3321333E[];
Class_Descriptor cd__ZN3aaa9GG3321333E = {  "_ZN3aaa9GG3321333E", // class name
  bases__ZN3aaa9GG3321333E, 6,
  &(vtc__ZN3aaa9GG3321333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3321333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3321333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322111  : ::aaa::EE332 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33221113fooEv
  ~GG3322111(); // tgen
  GG3322111(); // tgen
};
//SIG(1 _ZN3aaa9GG3322111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33221113fooEv");}
aaa::GG3322111 ::~GG3322111(){ note_dtor("_ZN3aaa9GG3322111E", this);} // tgen
aaa::GG3322111 ::GG3322111(){ note_ctor("_ZN3aaa9GG3322111E", this);} // tgen
}
static void Test__ZN3aaa9GG3322111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322111E, buf);
    ::aaa::GG3322111 *dp, &lv = *(dp=new (buf) ::aaa::GG3322111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322111E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3322111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3322111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3322111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322111E);
    dp->::aaa::GG3322111::~GG3322111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322111E(Test__ZN3aaa9GG3322111E, "_ZN3aaa9GG3322111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322111C1Ev();
extern void _ZN3aaa9GG3322111D1Ev();
Name_Map name_map__ZN3aaa9GG3322111E[] = {
  NSPAIR(_ZN3aaa9GG3322111C1Ev),
  NSPAIR(_ZN3aaa9GG3322111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3322111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322111E[];
extern void _ZN3aaa9GG33221113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221113fooEv,_ZThn8_N3aaa9GG33221113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33221113fooEv,_ZThn20_N3aaa9GG33221113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33221113fooEv,_ZThn28_N3aaa9GG33221113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33221113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221113fooEv,_ZThn8_N3aaa9GG33221113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221113fooEv,_ZThn20_N3aaa9GG33221113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33221113fooEv,_ZThn28_N3aaa9GG33221113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322111E[];
Class_Descriptor cd__ZN3aaa9GG3322111E = {  "_ZN3aaa9GG3322111E", // class name
  bases__ZN3aaa9GG3322111E, 6,
  &(vtc__ZN3aaa9GG3322111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322112  : ::aaa::EE332 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33221123barEv
  ~GG3322112(); // tgen
  GG3322112(); // tgen
};
//SIG(1 _ZN3aaa9GG3322112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33221123barEv");}
aaa::GG3322112 ::~GG3322112(){ note_dtor("_ZN3aaa9GG3322112E", this);} // tgen
aaa::GG3322112 ::GG3322112(){ note_ctor("_ZN3aaa9GG3322112E", this);} // tgen
}
static void Test__ZN3aaa9GG3322112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322112E, buf);
    ::aaa::GG3322112 *dp, &lv = *(dp=new (buf) ::aaa::GG3322112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322112E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3322112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3322112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3322112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322112E);
    dp->::aaa::GG3322112::~GG3322112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322112E(Test__ZN3aaa9GG3322112E, "_ZN3aaa9GG3322112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322112C1Ev();
extern void _ZN3aaa9GG3322112D1Ev();
Name_Map name_map__ZN3aaa9GG3322112E[] = {
  NSPAIR(_ZN3aaa9GG3322112C1Ev),
  NSPAIR(_ZN3aaa9GG3322112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3322112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33221123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221123barEv,_ZThn8_N3aaa9GG33221123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33221123barEv,_ZThn20_N3aaa9GG33221123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33221123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221123barEv,_ZThn8_N3aaa9GG33221123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221123barEv,_ZThn20_N3aaa9GG33221123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322112E[];
Class_Descriptor cd__ZN3aaa9GG3322112E = {  "_ZN3aaa9GG3322112E", // class name
  bases__ZN3aaa9GG3322112E, 6,
  &(vtc__ZN3aaa9GG3322112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322113  : ::aaa::EE332 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33221133fooEv
  virtual void  bar(); // _ZN3aaa9GG33221133barEv
  ~GG3322113(); // tgen
  GG3322113(); // tgen
};
//SIG(1 _ZN3aaa9GG3322113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33221133fooEv");}
void  aaa::GG3322113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33221133barEv");}
aaa::GG3322113 ::~GG3322113(){ note_dtor("_ZN3aaa9GG3322113E", this);} // tgen
aaa::GG3322113 ::GG3322113(){ note_ctor("_ZN3aaa9GG3322113E", this);} // tgen
}
static void Test__ZN3aaa9GG3322113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322113E, buf);
    ::aaa::GG3322113 *dp, &lv = *(dp=new (buf) ::aaa::GG3322113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322113E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3322113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3322113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3322113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322113E);
    dp->::aaa::GG3322113::~GG3322113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322113E(Test__ZN3aaa9GG3322113E, "_ZN3aaa9GG3322113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322113C1Ev();
extern void _ZN3aaa9GG3322113D1Ev();
Name_Map name_map__ZN3aaa9GG3322113E[] = {
  NSPAIR(_ZN3aaa9GG3322113C1Ev),
  NSPAIR(_ZN3aaa9GG3322113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3322113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322113E[];
extern void _ZN3aaa9GG33221133fooEv();
extern void _ZN3aaa9GG33221133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221133fooEv,_ZThn8_N3aaa9GG33221133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33221133barEv,_ZThn8_N3aaa9GG33221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33221133barEv,_ZThn20_N3aaa9GG33221133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33221133fooEv,_ZThn20_N3aaa9GG33221133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33221133fooEv,_ZThn28_N3aaa9GG33221133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33221133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33221133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221133fooEv,_ZThn8_N3aaa9GG33221133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221133barEv,_ZThn8_N3aaa9GG33221133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221133barEv,_ZThn20_N3aaa9GG33221133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221133fooEv,_ZThn20_N3aaa9GG33221133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33221133fooEv,_ZThn28_N3aaa9GG33221133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322113E[];
Class_Descriptor cd__ZN3aaa9GG3322113E = {  "_ZN3aaa9GG3322113E", // class name
  bases__ZN3aaa9GG3322113E, 6,
  &(vtc__ZN3aaa9GG3322113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322121  : ::aaa::EE332 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33221213fooEv
  ~GG3322121(); // tgen
  GG3322121(); // tgen
};
//SIG(1 _ZN3aaa9GG3322121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33221213fooEv");}
aaa::GG3322121 ::~GG3322121(){ note_dtor("_ZN3aaa9GG3322121E", this);} // tgen
aaa::GG3322121 ::GG3322121(){ note_ctor("_ZN3aaa9GG3322121E", this);} // tgen
}
static void Test__ZN3aaa9GG3322121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322121E, buf);
    ::aaa::GG3322121 *dp, &lv = *(dp=new (buf) ::aaa::GG3322121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322121E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3322121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3322121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3322121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322121E);
    dp->::aaa::GG3322121::~GG3322121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322121E(Test__ZN3aaa9GG3322121E, "_ZN3aaa9GG3322121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322121C1Ev();
extern void _ZN3aaa9GG3322121D1Ev();
Name_Map name_map__ZN3aaa9GG3322121E[] = {
  NSPAIR(_ZN3aaa9GG3322121C1Ev),
  NSPAIR(_ZN3aaa9GG3322121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3322121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322121E[];
extern void _ZN3aaa9GG33221213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221213fooEv,_ZThn8_N3aaa9GG33221213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33221213fooEv,_ZThn28_N3aaa9GG33221213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33221213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221213fooEv,_ZThn8_N3aaa9GG33221213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33221213fooEv,_ZThn28_N3aaa9GG33221213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322121E[];
Class_Descriptor cd__ZN3aaa9GG3322121E = {  "_ZN3aaa9GG3322121E", // class name
  bases__ZN3aaa9GG3322121E, 6,
  &(vtc__ZN3aaa9GG3322121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322122  : ::aaa::EE332 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33221223barEv
  ~GG3322122(); // tgen
  GG3322122(); // tgen
};
//SIG(1 _ZN3aaa9GG3322122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33221223barEv");}
aaa::GG3322122 ::~GG3322122(){ note_dtor("_ZN3aaa9GG3322122E", this);} // tgen
aaa::GG3322122 ::GG3322122(){ note_ctor("_ZN3aaa9GG3322122E", this);} // tgen
}
static void Test__ZN3aaa9GG3322122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322122E, buf);
    ::aaa::GG3322122 *dp, &lv = *(dp=new (buf) ::aaa::GG3322122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322122E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3322122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3322122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3322122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322122E);
    dp->::aaa::GG3322122::~GG3322122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322122E(Test__ZN3aaa9GG3322122E, "_ZN3aaa9GG3322122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322122C1Ev();
extern void _ZN3aaa9GG3322122D1Ev();
Name_Map name_map__ZN3aaa9GG3322122E[] = {
  NSPAIR(_ZN3aaa9GG3322122C1Ev),
  NSPAIR(_ZN3aaa9GG3322122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3322122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33221223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221223barEv,_ZThn8_N3aaa9GG33221223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33221223barEv,_ZThn20_N3aaa9GG33221223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33221223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221223barEv,_ZThn8_N3aaa9GG33221223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221223barEv,_ZThn20_N3aaa9GG33221223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322122E[];
Class_Descriptor cd__ZN3aaa9GG3322122E = {  "_ZN3aaa9GG3322122E", // class name
  bases__ZN3aaa9GG3322122E, 6,
  &(vtc__ZN3aaa9GG3322122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322123  : ::aaa::EE332 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33221233fooEv
  virtual void  bar(); // _ZN3aaa9GG33221233barEv
  ~GG3322123(); // tgen
  GG3322123(); // tgen
};
//SIG(1 _ZN3aaa9GG3322123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33221233fooEv");}
void  aaa::GG3322123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33221233barEv");}
aaa::GG3322123 ::~GG3322123(){ note_dtor("_ZN3aaa9GG3322123E", this);} // tgen
aaa::GG3322123 ::GG3322123(){ note_ctor("_ZN3aaa9GG3322123E", this);} // tgen
}
static void Test__ZN3aaa9GG3322123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322123E, buf);
    ::aaa::GG3322123 *dp, &lv = *(dp=new (buf) ::aaa::GG3322123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322123E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3322123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3322123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3322123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322123E);
    dp->::aaa::GG3322123::~GG3322123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322123E(Test__ZN3aaa9GG3322123E, "_ZN3aaa9GG3322123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322123C1Ev();
extern void _ZN3aaa9GG3322123D1Ev();
Name_Map name_map__ZN3aaa9GG3322123E[] = {
  NSPAIR(_ZN3aaa9GG3322123C1Ev),
  NSPAIR(_ZN3aaa9GG3322123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3322123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322123E[];
extern void _ZN3aaa9GG33221233fooEv();
extern void _ZN3aaa9GG33221233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221233fooEv,_ZThn8_N3aaa9GG33221233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33221233barEv,_ZThn8_N3aaa9GG33221233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33221233barEv,_ZThn20_N3aaa9GG33221233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33221233fooEv,_ZThn28_N3aaa9GG33221233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33221233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33221233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221233fooEv,_ZThn8_N3aaa9GG33221233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221233barEv,_ZThn8_N3aaa9GG33221233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221233barEv,_ZThn20_N3aaa9GG33221233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33221233fooEv,_ZThn28_N3aaa9GG33221233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322123E[];
Class_Descriptor cd__ZN3aaa9GG3322123E = {  "_ZN3aaa9GG3322123E", // class name
  bases__ZN3aaa9GG3322123E, 6,
  &(vtc__ZN3aaa9GG3322123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322131  : ::aaa::EE332 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33221313fooEv
  ~GG3322131(); // tgen
  GG3322131(); // tgen
};
//SIG(1 _ZN3aaa9GG3322131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33221313fooEv");}
aaa::GG3322131 ::~GG3322131(){ note_dtor("_ZN3aaa9GG3322131E", this);} // tgen
aaa::GG3322131 ::GG3322131(){ note_ctor("_ZN3aaa9GG3322131E", this);} // tgen
}
static void Test__ZN3aaa9GG3322131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322131E, buf);
    ::aaa::GG3322131 *dp, &lv = *(dp=new (buf) ::aaa::GG3322131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322131E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3322131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3322131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3322131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322131E);
    dp->::aaa::GG3322131::~GG3322131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322131E(Test__ZN3aaa9GG3322131E, "_ZN3aaa9GG3322131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322131C1Ev();
extern void _ZN3aaa9GG3322131D1Ev();
Name_Map name_map__ZN3aaa9GG3322131E[] = {
  NSPAIR(_ZN3aaa9GG3322131C1Ev),
  NSPAIR(_ZN3aaa9GG3322131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3322131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322131E[];
extern void _ZN3aaa9GG33221313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221313fooEv,_ZThn8_N3aaa9GG33221313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33221313fooEv,_ZThn20_N3aaa9GG33221313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33221313fooEv,_ZThn28_N3aaa9GG33221313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33221313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221313fooEv,_ZThn8_N3aaa9GG33221313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221313fooEv,_ZThn20_N3aaa9GG33221313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33221313fooEv,_ZThn28_N3aaa9GG33221313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322131E[];
Class_Descriptor cd__ZN3aaa9GG3322131E = {  "_ZN3aaa9GG3322131E", // class name
  bases__ZN3aaa9GG3322131E, 6,
  &(vtc__ZN3aaa9GG3322131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322132  : ::aaa::EE332 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33221323barEv
  ~GG3322132(); // tgen
  GG3322132(); // tgen
};
//SIG(1 _ZN3aaa9GG3322132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v4 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33221323barEv");}
aaa::GG3322132 ::~GG3322132(){ note_dtor("_ZN3aaa9GG3322132E", this);} // tgen
aaa::GG3322132 ::GG3322132(){ note_ctor("_ZN3aaa9GG3322132E", this);} // tgen
}
static void Test__ZN3aaa9GG3322132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322132E, buf);
    ::aaa::GG3322132 *dp, &lv = *(dp=new (buf) ::aaa::GG3322132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322132E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3322132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3322132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3322132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322132E);
    dp->::aaa::GG3322132::~GG3322132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322132E(Test__ZN3aaa9GG3322132E, "_ZN3aaa9GG3322132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322132C1Ev();
extern void _ZN3aaa9GG3322132D1Ev();
Name_Map name_map__ZN3aaa9GG3322132E[] = {
  NSPAIR(_ZN3aaa9GG3322132C1Ev),
  NSPAIR(_ZN3aaa9GG3322132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3322132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33221323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221323barEv,_ZThn8_N3aaa9GG33221323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33221323barEv,_ZThn20_N3aaa9GG33221323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33221323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221323barEv,_ZThn8_N3aaa9GG33221323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221323barEv,_ZThn20_N3aaa9GG33221323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322132E[];
Class_Descriptor cd__ZN3aaa9GG3322132E = {  "_ZN3aaa9GG3322132E", // class name
  bases__ZN3aaa9GG3322132E, 6,
  &(vtc__ZN3aaa9GG3322132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322133  : ::aaa::EE332 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33221333fooEv
  virtual void  bar(); // _ZN3aaa9GG33221333barEv
  ~GG3322133(); // tgen
  GG3322133(); // tgen
};
//SIG(1 _ZN3aaa9GG3322133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33221333fooEv");}
void  aaa::GG3322133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33221333barEv");}
aaa::GG3322133 ::~GG3322133(){ note_dtor("_ZN3aaa9GG3322133E", this);} // tgen
aaa::GG3322133 ::GG3322133(){ note_ctor("_ZN3aaa9GG3322133E", this);} // tgen
}
static void Test__ZN3aaa9GG3322133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322133E, buf);
    ::aaa::GG3322133 *dp, &lv = *(dp=new (buf) ::aaa::GG3322133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322133E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3322133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3322133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3322133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322133E);
    dp->::aaa::GG3322133::~GG3322133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322133E(Test__ZN3aaa9GG3322133E, "_ZN3aaa9GG3322133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322133C1Ev();
extern void _ZN3aaa9GG3322133D1Ev();
Name_Map name_map__ZN3aaa9GG3322133E[] = {
  NSPAIR(_ZN3aaa9GG3322133C1Ev),
  NSPAIR(_ZN3aaa9GG3322133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3322133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322133E[];
extern void _ZN3aaa9GG33221333fooEv();
extern void _ZN3aaa9GG33221333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33221333fooEv,_ZThn8_N3aaa9GG33221333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33221333barEv,_ZThn8_N3aaa9GG33221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33221333barEv,_ZThn20_N3aaa9GG33221333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33221333fooEv,_ZThn20_N3aaa9GG33221333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33221333fooEv,_ZThn28_N3aaa9GG33221333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33221333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33221333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221333fooEv,_ZThn8_N3aaa9GG33221333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33221333barEv,_ZThn8_N3aaa9GG33221333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221333barEv,_ZThn20_N3aaa9GG33221333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33221333fooEv,_ZThn20_N3aaa9GG33221333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33221333fooEv,_ZThn28_N3aaa9GG33221333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322133E[];
Class_Descriptor cd__ZN3aaa9GG3322133E = {  "_ZN3aaa9GG3322133E", // class name
  bases__ZN3aaa9GG3322133E, 6,
  &(vtc__ZN3aaa9GG3322133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322211  : ::aaa::EE332 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33222113fooEv
  ~GG3322211(); // tgen
  GG3322211(); // tgen
};
//SIG(1 _ZN3aaa9GG3322211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33222113fooEv");}
aaa::GG3322211 ::~GG3322211(){ note_dtor("_ZN3aaa9GG3322211E", this);} // tgen
aaa::GG3322211 ::GG3322211(){ note_ctor("_ZN3aaa9GG3322211E", this);} // tgen
}
static void Test__ZN3aaa9GG3322211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322211E, buf);
    ::aaa::GG3322211 *dp, &lv = *(dp=new (buf) ::aaa::GG3322211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322211E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3322211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3322211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3322211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322211E);
    dp->::aaa::GG3322211::~GG3322211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322211E(Test__ZN3aaa9GG3322211E, "_ZN3aaa9GG3322211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322211C1Ev();
extern void _ZN3aaa9GG3322211D1Ev();
Name_Map name_map__ZN3aaa9GG3322211E[] = {
  NSPAIR(_ZN3aaa9GG3322211C1Ev),
  NSPAIR(_ZN3aaa9GG3322211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3322211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322211E[];
extern void _ZN3aaa9GG33222113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222113fooEv,_ZThn8_N3aaa9GG33222113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33222113fooEv,_ZThn20_N3aaa9GG33222113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33222113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222113fooEv,_ZThn8_N3aaa9GG33222113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222113fooEv,_ZThn20_N3aaa9GG33222113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322211E[];
Class_Descriptor cd__ZN3aaa9GG3322211E = {  "_ZN3aaa9GG3322211E", // class name
  bases__ZN3aaa9GG3322211E, 6,
  &(vtc__ZN3aaa9GG3322211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322212  : ::aaa::EE332 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33222123barEv
  ~GG3322212(); // tgen
  GG3322212(); // tgen
};
//SIG(1 _ZN3aaa9GG3322212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33222123barEv");}
aaa::GG3322212 ::~GG3322212(){ note_dtor("_ZN3aaa9GG3322212E", this);} // tgen
aaa::GG3322212 ::GG3322212(){ note_ctor("_ZN3aaa9GG3322212E", this);} // tgen
}
static void Test__ZN3aaa9GG3322212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322212E, buf);
    ::aaa::GG3322212 *dp, &lv = *(dp=new (buf) ::aaa::GG3322212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322212E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3322212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3322212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3322212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322212E);
    dp->::aaa::GG3322212::~GG3322212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322212E(Test__ZN3aaa9GG3322212E, "_ZN3aaa9GG3322212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322212C1Ev();
extern void _ZN3aaa9GG3322212D1Ev();
Name_Map name_map__ZN3aaa9GG3322212E[] = {
  NSPAIR(_ZN3aaa9GG3322212C1Ev),
  NSPAIR(_ZN3aaa9GG3322212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3322212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33222123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222123barEv,_ZThn8_N3aaa9GG33222123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33222123barEv,_ZThn20_N3aaa9GG33222123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33222123barEv,_ZThn28_N3aaa9GG33222123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33222123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222123barEv,_ZThn8_N3aaa9GG33222123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222123barEv,_ZThn20_N3aaa9GG33222123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33222123barEv,_ZThn28_N3aaa9GG33222123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322212E[];
Class_Descriptor cd__ZN3aaa9GG3322212E = {  "_ZN3aaa9GG3322212E", // class name
  bases__ZN3aaa9GG3322212E, 6,
  &(vtc__ZN3aaa9GG3322212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322213  : ::aaa::EE332 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33222133fooEv
  virtual void  bar(); // _ZN3aaa9GG33222133barEv
  ~GG3322213(); // tgen
  GG3322213(); // tgen
};
//SIG(1 _ZN3aaa9GG3322213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33222133fooEv");}
void  aaa::GG3322213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33222133barEv");}
aaa::GG3322213 ::~GG3322213(){ note_dtor("_ZN3aaa9GG3322213E", this);} // tgen
aaa::GG3322213 ::GG3322213(){ note_ctor("_ZN3aaa9GG3322213E", this);} // tgen
}
static void Test__ZN3aaa9GG3322213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322213E, buf);
    ::aaa::GG3322213 *dp, &lv = *(dp=new (buf) ::aaa::GG3322213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322213E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3322213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3322213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3322213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322213E);
    dp->::aaa::GG3322213::~GG3322213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322213E(Test__ZN3aaa9GG3322213E, "_ZN3aaa9GG3322213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322213C1Ev();
extern void _ZN3aaa9GG3322213D1Ev();
Name_Map name_map__ZN3aaa9GG3322213E[] = {
  NSPAIR(_ZN3aaa9GG3322213C1Ev),
  NSPAIR(_ZN3aaa9GG3322213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3322213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322213E[];
extern void _ZN3aaa9GG33222133fooEv();
extern void _ZN3aaa9GG33222133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222133fooEv,_ZThn8_N3aaa9GG33222133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33222133barEv,_ZThn8_N3aaa9GG33222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33222133barEv,_ZThn20_N3aaa9GG33222133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33222133fooEv,_ZThn20_N3aaa9GG33222133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33222133barEv,_ZThn28_N3aaa9GG33222133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33222133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33222133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222133fooEv,_ZThn8_N3aaa9GG33222133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222133barEv,_ZThn8_N3aaa9GG33222133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222133barEv,_ZThn20_N3aaa9GG33222133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222133fooEv,_ZThn20_N3aaa9GG33222133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33222133barEv,_ZThn28_N3aaa9GG33222133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322213E[];
Class_Descriptor cd__ZN3aaa9GG3322213E = {  "_ZN3aaa9GG3322213E", // class name
  bases__ZN3aaa9GG3322213E, 6,
  &(vtc__ZN3aaa9GG3322213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322221  : ::aaa::EE332 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33222213fooEv
  ~GG3322221(); // tgen
  GG3322221(); // tgen
};
//SIG(1 _ZN3aaa9GG3322221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33222213fooEv");}
aaa::GG3322221 ::~GG3322221(){ note_dtor("_ZN3aaa9GG3322221E", this);} // tgen
aaa::GG3322221 ::GG3322221(){ note_ctor("_ZN3aaa9GG3322221E", this);} // tgen
}
static void Test__ZN3aaa9GG3322221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322221E, buf);
    ::aaa::GG3322221 *dp, &lv = *(dp=new (buf) ::aaa::GG3322221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322221E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3322221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3322221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3322221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322221E);
    dp->::aaa::GG3322221::~GG3322221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322221E(Test__ZN3aaa9GG3322221E, "_ZN3aaa9GG3322221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322221C1Ev();
extern void _ZN3aaa9GG3322221D1Ev();
Name_Map name_map__ZN3aaa9GG3322221E[] = {
  NSPAIR(_ZN3aaa9GG3322221C1Ev),
  NSPAIR(_ZN3aaa9GG3322221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3322221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322221E[];
extern void _ZN3aaa9GG33222213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222213fooEv,_ZThn8_N3aaa9GG33222213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33222213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222213fooEv,_ZThn8_N3aaa9GG33222213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322221E[];
Class_Descriptor cd__ZN3aaa9GG3322221E = {  "_ZN3aaa9GG3322221E", // class name
  bases__ZN3aaa9GG3322221E, 6,
  &(vtc__ZN3aaa9GG3322221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322222  : ::aaa::EE332 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33222223barEv
  ~GG3322222(); // tgen
  GG3322222(); // tgen
};
//SIG(1 _ZN3aaa9GG3322222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33222223barEv");}
aaa::GG3322222 ::~GG3322222(){ note_dtor("_ZN3aaa9GG3322222E", this);} // tgen
aaa::GG3322222 ::GG3322222(){ note_ctor("_ZN3aaa9GG3322222E", this);} // tgen
}
static void Test__ZN3aaa9GG3322222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322222E, buf);
    ::aaa::GG3322222 *dp, &lv = *(dp=new (buf) ::aaa::GG3322222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322222E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3322222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3322222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3322222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322222E);
    dp->::aaa::GG3322222::~GG3322222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322222E(Test__ZN3aaa9GG3322222E, "_ZN3aaa9GG3322222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322222C1Ev();
extern void _ZN3aaa9GG3322222D1Ev();
Name_Map name_map__ZN3aaa9GG3322222E[] = {
  NSPAIR(_ZN3aaa9GG3322222C1Ev),
  NSPAIR(_ZN3aaa9GG3322222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3322222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33222223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222223barEv,_ZThn8_N3aaa9GG33222223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33222223barEv,_ZThn20_N3aaa9GG33222223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33222223barEv,_ZThn28_N3aaa9GG33222223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33222223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222223barEv,_ZThn8_N3aaa9GG33222223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222223barEv,_ZThn20_N3aaa9GG33222223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33222223barEv,_ZThn28_N3aaa9GG33222223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322222E[];
Class_Descriptor cd__ZN3aaa9GG3322222E = {  "_ZN3aaa9GG3322222E", // class name
  bases__ZN3aaa9GG3322222E, 6,
  &(vtc__ZN3aaa9GG3322222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322223  : ::aaa::EE332 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33222233fooEv
  virtual void  bar(); // _ZN3aaa9GG33222233barEv
  ~GG3322223(); // tgen
  GG3322223(); // tgen
};
//SIG(1 _ZN3aaa9GG3322223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33222233fooEv");}
void  aaa::GG3322223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33222233barEv");}
aaa::GG3322223 ::~GG3322223(){ note_dtor("_ZN3aaa9GG3322223E", this);} // tgen
aaa::GG3322223 ::GG3322223(){ note_ctor("_ZN3aaa9GG3322223E", this);} // tgen
}
static void Test__ZN3aaa9GG3322223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322223E, buf);
    ::aaa::GG3322223 *dp, &lv = *(dp=new (buf) ::aaa::GG3322223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322223E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3322223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3322223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3322223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322223E);
    dp->::aaa::GG3322223::~GG3322223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322223E(Test__ZN3aaa9GG3322223E, "_ZN3aaa9GG3322223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322223C1Ev();
extern void _ZN3aaa9GG3322223D1Ev();
Name_Map name_map__ZN3aaa9GG3322223E[] = {
  NSPAIR(_ZN3aaa9GG3322223C1Ev),
  NSPAIR(_ZN3aaa9GG3322223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3322223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322223E[];
extern void _ZN3aaa9GG33222233fooEv();
extern void _ZN3aaa9GG33222233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222233fooEv,_ZThn8_N3aaa9GG33222233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33222233barEv,_ZThn8_N3aaa9GG33222233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33222233barEv,_ZThn20_N3aaa9GG33222233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33222233barEv,_ZThn28_N3aaa9GG33222233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33222233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33222233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222233fooEv,_ZThn8_N3aaa9GG33222233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222233barEv,_ZThn8_N3aaa9GG33222233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222233barEv,_ZThn20_N3aaa9GG33222233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33222233barEv,_ZThn28_N3aaa9GG33222233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322223E[];
Class_Descriptor cd__ZN3aaa9GG3322223E = {  "_ZN3aaa9GG3322223E", // class name
  bases__ZN3aaa9GG3322223E, 6,
  &(vtc__ZN3aaa9GG3322223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322231  : ::aaa::EE332 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33222313fooEv
  ~GG3322231(); // tgen
  GG3322231(); // tgen
};
//SIG(1 _ZN3aaa9GG3322231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33222313fooEv");}
aaa::GG3322231 ::~GG3322231(){ note_dtor("_ZN3aaa9GG3322231E", this);} // tgen
aaa::GG3322231 ::GG3322231(){ note_ctor("_ZN3aaa9GG3322231E", this);} // tgen
}
static void Test__ZN3aaa9GG3322231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322231E, buf);
    ::aaa::GG3322231 *dp, &lv = *(dp=new (buf) ::aaa::GG3322231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322231E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3322231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3322231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3322231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322231E);
    dp->::aaa::GG3322231::~GG3322231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322231E(Test__ZN3aaa9GG3322231E, "_ZN3aaa9GG3322231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322231C1Ev();
extern void _ZN3aaa9GG3322231D1Ev();
Name_Map name_map__ZN3aaa9GG3322231E[] = {
  NSPAIR(_ZN3aaa9GG3322231C1Ev),
  NSPAIR(_ZN3aaa9GG3322231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3322231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322231E[];
extern void _ZN3aaa9GG33222313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222313fooEv,_ZThn8_N3aaa9GG33222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33222313fooEv,_ZThn20_N3aaa9GG33222313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33222313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222313fooEv,_ZThn8_N3aaa9GG33222313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222313fooEv,_ZThn20_N3aaa9GG33222313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322231E[];
Class_Descriptor cd__ZN3aaa9GG3322231E = {  "_ZN3aaa9GG3322231E", // class name
  bases__ZN3aaa9GG3322231E, 6,
  &(vtc__ZN3aaa9GG3322231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322232  : ::aaa::EE332 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33222323barEv
  ~GG3322232(); // tgen
  GG3322232(); // tgen
};
//SIG(1 _ZN3aaa9GG3322232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33222323barEv");}
aaa::GG3322232 ::~GG3322232(){ note_dtor("_ZN3aaa9GG3322232E", this);} // tgen
aaa::GG3322232 ::GG3322232(){ note_ctor("_ZN3aaa9GG3322232E", this);} // tgen
}
static void Test__ZN3aaa9GG3322232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322232E, buf);
    ::aaa::GG3322232 *dp, &lv = *(dp=new (buf) ::aaa::GG3322232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322232E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3322232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3322232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3322232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322232E);
    dp->::aaa::GG3322232::~GG3322232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322232E(Test__ZN3aaa9GG3322232E, "_ZN3aaa9GG3322232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322232C1Ev();
extern void _ZN3aaa9GG3322232D1Ev();
Name_Map name_map__ZN3aaa9GG3322232E[] = {
  NSPAIR(_ZN3aaa9GG3322232C1Ev),
  NSPAIR(_ZN3aaa9GG3322232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3322232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33222323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222323barEv,_ZThn8_N3aaa9GG33222323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33222323barEv,_ZThn20_N3aaa9GG33222323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33222323barEv,_ZThn28_N3aaa9GG33222323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33222323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222323barEv,_ZThn8_N3aaa9GG33222323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222323barEv,_ZThn20_N3aaa9GG33222323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33222323barEv,_ZThn28_N3aaa9GG33222323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322232E[];
Class_Descriptor cd__ZN3aaa9GG3322232E = {  "_ZN3aaa9GG3322232E", // class name
  bases__ZN3aaa9GG3322232E, 6,
  &(vtc__ZN3aaa9GG3322232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322233  : ::aaa::EE332 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33222333fooEv
  virtual void  bar(); // _ZN3aaa9GG33222333barEv
  ~GG3322233(); // tgen
  GG3322233(); // tgen
};
//SIG(1 _ZN3aaa9GG3322233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33222333fooEv");}
void  aaa::GG3322233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33222333barEv");}
aaa::GG3322233 ::~GG3322233(){ note_dtor("_ZN3aaa9GG3322233E", this);} // tgen
aaa::GG3322233 ::GG3322233(){ note_ctor("_ZN3aaa9GG3322233E", this);} // tgen
}
static void Test__ZN3aaa9GG3322233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322233E, buf);
    ::aaa::GG3322233 *dp, &lv = *(dp=new (buf) ::aaa::GG3322233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322233E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3322233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3322233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3322233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322233E);
    dp->::aaa::GG3322233::~GG3322233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322233E(Test__ZN3aaa9GG3322233E, "_ZN3aaa9GG3322233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322233C1Ev();
extern void _ZN3aaa9GG3322233D1Ev();
Name_Map name_map__ZN3aaa9GG3322233E[] = {
  NSPAIR(_ZN3aaa9GG3322233C1Ev),
  NSPAIR(_ZN3aaa9GG3322233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3322233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322233E[];
extern void _ZN3aaa9GG33222333fooEv();
extern void _ZN3aaa9GG33222333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33222333fooEv,_ZThn8_N3aaa9GG33222333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33222333barEv,_ZThn8_N3aaa9GG33222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33222333barEv,_ZThn20_N3aaa9GG33222333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33222333fooEv,_ZThn20_N3aaa9GG33222333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33222333barEv,_ZThn28_N3aaa9GG33222333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33222333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33222333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222333fooEv,_ZThn8_N3aaa9GG33222333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33222333barEv,_ZThn8_N3aaa9GG33222333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222333barEv,_ZThn20_N3aaa9GG33222333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33222333fooEv,_ZThn20_N3aaa9GG33222333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33222333barEv,_ZThn28_N3aaa9GG33222333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322233E[];
Class_Descriptor cd__ZN3aaa9GG3322233E = {  "_ZN3aaa9GG3322233E", // class name
  bases__ZN3aaa9GG3322233E, 6,
  &(vtc__ZN3aaa9GG3322233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322311  : ::aaa::EE332 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33223113fooEv
  ~GG3322311(); // tgen
  GG3322311(); // tgen
};
//SIG(1 _ZN3aaa9GG3322311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33223113fooEv");}
aaa::GG3322311 ::~GG3322311(){ note_dtor("_ZN3aaa9GG3322311E", this);} // tgen
aaa::GG3322311 ::GG3322311(){ note_ctor("_ZN3aaa9GG3322311E", this);} // tgen
}
static void Test__ZN3aaa9GG3322311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322311E, buf);
    ::aaa::GG3322311 *dp, &lv = *(dp=new (buf) ::aaa::GG3322311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322311E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3322311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3322311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3322311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322311E);
    dp->::aaa::GG3322311::~GG3322311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322311E(Test__ZN3aaa9GG3322311E, "_ZN3aaa9GG3322311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322311C1Ev();
extern void _ZN3aaa9GG3322311D1Ev();
Name_Map name_map__ZN3aaa9GG3322311E[] = {
  NSPAIR(_ZN3aaa9GG3322311C1Ev),
  NSPAIR(_ZN3aaa9GG3322311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3322311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322311E[];
extern void _ZN3aaa9GG33223113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223113fooEv,_ZThn8_N3aaa9GG33223113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33223113fooEv,_ZThn20_N3aaa9GG33223113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223113fooEv,_ZThn28_N3aaa9GG33223113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33223113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223113fooEv,_ZThn8_N3aaa9GG33223113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223113fooEv,_ZThn20_N3aaa9GG33223113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223113fooEv,_ZThn28_N3aaa9GG33223113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322311E[];
Class_Descriptor cd__ZN3aaa9GG3322311E = {  "_ZN3aaa9GG3322311E", // class name
  bases__ZN3aaa9GG3322311E, 6,
  &(vtc__ZN3aaa9GG3322311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322312  : ::aaa::EE332 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33223123barEv
  ~GG3322312(); // tgen
  GG3322312(); // tgen
};
//SIG(1 _ZN3aaa9GG3322312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33223123barEv");}
aaa::GG3322312 ::~GG3322312(){ note_dtor("_ZN3aaa9GG3322312E", this);} // tgen
aaa::GG3322312 ::GG3322312(){ note_ctor("_ZN3aaa9GG3322312E", this);} // tgen
}
static void Test__ZN3aaa9GG3322312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322312E, buf);
    ::aaa::GG3322312 *dp, &lv = *(dp=new (buf) ::aaa::GG3322312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322312E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3322312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3322312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3322312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322312E);
    dp->::aaa::GG3322312::~GG3322312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322312E(Test__ZN3aaa9GG3322312E, "_ZN3aaa9GG3322312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322312C1Ev();
extern void _ZN3aaa9GG3322312D1Ev();
Name_Map name_map__ZN3aaa9GG3322312E[] = {
  NSPAIR(_ZN3aaa9GG3322312C1Ev),
  NSPAIR(_ZN3aaa9GG3322312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3322312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33223123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223123barEv,_ZThn8_N3aaa9GG33223123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33223123barEv,_ZThn20_N3aaa9GG33223123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223123barEv,_ZThn28_N3aaa9GG33223123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33223123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223123barEv,_ZThn8_N3aaa9GG33223123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223123barEv,_ZThn20_N3aaa9GG33223123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223123barEv,_ZThn28_N3aaa9GG33223123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322312E[];
Class_Descriptor cd__ZN3aaa9GG3322312E = {  "_ZN3aaa9GG3322312E", // class name
  bases__ZN3aaa9GG3322312E, 6,
  &(vtc__ZN3aaa9GG3322312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322313  : ::aaa::EE332 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33223133fooEv
  virtual void  bar(); // _ZN3aaa9GG33223133barEv
  ~GG3322313(); // tgen
  GG3322313(); // tgen
};
//SIG(1 _ZN3aaa9GG3322313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33223133fooEv");}
void  aaa::GG3322313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33223133barEv");}
aaa::GG3322313 ::~GG3322313(){ note_dtor("_ZN3aaa9GG3322313E", this);} // tgen
aaa::GG3322313 ::GG3322313(){ note_ctor("_ZN3aaa9GG3322313E", this);} // tgen
}
static void Test__ZN3aaa9GG3322313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322313E, buf);
    ::aaa::GG3322313 *dp, &lv = *(dp=new (buf) ::aaa::GG3322313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322313E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3322313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3322313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3322313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322313E);
    dp->::aaa::GG3322313::~GG3322313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322313E(Test__ZN3aaa9GG3322313E, "_ZN3aaa9GG3322313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322313C1Ev();
extern void _ZN3aaa9GG3322313D1Ev();
Name_Map name_map__ZN3aaa9GG3322313E[] = {
  NSPAIR(_ZN3aaa9GG3322313C1Ev),
  NSPAIR(_ZN3aaa9GG3322313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3322313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322313E[];
extern void _ZN3aaa9GG33223133fooEv();
extern void _ZN3aaa9GG33223133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223133fooEv,_ZThn8_N3aaa9GG33223133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33223133barEv,_ZThn8_N3aaa9GG33223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33223133barEv,_ZThn20_N3aaa9GG33223133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33223133fooEv,_ZThn20_N3aaa9GG33223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223133fooEv,_ZThn28_N3aaa9GG33223133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223133barEv,_ZThn28_N3aaa9GG33223133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33223133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33223133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223133fooEv,_ZThn8_N3aaa9GG33223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223133barEv,_ZThn8_N3aaa9GG33223133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223133barEv,_ZThn20_N3aaa9GG33223133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223133fooEv,_ZThn20_N3aaa9GG33223133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223133fooEv,_ZThn28_N3aaa9GG33223133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223133barEv,_ZThn28_N3aaa9GG33223133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322313E[];
Class_Descriptor cd__ZN3aaa9GG3322313E = {  "_ZN3aaa9GG3322313E", // class name
  bases__ZN3aaa9GG3322313E, 6,
  &(vtc__ZN3aaa9GG3322313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322321  : ::aaa::EE332 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33223213fooEv
  ~GG3322321(); // tgen
  GG3322321(); // tgen
};
//SIG(1 _ZN3aaa9GG3322321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33223213fooEv");}
aaa::GG3322321 ::~GG3322321(){ note_dtor("_ZN3aaa9GG3322321E", this);} // tgen
aaa::GG3322321 ::GG3322321(){ note_ctor("_ZN3aaa9GG3322321E", this);} // tgen
}
static void Test__ZN3aaa9GG3322321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322321E, buf);
    ::aaa::GG3322321 *dp, &lv = *(dp=new (buf) ::aaa::GG3322321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322321E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3322321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3322321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3322321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322321E);
    dp->::aaa::GG3322321::~GG3322321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322321E(Test__ZN3aaa9GG3322321E, "_ZN3aaa9GG3322321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322321C1Ev();
extern void _ZN3aaa9GG3322321D1Ev();
Name_Map name_map__ZN3aaa9GG3322321E[] = {
  NSPAIR(_ZN3aaa9GG3322321C1Ev),
  NSPAIR(_ZN3aaa9GG3322321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3322321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322321E[];
extern void _ZN3aaa9GG33223213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223213fooEv,_ZThn8_N3aaa9GG33223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33223213fooEv,_ZThn28_N3aaa9GG33223213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33223213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223213fooEv,_ZThn8_N3aaa9GG33223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223213fooEv,_ZThn28_N3aaa9GG33223213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322321E[];
Class_Descriptor cd__ZN3aaa9GG3322321E = {  "_ZN3aaa9GG3322321E", // class name
  bases__ZN3aaa9GG3322321E, 6,
  &(vtc__ZN3aaa9GG3322321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322322  : ::aaa::EE332 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33223223barEv
  ~GG3322322(); // tgen
  GG3322322(); // tgen
};
//SIG(1 _ZN3aaa9GG3322322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33223223barEv");}
aaa::GG3322322 ::~GG3322322(){ note_dtor("_ZN3aaa9GG3322322E", this);} // tgen
aaa::GG3322322 ::GG3322322(){ note_ctor("_ZN3aaa9GG3322322E", this);} // tgen
}
static void Test__ZN3aaa9GG3322322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322322E, buf);
    ::aaa::GG3322322 *dp, &lv = *(dp=new (buf) ::aaa::GG3322322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322322E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3322322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3322322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3322322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322322E);
    dp->::aaa::GG3322322::~GG3322322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322322E(Test__ZN3aaa9GG3322322E, "_ZN3aaa9GG3322322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322322C1Ev();
extern void _ZN3aaa9GG3322322D1Ev();
Name_Map name_map__ZN3aaa9GG3322322E[] = {
  NSPAIR(_ZN3aaa9GG3322322C1Ev),
  NSPAIR(_ZN3aaa9GG3322322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3322322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33223223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223223barEv,_ZThn8_N3aaa9GG33223223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33223223barEv,_ZThn20_N3aaa9GG33223223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33223223barEv,_ZThn28_N3aaa9GG33223223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33223223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223223barEv,_ZThn8_N3aaa9GG33223223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223223barEv,_ZThn20_N3aaa9GG33223223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223223barEv,_ZThn28_N3aaa9GG33223223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322322E[];
Class_Descriptor cd__ZN3aaa9GG3322322E = {  "_ZN3aaa9GG3322322E", // class name
  bases__ZN3aaa9GG3322322E, 6,
  &(vtc__ZN3aaa9GG3322322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322323  : ::aaa::EE332 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33223233fooEv
  virtual void  bar(); // _ZN3aaa9GG33223233barEv
  ~GG3322323(); // tgen
  GG3322323(); // tgen
};
//SIG(1 _ZN3aaa9GG3322323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33223233fooEv");}
void  aaa::GG3322323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33223233barEv");}
aaa::GG3322323 ::~GG3322323(){ note_dtor("_ZN3aaa9GG3322323E", this);} // tgen
aaa::GG3322323 ::GG3322323(){ note_ctor("_ZN3aaa9GG3322323E", this);} // tgen
}
static void Test__ZN3aaa9GG3322323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322323E, buf);
    ::aaa::GG3322323 *dp, &lv = *(dp=new (buf) ::aaa::GG3322323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322323E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3322323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3322323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3322323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322323E);
    dp->::aaa::GG3322323::~GG3322323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322323E(Test__ZN3aaa9GG3322323E, "_ZN3aaa9GG3322323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322323C1Ev();
extern void _ZN3aaa9GG3322323D1Ev();
Name_Map name_map__ZN3aaa9GG3322323E[] = {
  NSPAIR(_ZN3aaa9GG3322323C1Ev),
  NSPAIR(_ZN3aaa9GG3322323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3322323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322323E[];
extern void _ZN3aaa9GG33223233fooEv();
extern void _ZN3aaa9GG33223233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223233fooEv,_ZThn8_N3aaa9GG33223233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33223233barEv,_ZThn8_N3aaa9GG33223233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33223233barEv,_ZThn20_N3aaa9GG33223233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223233fooEv,_ZThn28_N3aaa9GG33223233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223233barEv,_ZThn28_N3aaa9GG33223233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33223233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33223233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223233fooEv,_ZThn8_N3aaa9GG33223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223233barEv,_ZThn8_N3aaa9GG33223233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223233barEv,_ZThn20_N3aaa9GG33223233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223233fooEv,_ZThn28_N3aaa9GG33223233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223233barEv,_ZThn28_N3aaa9GG33223233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322323E[];
Class_Descriptor cd__ZN3aaa9GG3322323E = {  "_ZN3aaa9GG3322323E", // class name
  bases__ZN3aaa9GG3322323E, 6,
  &(vtc__ZN3aaa9GG3322323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322331  : ::aaa::EE332 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33223313fooEv
  ~GG3322331(); // tgen
  GG3322331(); // tgen
};
//SIG(1 _ZN3aaa9GG3322331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33223313fooEv");}
aaa::GG3322331 ::~GG3322331(){ note_dtor("_ZN3aaa9GG3322331E", this);} // tgen
aaa::GG3322331 ::GG3322331(){ note_ctor("_ZN3aaa9GG3322331E", this);} // tgen
}
static void Test__ZN3aaa9GG3322331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322331E, buf);
    ::aaa::GG3322331 *dp, &lv = *(dp=new (buf) ::aaa::GG3322331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322331E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3322331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3322331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3322331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322331E);
    dp->::aaa::GG3322331::~GG3322331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322331E(Test__ZN3aaa9GG3322331E, "_ZN3aaa9GG3322331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322331C1Ev();
extern void _ZN3aaa9GG3322331D1Ev();
Name_Map name_map__ZN3aaa9GG3322331E[] = {
  NSPAIR(_ZN3aaa9GG3322331C1Ev),
  NSPAIR(_ZN3aaa9GG3322331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3322331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322331E[];
extern void _ZN3aaa9GG33223313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223313fooEv,_ZThn8_N3aaa9GG33223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33223313fooEv,_ZThn20_N3aaa9GG33223313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223313fooEv,_ZThn28_N3aaa9GG33223313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33223313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223313fooEv,_ZThn8_N3aaa9GG33223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223313fooEv,_ZThn20_N3aaa9GG33223313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223313fooEv,_ZThn28_N3aaa9GG33223313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322331E[];
Class_Descriptor cd__ZN3aaa9GG3322331E = {  "_ZN3aaa9GG3322331E", // class name
  bases__ZN3aaa9GG3322331E, 6,
  &(vtc__ZN3aaa9GG3322331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322332  : ::aaa::EE332 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33223323barEv
  ~GG3322332(); // tgen
  GG3322332(); // tgen
};
//SIG(1 _ZN3aaa9GG3322332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC6{ v1 Fi} BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3322332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33223323barEv");}
aaa::GG3322332 ::~GG3322332(){ note_dtor("_ZN3aaa9GG3322332E", this);} // tgen
aaa::GG3322332 ::GG3322332(){ note_ctor("_ZN3aaa9GG3322332E", this);} // tgen
}
static void Test__ZN3aaa9GG3322332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322332E, buf);
    ::aaa::GG3322332 *dp, &lv = *(dp=new (buf) ::aaa::GG3322332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322332E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3322332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3322332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3322332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322332E);
    dp->::aaa::GG3322332::~GG3322332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322332E(Test__ZN3aaa9GG3322332E, "_ZN3aaa9GG3322332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322332C1Ev();
extern void _ZN3aaa9GG3322332D1Ev();
Name_Map name_map__ZN3aaa9GG3322332E[] = {
  NSPAIR(_ZN3aaa9GG3322332C1Ev),
  NSPAIR(_ZN3aaa9GG3322332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3322332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33223323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223323barEv,_ZThn8_N3aaa9GG33223323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33223323barEv,_ZThn20_N3aaa9GG33223323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223323barEv,_ZThn28_N3aaa9GG33223323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33223323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223323barEv,_ZThn8_N3aaa9GG33223323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223323barEv,_ZThn20_N3aaa9GG33223323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223323barEv,_ZThn28_N3aaa9GG33223323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322332E[];
Class_Descriptor cd__ZN3aaa9GG3322332E = {  "_ZN3aaa9GG3322332E", // class name
  bases__ZN3aaa9GG3322332E, 6,
  &(vtc__ZN3aaa9GG3322332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3322333  : ::aaa::EE332 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33223333fooEv
  virtual void  bar(); // _ZN3aaa9GG33223333barEv
  ~GG3322333(); // tgen
  GG3322333(); // tgen
};
//SIG(1 _ZN3aaa9GG3322333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3322333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33223333fooEv");}
void  aaa::GG3322333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33223333barEv");}
aaa::GG3322333 ::~GG3322333(){ note_dtor("_ZN3aaa9GG3322333E", this);} // tgen
aaa::GG3322333 ::GG3322333(){ note_ctor("_ZN3aaa9GG3322333E", this);} // tgen
}
static void Test__ZN3aaa9GG3322333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3322333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3322333E, buf);
    ::aaa::GG3322333 *dp, &lv = *(dp=new (buf) ::aaa::GG3322333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3322333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3322333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3322333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3322333E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3322333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3322333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3322333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3322333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3322333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3322333E);
    dp->::aaa::GG3322333::~GG3322333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3322333E(Test__ZN3aaa9GG3322333E, "_ZN3aaa9GG3322333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3322333C1Ev();
extern void _ZN3aaa9GG3322333D1Ev();
Name_Map name_map__ZN3aaa9GG3322333E[] = {
  NSPAIR(_ZN3aaa9GG3322333C1Ev),
  NSPAIR(_ZN3aaa9GG3322333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3322333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3322333E[];
extern void _ZN3aaa9GG33223333fooEv();
extern void _ZN3aaa9GG33223333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33223333fooEv,_ZThn8_N3aaa9GG33223333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33223333barEv,_ZThn8_N3aaa9GG33223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33223333barEv,_ZThn20_N3aaa9GG33223333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33223333fooEv,_ZThn20_N3aaa9GG33223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223333fooEv,_ZThn28_N3aaa9GG33223333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33223333barEv,_ZThn28_N3aaa9GG33223333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3322333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33223333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33223333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223333fooEv,_ZThn8_N3aaa9GG33223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33223333barEv,_ZThn8_N3aaa9GG33223333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223333barEv,_ZThn20_N3aaa9GG33223333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33223333fooEv,_ZThn20_N3aaa9GG33223333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3322333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223333fooEv,_ZThn28_N3aaa9GG33223333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33223333barEv,_ZThn28_N3aaa9GG33223333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3322333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3322333E[];
Class_Descriptor cd__ZN3aaa9GG3322333E = {  "_ZN3aaa9GG3322333E", // class name
  bases__ZN3aaa9GG3322333E, 6,
  &(vtc__ZN3aaa9GG3322333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3322333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3322333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323111  : ::aaa::EE332 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33231113fooEv
  ~GG3323111(); // tgen
  GG3323111(); // tgen
};
//SIG(1 _ZN3aaa9GG3323111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33231113fooEv");}
aaa::GG3323111 ::~GG3323111(){ note_dtor("_ZN3aaa9GG3323111E", this);} // tgen
aaa::GG3323111 ::GG3323111(){ note_ctor("_ZN3aaa9GG3323111E", this);} // tgen
}
static void Test__ZN3aaa9GG3323111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323111E, buf);
    ::aaa::GG3323111 *dp, &lv = *(dp=new (buf) ::aaa::GG3323111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323111E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3323111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3323111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3323111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323111E);
    dp->::aaa::GG3323111::~GG3323111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323111E(Test__ZN3aaa9GG3323111E, "_ZN3aaa9GG3323111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323111C1Ev();
extern void _ZN3aaa9GG3323111D1Ev();
Name_Map name_map__ZN3aaa9GG3323111E[] = {
  NSPAIR(_ZN3aaa9GG3323111C1Ev),
  NSPAIR(_ZN3aaa9GG3323111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3323111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323111E[];
extern void _ZN3aaa9GG33231113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231113fooEv,_ZThn8_N3aaa9GG33231113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231113fooEv,_ZThn20_N3aaa9GG33231113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33231113fooEv,_ZThn28_N3aaa9GG33231113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33231113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231113fooEv,_ZThn8_N3aaa9GG33231113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231113fooEv,_ZThn20_N3aaa9GG33231113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33231113fooEv,_ZThn28_N3aaa9GG33231113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323111E[];
Class_Descriptor cd__ZN3aaa9GG3323111E = {  "_ZN3aaa9GG3323111E", // class name
  bases__ZN3aaa9GG3323111E, 6,
  &(vtc__ZN3aaa9GG3323111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323112  : ::aaa::EE332 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33231123barEv
  ~GG3323112(); // tgen
  GG3323112(); // tgen
};
//SIG(1 _ZN3aaa9GG3323112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33231123barEv");}
aaa::GG3323112 ::~GG3323112(){ note_dtor("_ZN3aaa9GG3323112E", this);} // tgen
aaa::GG3323112 ::GG3323112(){ note_ctor("_ZN3aaa9GG3323112E", this);} // tgen
}
static void Test__ZN3aaa9GG3323112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323112E, buf);
    ::aaa::GG3323112 *dp, &lv = *(dp=new (buf) ::aaa::GG3323112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323112E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3323112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3323112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3323112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323112E);
    dp->::aaa::GG3323112::~GG3323112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323112E(Test__ZN3aaa9GG3323112E, "_ZN3aaa9GG3323112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323112C1Ev();
extern void _ZN3aaa9GG3323112D1Ev();
Name_Map name_map__ZN3aaa9GG3323112E[] = {
  NSPAIR(_ZN3aaa9GG3323112C1Ev),
  NSPAIR(_ZN3aaa9GG3323112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3323112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323112E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33231123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231123barEv,_ZThn8_N3aaa9GG33231123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33231123barEv,_ZThn20_N3aaa9GG33231123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33231123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231123barEv,_ZThn8_N3aaa9GG33231123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231123barEv,_ZThn20_N3aaa9GG33231123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323112E[];
Class_Descriptor cd__ZN3aaa9GG3323112E = {  "_ZN3aaa9GG3323112E", // class name
  bases__ZN3aaa9GG3323112E, 6,
  &(vtc__ZN3aaa9GG3323112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323113  : ::aaa::EE332 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33231133fooEv
  virtual void  bar(); // _ZN3aaa9GG33231133barEv
  ~GG3323113(); // tgen
  GG3323113(); // tgen
};
//SIG(1 _ZN3aaa9GG3323113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33231133fooEv");}
void  aaa::GG3323113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33231133barEv");}
aaa::GG3323113 ::~GG3323113(){ note_dtor("_ZN3aaa9GG3323113E", this);} // tgen
aaa::GG3323113 ::GG3323113(){ note_ctor("_ZN3aaa9GG3323113E", this);} // tgen
}
static void Test__ZN3aaa9GG3323113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323113E, buf);
    ::aaa::GG3323113 *dp, &lv = *(dp=new (buf) ::aaa::GG3323113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323113E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3323113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3323113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3323113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323113E);
    dp->::aaa::GG3323113::~GG3323113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323113E(Test__ZN3aaa9GG3323113E, "_ZN3aaa9GG3323113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323113C1Ev();
extern void _ZN3aaa9GG3323113D1Ev();
Name_Map name_map__ZN3aaa9GG3323113E[] = {
  NSPAIR(_ZN3aaa9GG3323113C1Ev),
  NSPAIR(_ZN3aaa9GG3323113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3323113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323113E[];
extern void _ZN3aaa9GG33231133fooEv();
extern void _ZN3aaa9GG33231133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231133fooEv,_ZThn8_N3aaa9GG33231133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33231133barEv,_ZThn8_N3aaa9GG33231133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231133fooEv,_ZThn20_N3aaa9GG33231133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231133barEv,_ZThn20_N3aaa9GG33231133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33231133fooEv,_ZThn28_N3aaa9GG33231133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33231133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33231133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231133fooEv,_ZThn8_N3aaa9GG33231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231133barEv,_ZThn8_N3aaa9GG33231133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231133fooEv,_ZThn20_N3aaa9GG33231133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231133barEv,_ZThn20_N3aaa9GG33231133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33231133fooEv,_ZThn28_N3aaa9GG33231133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323113E[];
Class_Descriptor cd__ZN3aaa9GG3323113E = {  "_ZN3aaa9GG3323113E", // class name
  bases__ZN3aaa9GG3323113E, 6,
  &(vtc__ZN3aaa9GG3323113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323121  : ::aaa::EE332 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33231213fooEv
  ~GG3323121(); // tgen
  GG3323121(); // tgen
};
//SIG(1 _ZN3aaa9GG3323121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33231213fooEv");}
aaa::GG3323121 ::~GG3323121(){ note_dtor("_ZN3aaa9GG3323121E", this);} // tgen
aaa::GG3323121 ::GG3323121(){ note_ctor("_ZN3aaa9GG3323121E", this);} // tgen
}
static void Test__ZN3aaa9GG3323121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323121E, buf);
    ::aaa::GG3323121 *dp, &lv = *(dp=new (buf) ::aaa::GG3323121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323121E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3323121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3323121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3323121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323121E);
    dp->::aaa::GG3323121::~GG3323121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323121E(Test__ZN3aaa9GG3323121E, "_ZN3aaa9GG3323121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323121C1Ev();
extern void _ZN3aaa9GG3323121D1Ev();
Name_Map name_map__ZN3aaa9GG3323121E[] = {
  NSPAIR(_ZN3aaa9GG3323121C1Ev),
  NSPAIR(_ZN3aaa9GG3323121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3323121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323121E[];
extern void _ZN3aaa9GG33231213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231213fooEv,_ZThn8_N3aaa9GG33231213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231213fooEv,_ZThn20_N3aaa9GG33231213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33231213fooEv,_ZThn28_N3aaa9GG33231213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33231213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231213fooEv,_ZThn8_N3aaa9GG33231213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231213fooEv,_ZThn20_N3aaa9GG33231213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33231213fooEv,_ZThn28_N3aaa9GG33231213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323121E[];
Class_Descriptor cd__ZN3aaa9GG3323121E = {  "_ZN3aaa9GG3323121E", // class name
  bases__ZN3aaa9GG3323121E, 6,
  &(vtc__ZN3aaa9GG3323121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323122  : ::aaa::EE332 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33231223barEv
  ~GG3323122(); // tgen
  GG3323122(); // tgen
};
//SIG(1 _ZN3aaa9GG3323122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33231223barEv");}
aaa::GG3323122 ::~GG3323122(){ note_dtor("_ZN3aaa9GG3323122E", this);} // tgen
aaa::GG3323122 ::GG3323122(){ note_ctor("_ZN3aaa9GG3323122E", this);} // tgen
}
static void Test__ZN3aaa9GG3323122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323122E, buf);
    ::aaa::GG3323122 *dp, &lv = *(dp=new (buf) ::aaa::GG3323122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323122E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3323122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3323122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3323122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323122E);
    dp->::aaa::GG3323122::~GG3323122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323122E(Test__ZN3aaa9GG3323122E, "_ZN3aaa9GG3323122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323122C1Ev();
extern void _ZN3aaa9GG3323122D1Ev();
Name_Map name_map__ZN3aaa9GG3323122E[] = {
  NSPAIR(_ZN3aaa9GG3323122C1Ev),
  NSPAIR(_ZN3aaa9GG3323122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3323122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323122E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33231223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231223barEv,_ZThn8_N3aaa9GG33231223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33231223barEv,_ZThn20_N3aaa9GG33231223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33231223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231223barEv,_ZThn8_N3aaa9GG33231223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231223barEv,_ZThn20_N3aaa9GG33231223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323122E[];
Class_Descriptor cd__ZN3aaa9GG3323122E = {  "_ZN3aaa9GG3323122E", // class name
  bases__ZN3aaa9GG3323122E, 6,
  &(vtc__ZN3aaa9GG3323122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323123  : ::aaa::EE332 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33231233fooEv
  virtual void  bar(); // _ZN3aaa9GG33231233barEv
  ~GG3323123(); // tgen
  GG3323123(); // tgen
};
//SIG(1 _ZN3aaa9GG3323123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33231233fooEv");}
void  aaa::GG3323123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33231233barEv");}
aaa::GG3323123 ::~GG3323123(){ note_dtor("_ZN3aaa9GG3323123E", this);} // tgen
aaa::GG3323123 ::GG3323123(){ note_ctor("_ZN3aaa9GG3323123E", this);} // tgen
}
static void Test__ZN3aaa9GG3323123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323123E, buf);
    ::aaa::GG3323123 *dp, &lv = *(dp=new (buf) ::aaa::GG3323123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323123E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3323123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3323123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3323123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323123E);
    dp->::aaa::GG3323123::~GG3323123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323123E(Test__ZN3aaa9GG3323123E, "_ZN3aaa9GG3323123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323123C1Ev();
extern void _ZN3aaa9GG3323123D1Ev();
Name_Map name_map__ZN3aaa9GG3323123E[] = {
  NSPAIR(_ZN3aaa9GG3323123C1Ev),
  NSPAIR(_ZN3aaa9GG3323123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3323123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323123E[];
extern void _ZN3aaa9GG33231233fooEv();
extern void _ZN3aaa9GG33231233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231233fooEv,_ZThn8_N3aaa9GG33231233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33231233barEv,_ZThn8_N3aaa9GG33231233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231233fooEv,_ZThn20_N3aaa9GG33231233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231233barEv,_ZThn20_N3aaa9GG33231233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33231233fooEv,_ZThn28_N3aaa9GG33231233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33231233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33231233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231233fooEv,_ZThn8_N3aaa9GG33231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231233barEv,_ZThn8_N3aaa9GG33231233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231233fooEv,_ZThn20_N3aaa9GG33231233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231233barEv,_ZThn20_N3aaa9GG33231233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33231233fooEv,_ZThn28_N3aaa9GG33231233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323123E[];
Class_Descriptor cd__ZN3aaa9GG3323123E = {  "_ZN3aaa9GG3323123E", // class name
  bases__ZN3aaa9GG3323123E, 6,
  &(vtc__ZN3aaa9GG3323123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323131  : ::aaa::EE332 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33231313fooEv
  ~GG3323131(); // tgen
  GG3323131(); // tgen
};
//SIG(1 _ZN3aaa9GG3323131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33231313fooEv");}
aaa::GG3323131 ::~GG3323131(){ note_dtor("_ZN3aaa9GG3323131E", this);} // tgen
aaa::GG3323131 ::GG3323131(){ note_ctor("_ZN3aaa9GG3323131E", this);} // tgen
}
static void Test__ZN3aaa9GG3323131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323131E, buf);
    ::aaa::GG3323131 *dp, &lv = *(dp=new (buf) ::aaa::GG3323131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323131E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3323131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3323131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3323131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323131E);
    dp->::aaa::GG3323131::~GG3323131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323131E(Test__ZN3aaa9GG3323131E, "_ZN3aaa9GG3323131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323131C1Ev();
extern void _ZN3aaa9GG3323131D1Ev();
Name_Map name_map__ZN3aaa9GG3323131E[] = {
  NSPAIR(_ZN3aaa9GG3323131C1Ev),
  NSPAIR(_ZN3aaa9GG3323131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3323131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323131E[];
extern void _ZN3aaa9GG33231313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231313fooEv,_ZThn8_N3aaa9GG33231313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231313fooEv,_ZThn20_N3aaa9GG33231313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33231313fooEv,_ZThn28_N3aaa9GG33231313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33231313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231313fooEv,_ZThn8_N3aaa9GG33231313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231313fooEv,_ZThn20_N3aaa9GG33231313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33231313fooEv,_ZThn28_N3aaa9GG33231313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323131E[];
Class_Descriptor cd__ZN3aaa9GG3323131E = {  "_ZN3aaa9GG3323131E", // class name
  bases__ZN3aaa9GG3323131E, 6,
  &(vtc__ZN3aaa9GG3323131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323132  : ::aaa::EE332 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33231323barEv
  ~GG3323132(); // tgen
  GG3323132(); // tgen
};
//SIG(1 _ZN3aaa9GG3323132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v4 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33231323barEv");}
aaa::GG3323132 ::~GG3323132(){ note_dtor("_ZN3aaa9GG3323132E", this);} // tgen
aaa::GG3323132 ::GG3323132(){ note_ctor("_ZN3aaa9GG3323132E", this);} // tgen
}
static void Test__ZN3aaa9GG3323132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323132E, buf);
    ::aaa::GG3323132 *dp, &lv = *(dp=new (buf) ::aaa::GG3323132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323132E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3323132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3323132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3323132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323132E);
    dp->::aaa::GG3323132::~GG3323132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323132E(Test__ZN3aaa9GG3323132E, "_ZN3aaa9GG3323132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323132C1Ev();
extern void _ZN3aaa9GG3323132D1Ev();
Name_Map name_map__ZN3aaa9GG3323132E[] = {
  NSPAIR(_ZN3aaa9GG3323132C1Ev),
  NSPAIR(_ZN3aaa9GG3323132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3323132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323132E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33231323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231323barEv,_ZThn8_N3aaa9GG33231323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33231323barEv,_ZThn20_N3aaa9GG33231323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33231323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231323barEv,_ZThn8_N3aaa9GG33231323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231323barEv,_ZThn20_N3aaa9GG33231323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323132E[];
Class_Descriptor cd__ZN3aaa9GG3323132E = {  "_ZN3aaa9GG3323132E", // class name
  bases__ZN3aaa9GG3323132E, 6,
  &(vtc__ZN3aaa9GG3323132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323133  : ::aaa::EE332 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33231333fooEv
  virtual void  bar(); // _ZN3aaa9GG33231333barEv
  ~GG3323133(); // tgen
  GG3323133(); // tgen
};
//SIG(1 _ZN3aaa9GG3323133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33231333fooEv");}
void  aaa::GG3323133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33231333barEv");}
aaa::GG3323133 ::~GG3323133(){ note_dtor("_ZN3aaa9GG3323133E", this);} // tgen
aaa::GG3323133 ::GG3323133(){ note_ctor("_ZN3aaa9GG3323133E", this);} // tgen
}
static void Test__ZN3aaa9GG3323133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323133E, buf);
    ::aaa::GG3323133 *dp, &lv = *(dp=new (buf) ::aaa::GG3323133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323133E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3323133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3323133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3323133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323133E);
    dp->::aaa::GG3323133::~GG3323133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323133E(Test__ZN3aaa9GG3323133E, "_ZN3aaa9GG3323133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323133C1Ev();
extern void _ZN3aaa9GG3323133D1Ev();
Name_Map name_map__ZN3aaa9GG3323133E[] = {
  NSPAIR(_ZN3aaa9GG3323133C1Ev),
  NSPAIR(_ZN3aaa9GG3323133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3323133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323133E[];
extern void _ZN3aaa9GG33231333fooEv();
extern void _ZN3aaa9GG33231333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33231333fooEv,_ZThn8_N3aaa9GG33231333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33231333barEv,_ZThn8_N3aaa9GG33231333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231333fooEv,_ZThn20_N3aaa9GG33231333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33231333barEv,_ZThn20_N3aaa9GG33231333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33231333fooEv,_ZThn28_N3aaa9GG33231333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33231333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33231333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231333fooEv,_ZThn8_N3aaa9GG33231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33231333barEv,_ZThn8_N3aaa9GG33231333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231333fooEv,_ZThn20_N3aaa9GG33231333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33231333barEv,_ZThn20_N3aaa9GG33231333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33231333fooEv,_ZThn28_N3aaa9GG33231333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323133E[];
Class_Descriptor cd__ZN3aaa9GG3323133E = {  "_ZN3aaa9GG3323133E", // class name
  bases__ZN3aaa9GG3323133E, 6,
  &(vtc__ZN3aaa9GG3323133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323211  : ::aaa::EE332 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33232113fooEv
  ~GG3323211(); // tgen
  GG3323211(); // tgen
};
//SIG(1 _ZN3aaa9GG3323211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33232113fooEv");}
aaa::GG3323211 ::~GG3323211(){ note_dtor("_ZN3aaa9GG3323211E", this);} // tgen
aaa::GG3323211 ::GG3323211(){ note_ctor("_ZN3aaa9GG3323211E", this);} // tgen
}
static void Test__ZN3aaa9GG3323211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323211E, buf);
    ::aaa::GG3323211 *dp, &lv = *(dp=new (buf) ::aaa::GG3323211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323211E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3323211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3323211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3323211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323211E);
    dp->::aaa::GG3323211::~GG3323211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323211E(Test__ZN3aaa9GG3323211E, "_ZN3aaa9GG3323211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323211C1Ev();
extern void _ZN3aaa9GG3323211D1Ev();
Name_Map name_map__ZN3aaa9GG3323211E[] = {
  NSPAIR(_ZN3aaa9GG3323211C1Ev),
  NSPAIR(_ZN3aaa9GG3323211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3323211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323211E[];
extern void _ZN3aaa9GG33232113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232113fooEv,_ZThn8_N3aaa9GG33232113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232113fooEv,_ZThn20_N3aaa9GG33232113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33232113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232113fooEv,_ZThn8_N3aaa9GG33232113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232113fooEv,_ZThn20_N3aaa9GG33232113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323211E[];
Class_Descriptor cd__ZN3aaa9GG3323211E = {  "_ZN3aaa9GG3323211E", // class name
  bases__ZN3aaa9GG3323211E, 6,
  &(vtc__ZN3aaa9GG3323211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323212  : ::aaa::EE332 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33232123barEv
  ~GG3323212(); // tgen
  GG3323212(); // tgen
};
//SIG(1 _ZN3aaa9GG3323212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33232123barEv");}
aaa::GG3323212 ::~GG3323212(){ note_dtor("_ZN3aaa9GG3323212E", this);} // tgen
aaa::GG3323212 ::GG3323212(){ note_ctor("_ZN3aaa9GG3323212E", this);} // tgen
}
static void Test__ZN3aaa9GG3323212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323212E, buf);
    ::aaa::GG3323212 *dp, &lv = *(dp=new (buf) ::aaa::GG3323212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323212E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3323212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3323212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3323212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323212E);
    dp->::aaa::GG3323212::~GG3323212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323212E(Test__ZN3aaa9GG3323212E, "_ZN3aaa9GG3323212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323212C1Ev();
extern void _ZN3aaa9GG3323212D1Ev();
Name_Map name_map__ZN3aaa9GG3323212E[] = {
  NSPAIR(_ZN3aaa9GG3323212C1Ev),
  NSPAIR(_ZN3aaa9GG3323212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3323212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323212E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33232123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232123barEv,_ZThn8_N3aaa9GG33232123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33232123barEv,_ZThn20_N3aaa9GG33232123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33232123barEv,_ZThn28_N3aaa9GG33232123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33232123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232123barEv,_ZThn8_N3aaa9GG33232123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232123barEv,_ZThn20_N3aaa9GG33232123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33232123barEv,_ZThn28_N3aaa9GG33232123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323212E[];
Class_Descriptor cd__ZN3aaa9GG3323212E = {  "_ZN3aaa9GG3323212E", // class name
  bases__ZN3aaa9GG3323212E, 6,
  &(vtc__ZN3aaa9GG3323212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323213  : ::aaa::EE332 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33232133fooEv
  virtual void  bar(); // _ZN3aaa9GG33232133barEv
  ~GG3323213(); // tgen
  GG3323213(); // tgen
};
//SIG(1 _ZN3aaa9GG3323213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33232133fooEv");}
void  aaa::GG3323213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33232133barEv");}
aaa::GG3323213 ::~GG3323213(){ note_dtor("_ZN3aaa9GG3323213E", this);} // tgen
aaa::GG3323213 ::GG3323213(){ note_ctor("_ZN3aaa9GG3323213E", this);} // tgen
}
static void Test__ZN3aaa9GG3323213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323213E, buf);
    ::aaa::GG3323213 *dp, &lv = *(dp=new (buf) ::aaa::GG3323213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323213E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3323213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3323213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3323213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323213E);
    dp->::aaa::GG3323213::~GG3323213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323213E(Test__ZN3aaa9GG3323213E, "_ZN3aaa9GG3323213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323213C1Ev();
extern void _ZN3aaa9GG3323213D1Ev();
Name_Map name_map__ZN3aaa9GG3323213E[] = {
  NSPAIR(_ZN3aaa9GG3323213C1Ev),
  NSPAIR(_ZN3aaa9GG3323213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3323213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323213E[];
extern void _ZN3aaa9GG33232133fooEv();
extern void _ZN3aaa9GG33232133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232133fooEv,_ZThn8_N3aaa9GG33232133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33232133barEv,_ZThn8_N3aaa9GG33232133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232133fooEv,_ZThn20_N3aaa9GG33232133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232133barEv,_ZThn20_N3aaa9GG33232133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33232133barEv,_ZThn28_N3aaa9GG33232133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33232133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33232133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232133fooEv,_ZThn8_N3aaa9GG33232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232133barEv,_ZThn8_N3aaa9GG33232133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232133fooEv,_ZThn20_N3aaa9GG33232133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232133barEv,_ZThn20_N3aaa9GG33232133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33232133barEv,_ZThn28_N3aaa9GG33232133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323213E[];
Class_Descriptor cd__ZN3aaa9GG3323213E = {  "_ZN3aaa9GG3323213E", // class name
  bases__ZN3aaa9GG3323213E, 6,
  &(vtc__ZN3aaa9GG3323213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323221  : ::aaa::EE332 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33232213fooEv
  ~GG3323221(); // tgen
  GG3323221(); // tgen
};
//SIG(1 _ZN3aaa9GG3323221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33232213fooEv");}
aaa::GG3323221 ::~GG3323221(){ note_dtor("_ZN3aaa9GG3323221E", this);} // tgen
aaa::GG3323221 ::GG3323221(){ note_ctor("_ZN3aaa9GG3323221E", this);} // tgen
}
static void Test__ZN3aaa9GG3323221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323221E, buf);
    ::aaa::GG3323221 *dp, &lv = *(dp=new (buf) ::aaa::GG3323221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323221E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3323221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3323221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3323221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323221E);
    dp->::aaa::GG3323221::~GG3323221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323221E(Test__ZN3aaa9GG3323221E, "_ZN3aaa9GG3323221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323221C1Ev();
extern void _ZN3aaa9GG3323221D1Ev();
Name_Map name_map__ZN3aaa9GG3323221E[] = {
  NSPAIR(_ZN3aaa9GG3323221C1Ev),
  NSPAIR(_ZN3aaa9GG3323221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3323221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323221E[];
extern void _ZN3aaa9GG33232213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232213fooEv,_ZThn8_N3aaa9GG33232213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232213fooEv,_ZThn20_N3aaa9GG33232213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33232213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232213fooEv,_ZThn8_N3aaa9GG33232213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232213fooEv,_ZThn20_N3aaa9GG33232213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323221E[];
Class_Descriptor cd__ZN3aaa9GG3323221E = {  "_ZN3aaa9GG3323221E", // class name
  bases__ZN3aaa9GG3323221E, 6,
  &(vtc__ZN3aaa9GG3323221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323222  : ::aaa::EE332 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33232223barEv
  ~GG3323222(); // tgen
  GG3323222(); // tgen
};
//SIG(1 _ZN3aaa9GG3323222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33232223barEv");}
aaa::GG3323222 ::~GG3323222(){ note_dtor("_ZN3aaa9GG3323222E", this);} // tgen
aaa::GG3323222 ::GG3323222(){ note_ctor("_ZN3aaa9GG3323222E", this);} // tgen
}
static void Test__ZN3aaa9GG3323222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323222E, buf);
    ::aaa::GG3323222 *dp, &lv = *(dp=new (buf) ::aaa::GG3323222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323222E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3323222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3323222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3323222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323222E);
    dp->::aaa::GG3323222::~GG3323222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323222E(Test__ZN3aaa9GG3323222E, "_ZN3aaa9GG3323222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323222C1Ev();
extern void _ZN3aaa9GG3323222D1Ev();
Name_Map name_map__ZN3aaa9GG3323222E[] = {
  NSPAIR(_ZN3aaa9GG3323222C1Ev),
  NSPAIR(_ZN3aaa9GG3323222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3323222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323222E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33232223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232223barEv,_ZThn8_N3aaa9GG33232223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33232223barEv,_ZThn20_N3aaa9GG33232223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33232223barEv,_ZThn28_N3aaa9GG33232223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33232223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232223barEv,_ZThn8_N3aaa9GG33232223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232223barEv,_ZThn20_N3aaa9GG33232223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33232223barEv,_ZThn28_N3aaa9GG33232223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323222E[];
Class_Descriptor cd__ZN3aaa9GG3323222E = {  "_ZN3aaa9GG3323222E", // class name
  bases__ZN3aaa9GG3323222E, 6,
  &(vtc__ZN3aaa9GG3323222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323223  : ::aaa::EE332 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33232233fooEv
  virtual void  bar(); // _ZN3aaa9GG33232233barEv
  ~GG3323223(); // tgen
  GG3323223(); // tgen
};
//SIG(1 _ZN3aaa9GG3323223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33232233fooEv");}
void  aaa::GG3323223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33232233barEv");}
aaa::GG3323223 ::~GG3323223(){ note_dtor("_ZN3aaa9GG3323223E", this);} // tgen
aaa::GG3323223 ::GG3323223(){ note_ctor("_ZN3aaa9GG3323223E", this);} // tgen
}
static void Test__ZN3aaa9GG3323223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323223E, buf);
    ::aaa::GG3323223 *dp, &lv = *(dp=new (buf) ::aaa::GG3323223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323223E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3323223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3323223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3323223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323223E);
    dp->::aaa::GG3323223::~GG3323223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323223E(Test__ZN3aaa9GG3323223E, "_ZN3aaa9GG3323223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323223C1Ev();
extern void _ZN3aaa9GG3323223D1Ev();
Name_Map name_map__ZN3aaa9GG3323223E[] = {
  NSPAIR(_ZN3aaa9GG3323223C1Ev),
  NSPAIR(_ZN3aaa9GG3323223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3323223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323223E[];
extern void _ZN3aaa9GG33232233fooEv();
extern void _ZN3aaa9GG33232233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232233fooEv,_ZThn8_N3aaa9GG33232233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33232233barEv,_ZThn8_N3aaa9GG33232233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232233fooEv,_ZThn20_N3aaa9GG33232233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232233barEv,_ZThn20_N3aaa9GG33232233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33232233barEv,_ZThn28_N3aaa9GG33232233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33232233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33232233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232233fooEv,_ZThn8_N3aaa9GG33232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232233barEv,_ZThn8_N3aaa9GG33232233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232233fooEv,_ZThn20_N3aaa9GG33232233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232233barEv,_ZThn20_N3aaa9GG33232233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33232233barEv,_ZThn28_N3aaa9GG33232233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323223E[];
Class_Descriptor cd__ZN3aaa9GG3323223E = {  "_ZN3aaa9GG3323223E", // class name
  bases__ZN3aaa9GG3323223E, 6,
  &(vtc__ZN3aaa9GG3323223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323231  : ::aaa::EE332 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33232313fooEv
  ~GG3323231(); // tgen
  GG3323231(); // tgen
};
//SIG(1 _ZN3aaa9GG3323231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33232313fooEv");}
aaa::GG3323231 ::~GG3323231(){ note_dtor("_ZN3aaa9GG3323231E", this);} // tgen
aaa::GG3323231 ::GG3323231(){ note_ctor("_ZN3aaa9GG3323231E", this);} // tgen
}
static void Test__ZN3aaa9GG3323231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323231E, buf);
    ::aaa::GG3323231 *dp, &lv = *(dp=new (buf) ::aaa::GG3323231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323231E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3323231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3323231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3323231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323231E);
    dp->::aaa::GG3323231::~GG3323231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323231E(Test__ZN3aaa9GG3323231E, "_ZN3aaa9GG3323231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323231C1Ev();
extern void _ZN3aaa9GG3323231D1Ev();
Name_Map name_map__ZN3aaa9GG3323231E[] = {
  NSPAIR(_ZN3aaa9GG3323231C1Ev),
  NSPAIR(_ZN3aaa9GG3323231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3323231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323231E[];
extern void _ZN3aaa9GG33232313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232313fooEv,_ZThn8_N3aaa9GG33232313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232313fooEv,_ZThn20_N3aaa9GG33232313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33232313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232313fooEv,_ZThn8_N3aaa9GG33232313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232313fooEv,_ZThn20_N3aaa9GG33232313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323231E[];
Class_Descriptor cd__ZN3aaa9GG3323231E = {  "_ZN3aaa9GG3323231E", // class name
  bases__ZN3aaa9GG3323231E, 6,
  &(vtc__ZN3aaa9GG3323231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323232  : ::aaa::EE332 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33232323barEv
  ~GG3323232(); // tgen
  GG3323232(); // tgen
};
//SIG(1 _ZN3aaa9GG3323232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC6{ v1 Fi} v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33232323barEv");}
aaa::GG3323232 ::~GG3323232(){ note_dtor("_ZN3aaa9GG3323232E", this);} // tgen
aaa::GG3323232 ::GG3323232(){ note_ctor("_ZN3aaa9GG3323232E", this);} // tgen
}
static void Test__ZN3aaa9GG3323232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323232E, buf);
    ::aaa::GG3323232 *dp, &lv = *(dp=new (buf) ::aaa::GG3323232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323232E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3323232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3323232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3323232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323232E);
    dp->::aaa::GG3323232::~GG3323232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323232E(Test__ZN3aaa9GG3323232E, "_ZN3aaa9GG3323232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323232C1Ev();
extern void _ZN3aaa9GG3323232D1Ev();
Name_Map name_map__ZN3aaa9GG3323232E[] = {
  NSPAIR(_ZN3aaa9GG3323232C1Ev),
  NSPAIR(_ZN3aaa9GG3323232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3323232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323232E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33232323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232323barEv,_ZThn8_N3aaa9GG33232323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33232323barEv,_ZThn20_N3aaa9GG33232323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33232323barEv,_ZThn28_N3aaa9GG33232323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33232323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232323barEv,_ZThn8_N3aaa9GG33232323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232323barEv,_ZThn20_N3aaa9GG33232323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33232323barEv,_ZThn28_N3aaa9GG33232323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323232E[];
Class_Descriptor cd__ZN3aaa9GG3323232E = {  "_ZN3aaa9GG3323232E", // class name
  bases__ZN3aaa9GG3323232E, 6,
  &(vtc__ZN3aaa9GG3323232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323233  : ::aaa::EE332 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33232333fooEv
  virtual void  bar(); // _ZN3aaa9GG33232333barEv
  ~GG3323233(); // tgen
  GG3323233(); // tgen
};
//SIG(1 _ZN3aaa9GG3323233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33232333fooEv");}
void  aaa::GG3323233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33232333barEv");}
aaa::GG3323233 ::~GG3323233(){ note_dtor("_ZN3aaa9GG3323233E", this);} // tgen
aaa::GG3323233 ::GG3323233(){ note_ctor("_ZN3aaa9GG3323233E", this);} // tgen
}
static void Test__ZN3aaa9GG3323233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323233E, buf);
    ::aaa::GG3323233 *dp, &lv = *(dp=new (buf) ::aaa::GG3323233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323233E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3323233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3323233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3323233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323233E);
    dp->::aaa::GG3323233::~GG3323233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323233E(Test__ZN3aaa9GG3323233E, "_ZN3aaa9GG3323233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323233C1Ev();
extern void _ZN3aaa9GG3323233D1Ev();
Name_Map name_map__ZN3aaa9GG3323233E[] = {
  NSPAIR(_ZN3aaa9GG3323233C1Ev),
  NSPAIR(_ZN3aaa9GG3323233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3323233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323233E[];
extern void _ZN3aaa9GG33232333fooEv();
extern void _ZN3aaa9GG33232333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33232333fooEv,_ZThn8_N3aaa9GG33232333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33232333barEv,_ZThn8_N3aaa9GG33232333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232333fooEv,_ZThn20_N3aaa9GG33232333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33232333barEv,_ZThn20_N3aaa9GG33232333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33232333barEv,_ZThn28_N3aaa9GG33232333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33232333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33232333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232333fooEv,_ZThn8_N3aaa9GG33232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33232333barEv,_ZThn8_N3aaa9GG33232333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232333fooEv,_ZThn20_N3aaa9GG33232333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33232333barEv,_ZThn20_N3aaa9GG33232333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33232333barEv,_ZThn28_N3aaa9GG33232333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323233E[];
Class_Descriptor cd__ZN3aaa9GG3323233E = {  "_ZN3aaa9GG3323233E", // class name
  bases__ZN3aaa9GG3323233E, 6,
  &(vtc__ZN3aaa9GG3323233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323311  : ::aaa::EE332 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33233113fooEv
  ~GG3323311(); // tgen
  GG3323311(); // tgen
};
//SIG(1 _ZN3aaa9GG3323311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33233113fooEv");}
aaa::GG3323311 ::~GG3323311(){ note_dtor("_ZN3aaa9GG3323311E", this);} // tgen
aaa::GG3323311 ::GG3323311(){ note_ctor("_ZN3aaa9GG3323311E", this);} // tgen
}
static void Test__ZN3aaa9GG3323311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323311E, buf);
    ::aaa::GG3323311 *dp, &lv = *(dp=new (buf) ::aaa::GG3323311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323311E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3323311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3323311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3323311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323311E);
    dp->::aaa::GG3323311::~GG3323311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323311E(Test__ZN3aaa9GG3323311E, "_ZN3aaa9GG3323311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323311C1Ev();
extern void _ZN3aaa9GG3323311D1Ev();
Name_Map name_map__ZN3aaa9GG3323311E[] = {
  NSPAIR(_ZN3aaa9GG3323311C1Ev),
  NSPAIR(_ZN3aaa9GG3323311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3323311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323311E[];
extern void _ZN3aaa9GG33233113fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233113fooEv,_ZThn8_N3aaa9GG33233113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233113fooEv,_ZThn20_N3aaa9GG33233113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33233113fooEv,_ZThn28_N3aaa9GG33233113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33233113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233113fooEv,_ZThn8_N3aaa9GG33233113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233113fooEv,_ZThn20_N3aaa9GG33233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233113fooEv,_ZThn28_N3aaa9GG33233113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323311E[];
Class_Descriptor cd__ZN3aaa9GG3323311E = {  "_ZN3aaa9GG3323311E", // class name
  bases__ZN3aaa9GG3323311E, 6,
  &(vtc__ZN3aaa9GG3323311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323312  : ::aaa::EE332 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33233123barEv
  ~GG3323312(); // tgen
  GG3323312(); // tgen
};
//SIG(1 _ZN3aaa9GG3323312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC4 v4 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33233123barEv");}
aaa::GG3323312 ::~GG3323312(){ note_dtor("_ZN3aaa9GG3323312E", this);} // tgen
aaa::GG3323312 ::GG3323312(){ note_ctor("_ZN3aaa9GG3323312E", this);} // tgen
}
static void Test__ZN3aaa9GG3323312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323312E, buf);
    ::aaa::GG3323312 *dp, &lv = *(dp=new (buf) ::aaa::GG3323312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323312E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3323312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3323312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3323312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323312E);
    dp->::aaa::GG3323312::~GG3323312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323312E(Test__ZN3aaa9GG3323312E, "_ZN3aaa9GG3323312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323312C1Ev();
extern void _ZN3aaa9GG3323312D1Ev();
Name_Map name_map__ZN3aaa9GG3323312E[] = {
  NSPAIR(_ZN3aaa9GG3323312C1Ev),
  NSPAIR(_ZN3aaa9GG3323312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3323312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323312E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33233123barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233123barEv,_ZThn8_N3aaa9GG33233123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33233123barEv,_ZThn20_N3aaa9GG33233123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33233123barEv,_ZThn28_N3aaa9GG33233123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33233123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233123barEv,_ZThn8_N3aaa9GG33233123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233123barEv,_ZThn20_N3aaa9GG33233123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233123barEv,_ZThn28_N3aaa9GG33233123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323312E[];
Class_Descriptor cd__ZN3aaa9GG3323312E = {  "_ZN3aaa9GG3323312E", // class name
  bases__ZN3aaa9GG3323312E, 6,
  &(vtc__ZN3aaa9GG3323312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323313  : ::aaa::EE332 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33233133fooEv
  virtual void  bar(); // _ZN3aaa9GG33233133barEv
  ~GG3323313(); // tgen
  GG3323313(); // tgen
};
//SIG(1 _ZN3aaa9GG3323313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33233133fooEv");}
void  aaa::GG3323313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33233133barEv");}
aaa::GG3323313 ::~GG3323313(){ note_dtor("_ZN3aaa9GG3323313E", this);} // tgen
aaa::GG3323313 ::GG3323313(){ note_ctor("_ZN3aaa9GG3323313E", this);} // tgen
}
static void Test__ZN3aaa9GG3323313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323313E, buf);
    ::aaa::GG3323313 *dp, &lv = *(dp=new (buf) ::aaa::GG3323313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323313E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3323313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3323313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3323313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323313E);
    dp->::aaa::GG3323313::~GG3323313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323313E(Test__ZN3aaa9GG3323313E, "_ZN3aaa9GG3323313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323313C1Ev();
extern void _ZN3aaa9GG3323313D1Ev();
Name_Map name_map__ZN3aaa9GG3323313E[] = {
  NSPAIR(_ZN3aaa9GG3323313C1Ev),
  NSPAIR(_ZN3aaa9GG3323313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3323313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323313E[];
extern void _ZN3aaa9GG33233133fooEv();
extern void _ZN3aaa9GG33233133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233133fooEv,_ZThn8_N3aaa9GG33233133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33233133barEv,_ZThn8_N3aaa9GG33233133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233133fooEv,_ZThn20_N3aaa9GG33233133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233133barEv,_ZThn20_N3aaa9GG33233133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33233133fooEv,_ZThn28_N3aaa9GG33233133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33233133barEv,_ZThn28_N3aaa9GG33233133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33233133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33233133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233133fooEv,_ZThn8_N3aaa9GG33233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233133barEv,_ZThn8_N3aaa9GG33233133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233133fooEv,_ZThn20_N3aaa9GG33233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233133barEv,_ZThn20_N3aaa9GG33233133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233133fooEv,_ZThn28_N3aaa9GG33233133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233133barEv,_ZThn28_N3aaa9GG33233133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323313E[];
Class_Descriptor cd__ZN3aaa9GG3323313E = {  "_ZN3aaa9GG3323313E", // class name
  bases__ZN3aaa9GG3323313E, 6,
  &(vtc__ZN3aaa9GG3323313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323321  : ::aaa::EE332 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33233213fooEv
  ~GG3323321(); // tgen
  GG3323321(); // tgen
};
//SIG(1 _ZN3aaa9GG3323321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33233213fooEv");}
aaa::GG3323321 ::~GG3323321(){ note_dtor("_ZN3aaa9GG3323321E", this);} // tgen
aaa::GG3323321 ::GG3323321(){ note_ctor("_ZN3aaa9GG3323321E", this);} // tgen
}
static void Test__ZN3aaa9GG3323321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323321E, buf);
    ::aaa::GG3323321 *dp, &lv = *(dp=new (buf) ::aaa::GG3323321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323321E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3323321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3323321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3323321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323321E);
    dp->::aaa::GG3323321::~GG3323321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323321E(Test__ZN3aaa9GG3323321E, "_ZN3aaa9GG3323321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323321C1Ev();
extern void _ZN3aaa9GG3323321D1Ev();
Name_Map name_map__ZN3aaa9GG3323321E[] = {
  NSPAIR(_ZN3aaa9GG3323321C1Ev),
  NSPAIR(_ZN3aaa9GG3323321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3323321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323321E[];
extern void _ZN3aaa9GG33233213fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233213fooEv,_ZThn8_N3aaa9GG33233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233213fooEv,_ZThn20_N3aaa9GG33233213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33233213fooEv,_ZThn28_N3aaa9GG33233213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33233213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233213fooEv,_ZThn8_N3aaa9GG33233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233213fooEv,_ZThn20_N3aaa9GG33233213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233213fooEv,_ZThn28_N3aaa9GG33233213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323321E[];
Class_Descriptor cd__ZN3aaa9GG3323321E = {  "_ZN3aaa9GG3323321E", // class name
  bases__ZN3aaa9GG3323321E, 6,
  &(vtc__ZN3aaa9GG3323321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323322  : ::aaa::EE332 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33233223barEv
  ~GG3323322(); // tgen
  GG3323322(); // tgen
};
//SIG(1 _ZN3aaa9GG3323322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33233223barEv");}
aaa::GG3323322 ::~GG3323322(){ note_dtor("_ZN3aaa9GG3323322E", this);} // tgen
aaa::GG3323322 ::GG3323322(){ note_ctor("_ZN3aaa9GG3323322E", this);} // tgen
}
static void Test__ZN3aaa9GG3323322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323322E, buf);
    ::aaa::GG3323322 *dp, &lv = *(dp=new (buf) ::aaa::GG3323322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323322E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3323322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3323322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3323322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323322E);
    dp->::aaa::GG3323322::~GG3323322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323322E(Test__ZN3aaa9GG3323322E, "_ZN3aaa9GG3323322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323322C1Ev();
extern void _ZN3aaa9GG3323322D1Ev();
Name_Map name_map__ZN3aaa9GG3323322E[] = {
  NSPAIR(_ZN3aaa9GG3323322C1Ev),
  NSPAIR(_ZN3aaa9GG3323322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3323322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323322E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33233223barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233223barEv,_ZThn8_N3aaa9GG33233223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33233223barEv,_ZThn20_N3aaa9GG33233223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33233223barEv,_ZThn28_N3aaa9GG33233223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33233223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233223barEv,_ZThn8_N3aaa9GG33233223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233223barEv,_ZThn20_N3aaa9GG33233223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233223barEv,_ZThn28_N3aaa9GG33233223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323322E[];
Class_Descriptor cd__ZN3aaa9GG3323322E = {  "_ZN3aaa9GG3323322E", // class name
  bases__ZN3aaa9GG3323322E, 6,
  &(vtc__ZN3aaa9GG3323322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323323  : ::aaa::EE332 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33233233fooEv
  virtual void  bar(); // _ZN3aaa9GG33233233barEv
  ~GG3323323(); // tgen
  GG3323323(); // tgen
};
//SIG(1 _ZN3aaa9GG3323323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33233233fooEv");}
void  aaa::GG3323323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33233233barEv");}
aaa::GG3323323 ::~GG3323323(){ note_dtor("_ZN3aaa9GG3323323E", this);} // tgen
aaa::GG3323323 ::GG3323323(){ note_ctor("_ZN3aaa9GG3323323E", this);} // tgen
}
static void Test__ZN3aaa9GG3323323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323323E, buf);
    ::aaa::GG3323323 *dp, &lv = *(dp=new (buf) ::aaa::GG3323323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323323E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3323323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3323323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3323323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323323E);
    dp->::aaa::GG3323323::~GG3323323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323323E(Test__ZN3aaa9GG3323323E, "_ZN3aaa9GG3323323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323323C1Ev();
extern void _ZN3aaa9GG3323323D1Ev();
Name_Map name_map__ZN3aaa9GG3323323E[] = {
  NSPAIR(_ZN3aaa9GG3323323C1Ev),
  NSPAIR(_ZN3aaa9GG3323323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3323323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323323E[];
extern void _ZN3aaa9GG33233233fooEv();
extern void _ZN3aaa9GG33233233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233233fooEv,_ZThn8_N3aaa9GG33233233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33233233barEv,_ZThn8_N3aaa9GG33233233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233233fooEv,_ZThn20_N3aaa9GG33233233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233233barEv,_ZThn20_N3aaa9GG33233233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33233233fooEv,_ZThn28_N3aaa9GG33233233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33233233barEv,_ZThn28_N3aaa9GG33233233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33233233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33233233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233233fooEv,_ZThn8_N3aaa9GG33233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233233barEv,_ZThn8_N3aaa9GG33233233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233233fooEv,_ZThn20_N3aaa9GG33233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233233barEv,_ZThn20_N3aaa9GG33233233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233233fooEv,_ZThn28_N3aaa9GG33233233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233233barEv,_ZThn28_N3aaa9GG33233233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323323E[];
Class_Descriptor cd__ZN3aaa9GG3323323E = {  "_ZN3aaa9GG3323323E", // class name
  bases__ZN3aaa9GG3323323E, 6,
  &(vtc__ZN3aaa9GG3323323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323331  : ::aaa::EE332 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33233313fooEv
  ~GG3323331(); // tgen
  GG3323331(); // tgen
};
//SIG(1 _ZN3aaa9GG3323331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33233313fooEv");}
aaa::GG3323331 ::~GG3323331(){ note_dtor("_ZN3aaa9GG3323331E", this);} // tgen
aaa::GG3323331 ::GG3323331(){ note_ctor("_ZN3aaa9GG3323331E", this);} // tgen
}
static void Test__ZN3aaa9GG3323331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323331E, buf);
    ::aaa::GG3323331 *dp, &lv = *(dp=new (buf) ::aaa::GG3323331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323331E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3323331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3323331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3323331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323331E);
    dp->::aaa::GG3323331::~GG3323331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323331E(Test__ZN3aaa9GG3323331E, "_ZN3aaa9GG3323331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323331C1Ev();
extern void _ZN3aaa9GG3323331D1Ev();
Name_Map name_map__ZN3aaa9GG3323331E[] = {
  NSPAIR(_ZN3aaa9GG3323331C1Ev),
  NSPAIR(_ZN3aaa9GG3323331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3323331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323331E[];
extern void _ZN3aaa9GG33233313fooEv();
extern void _ZN3aaa5EE3323barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233313fooEv,_ZThn8_N3aaa9GG33233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233313fooEv,_ZThn20_N3aaa9GG33233313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33233313fooEv,_ZThn28_N3aaa9GG33233313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33233313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233313fooEv,_ZThn8_N3aaa9GG33233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3323barEv,_ZThn8_N3aaa5EE3323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233313fooEv,_ZThn20_N3aaa9GG33233313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233313fooEv,_ZThn28_N3aaa9GG33233313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323331E[];
Class_Descriptor cd__ZN3aaa9GG3323331E = {  "_ZN3aaa9GG3323331E", // class name
  bases__ZN3aaa9GG3323331E, 6,
  &(vtc__ZN3aaa9GG3323331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323332  : ::aaa::EE332 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33233323barEv
  ~GG3323332(); // tgen
  GG3323332(); // tgen
};
//SIG(1 _ZN3aaa9GG3323332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v3 v1 Fi} v1 Fi} BC5{ BC3 BC4 v4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3323332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33233323barEv");}
aaa::GG3323332 ::~GG3323332(){ note_dtor("_ZN3aaa9GG3323332E", this);} // tgen
aaa::GG3323332 ::GG3323332(){ note_ctor("_ZN3aaa9GG3323332E", this);} // tgen
}
static void Test__ZN3aaa9GG3323332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323332E, buf);
    ::aaa::GG3323332 *dp, &lv = *(dp=new (buf) ::aaa::GG3323332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323332E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3323332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3323332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3323332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323332E);
    dp->::aaa::GG3323332::~GG3323332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323332E(Test__ZN3aaa9GG3323332E, "_ZN3aaa9GG3323332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323332C1Ev();
extern void _ZN3aaa9GG3323332D1Ev();
Name_Map name_map__ZN3aaa9GG3323332E[] = {
  NSPAIR(_ZN3aaa9GG3323332C1Ev),
  NSPAIR(_ZN3aaa9GG3323332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3323332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323332E[];
extern void _ZN3aaa3AA33fooEv();
extern void _ZN3aaa9GG33233323barEv();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233323barEv,_ZThn8_N3aaa9GG33233323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33233323barEv,_ZThn20_N3aaa9GG33233323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33233323barEv,_ZThn28_N3aaa9GG33233323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33233323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233323barEv,_ZThn8_N3aaa9GG33233323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233323barEv,_ZThn20_N3aaa9GG33233323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233323barEv,_ZThn28_N3aaa9GG33233323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323332E[];
Class_Descriptor cd__ZN3aaa9GG3323332E = {  "_ZN3aaa9GG3323332E", // class name
  bases__ZN3aaa9GG3323332E, 6,
  &(vtc__ZN3aaa9GG3323332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3323333  : ::aaa::EE332 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33233333fooEv
  virtual void  bar(); // _ZN3aaa9GG33233333barEv
  ~GG3323333(); // tgen
  GG3323333(); // tgen
};
//SIG(1 _ZN3aaa9GG3323333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3323333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33233333fooEv");}
void  aaa::GG3323333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33233333barEv");}
aaa::GG3323333 ::~GG3323333(){ note_dtor("_ZN3aaa9GG3323333E", this);} // tgen
aaa::GG3323333 ::GG3323333(){ note_ctor("_ZN3aaa9GG3323333E", this);} // tgen
}
static void Test__ZN3aaa9GG3323333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3323333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3323333E, buf);
    ::aaa::GG3323333 *dp, &lv = *(dp=new (buf) ::aaa::GG3323333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3323333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3323333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE332*), 0, "_ZN3aaa9GG3323333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE332*), ABISELECT(16,8), "_ZN3aaa9GG3323333E");
    check_base_class_offset(lv, (::aaa::EE332*), 0, "_ZN3aaa9GG3323333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3323333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3323333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3323333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3323333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3323333E);
    dp->::aaa::GG3323333::~GG3323333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3323333E(Test__ZN3aaa9GG3323333E, "_ZN3aaa9GG3323333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3323333C1Ev();
extern void _ZN3aaa9GG3323333D1Ev();
Name_Map name_map__ZN3aaa9GG3323333E[] = {
  NSPAIR(_ZN3aaa9GG3323333C1Ev),
  NSPAIR(_ZN3aaa9GG3323333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE332E;
extern VTBL_ENTRY _ZTIN3aaa5EE332E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE332E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3323333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE332E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3323333E[];
extern void _ZN3aaa9GG33233333fooEv();
extern void _ZN3aaa9GG33233333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33233333fooEv,_ZThn8_N3aaa9GG33233333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33233333barEv,_ZThn8_N3aaa9GG33233333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233333fooEv,_ZThn20_N3aaa9GG33233333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33233333barEv,_ZThn20_N3aaa9GG33233333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33233333fooEv,_ZThn28_N3aaa9GG33233333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33233333barEv,_ZThn28_N3aaa9GG33233333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3323333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33233333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33233333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233333fooEv,_ZThn8_N3aaa9GG33233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33233333barEv,_ZThn8_N3aaa9GG33233333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233333fooEv,_ZThn20_N3aaa9GG33233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33233333barEv,_ZThn20_N3aaa9GG33233333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3323333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233333fooEv,_ZThn28_N3aaa9GG33233333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33233333barEv,_ZThn28_N3aaa9GG33233333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3323333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3323333E[];
Class_Descriptor cd__ZN3aaa9GG3323333E = {  "_ZN3aaa9GG3323333E", // class name
  bases__ZN3aaa9GG3323333E, 6,
  &(vtc__ZN3aaa9GG3323333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3323333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3323333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331111  : ::aaa::EE333 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33311113fooEv
  ~GG3331111(); // tgen
  GG3331111(); // tgen
};
//SIG(1 _ZN3aaa9GG3331111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33311113fooEv");}
aaa::GG3331111 ::~GG3331111(){ note_dtor("_ZN3aaa9GG3331111E", this);} // tgen
aaa::GG3331111 ::GG3331111(){ note_ctor("_ZN3aaa9GG3331111E", this);} // tgen
}
static void Test__ZN3aaa9GG3331111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331111E, buf);
    ::aaa::GG3331111 *dp, &lv = *(dp=new (buf) ::aaa::GG3331111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331111E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331111E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3331111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3331111E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3331111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331111E);
    dp->::aaa::GG3331111::~GG3331111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331111E(Test__ZN3aaa9GG3331111E, "_ZN3aaa9GG3331111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331111C1Ev();
extern void _ZN3aaa9GG3331111D1Ev();
Name_Map name_map__ZN3aaa9GG3331111E[] = {
  NSPAIR(_ZN3aaa9GG3331111C1Ev),
  NSPAIR(_ZN3aaa9GG3331111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3331111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331111E[];
extern void _ZN3aaa9GG33311113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33311113fooEv,_ZThn8_N3aaa9GG33311113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33311113fooEv,_ZThn20_N3aaa9GG33311113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33311113fooEv,_ZThn28_N3aaa9GG33311113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33311113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311113fooEv,_ZThn8_N3aaa9GG33311113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311113fooEv,_ZThn20_N3aaa9GG33311113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33311113fooEv,_ZThn28_N3aaa9GG33311113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331111E[];
Class_Descriptor cd__ZN3aaa9GG3331111E = {  "_ZN3aaa9GG3331111E", // class name
  bases__ZN3aaa9GG3331111E, 6,
  &(vtc__ZN3aaa9GG3331111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331111E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331112  : ::aaa::EE333 , ::aaa::FF111 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33311123barEv
  ~GG3331112(); // tgen
  GG3331112(); // tgen
};
//SIG(1 _ZN3aaa9GG3331112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33311123barEv");}
aaa::GG3331112 ::~GG3331112(){ note_dtor("_ZN3aaa9GG3331112E", this);} // tgen
aaa::GG3331112 ::GG3331112(){ note_ctor("_ZN3aaa9GG3331112E", this);} // tgen
}
static void Test__ZN3aaa9GG3331112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331112E, buf);
    ::aaa::GG3331112 *dp, &lv = *(dp=new (buf) ::aaa::GG3331112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331112E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331112E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3331112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3331112E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3331112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331112E);
    dp->::aaa::GG3331112::~GG3331112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331112E(Test__ZN3aaa9GG3331112E, "_ZN3aaa9GG3331112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331112C1Ev();
extern void _ZN3aaa9GG3331112D1Ev();
Name_Map name_map__ZN3aaa9GG3331112E[] = {
  NSPAIR(_ZN3aaa9GG3331112C1Ev),
  NSPAIR(_ZN3aaa9GG3331112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3331112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331112E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33311123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33311123barEv,_ZThn8_N3aaa9GG33311123barEv)();
extern void _ZN3aaa5FF1113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33311123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311123barEv,_ZThn8_N3aaa9GG33311123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1113fooEv,_ZThn8_N3aaa5FF1113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331112E[];
Class_Descriptor cd__ZN3aaa9GG3331112E = {  "_ZN3aaa9GG3331112E", // class name
  bases__ZN3aaa9GG3331112E, 6,
  &(vtc__ZN3aaa9GG3331112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331112E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331113  : ::aaa::EE333 , ::aaa::FF111 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33311133fooEv
  virtual void  bar(); // _ZN3aaa9GG33311133barEv
  ~GG3331113(); // tgen
  GG3331113(); // tgen
};
//SIG(1 _ZN3aaa9GG3331113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33311133fooEv");}
void  aaa::GG3331113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33311133barEv");}
aaa::GG3331113 ::~GG3331113(){ note_dtor("_ZN3aaa9GG3331113E", this);} // tgen
aaa::GG3331113 ::GG3331113(){ note_ctor("_ZN3aaa9GG3331113E", this);} // tgen
}
static void Test__ZN3aaa9GG3331113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331113E, buf);
    ::aaa::GG3331113 *dp, &lv = *(dp=new (buf) ::aaa::GG3331113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331113E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331113E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3331113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF111*), ABISELECT(48,28), "_ZN3aaa9GG3331113E");
    check_base_class_offset(lv, (::aaa::FF111*), ABISELECT(32,20), "_ZN3aaa9GG3331113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331113E);
    dp->::aaa::GG3331113::~GG3331113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331113E(Test__ZN3aaa9GG3331113E, "_ZN3aaa9GG3331113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331113C1Ev();
extern void _ZN3aaa9GG3331113D1Ev();
Name_Map name_map__ZN3aaa9GG3331113E[] = {
  NSPAIR(_ZN3aaa9GG3331113C1Ev),
  NSPAIR(_ZN3aaa9GG3331113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF111E;
extern VTBL_ENTRY _ZTIN3aaa5FF111E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF111E[];
static Base_Class bases__ZN3aaa9GG3331113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF111E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331113E[];
extern void _ZN3aaa9GG33311133fooEv();
extern void _ZN3aaa9GG33311133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33311133fooEv,_ZThn8_N3aaa9GG33311133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33311133barEv,_ZThn8_N3aaa9GG33311133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33311133fooEv,_ZThn20_N3aaa9GG33311133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33311133fooEv,_ZThn28_N3aaa9GG33311133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33311133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33311133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311133fooEv,_ZThn8_N3aaa9GG33311133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311133barEv,_ZThn8_N3aaa9GG33311133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311133fooEv,_ZThn20_N3aaa9GG33311133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33311133fooEv,_ZThn28_N3aaa9GG33311133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331113E[];
Class_Descriptor cd__ZN3aaa9GG3331113E = {  "_ZN3aaa9GG3331113E", // class name
  bases__ZN3aaa9GG3331113E, 6,
  &(vtc__ZN3aaa9GG3331113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331113E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331121  : ::aaa::EE333 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33311213fooEv
  ~GG3331121(); // tgen
  GG3331121(); // tgen
};
//SIG(1 _ZN3aaa9GG3331121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33311213fooEv");}
aaa::GG3331121 ::~GG3331121(){ note_dtor("_ZN3aaa9GG3331121E", this);} // tgen
aaa::GG3331121 ::GG3331121(){ note_ctor("_ZN3aaa9GG3331121E", this);} // tgen
}
static void Test__ZN3aaa9GG3331121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331121E, buf);
    ::aaa::GG3331121 *dp, &lv = *(dp=new (buf) ::aaa::GG3331121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331121E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331121E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3331121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3331121E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3331121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331121E);
    dp->::aaa::GG3331121::~GG3331121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331121E(Test__ZN3aaa9GG3331121E, "_ZN3aaa9GG3331121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331121C1Ev();
extern void _ZN3aaa9GG3331121D1Ev();
Name_Map name_map__ZN3aaa9GG3331121E[] = {
  NSPAIR(_ZN3aaa9GG3331121C1Ev),
  NSPAIR(_ZN3aaa9GG3331121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3331121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331121E[];
extern void _ZN3aaa9GG33311213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33311213fooEv,_ZThn8_N3aaa9GG33311213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33311213fooEv,_ZThn20_N3aaa9GG33311213fooEv)();
extern void _ZN3aaa5FF1123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33311213fooEv,_ZThn28_N3aaa9GG33311213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33311213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311213fooEv,_ZThn8_N3aaa9GG33311213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311213fooEv,_ZThn20_N3aaa9GG33311213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33311213fooEv,_ZThn28_N3aaa9GG33311213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331121E[];
Class_Descriptor cd__ZN3aaa9GG3331121E = {  "_ZN3aaa9GG3331121E", // class name
  bases__ZN3aaa9GG3331121E, 6,
  &(vtc__ZN3aaa9GG3331121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331122  : ::aaa::EE333 , ::aaa::FF112 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33311223barEv
  ~GG3331122(); // tgen
  GG3331122(); // tgen
};
//SIG(1 _ZN3aaa9GG3331122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33311223barEv");}
aaa::GG3331122 ::~GG3331122(){ note_dtor("_ZN3aaa9GG3331122E", this);} // tgen
aaa::GG3331122 ::GG3331122(){ note_ctor("_ZN3aaa9GG3331122E", this);} // tgen
}
static void Test__ZN3aaa9GG3331122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331122E, buf);
    ::aaa::GG3331122 *dp, &lv = *(dp=new (buf) ::aaa::GG3331122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331122E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331122E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3331122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3331122E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3331122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331122E);
    dp->::aaa::GG3331122::~GG3331122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331122E(Test__ZN3aaa9GG3331122E, "_ZN3aaa9GG3331122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331122C1Ev();
extern void _ZN3aaa9GG3331122D1Ev();
Name_Map name_map__ZN3aaa9GG3331122E[] = {
  NSPAIR(_ZN3aaa9GG3331122C1Ev),
  NSPAIR(_ZN3aaa9GG3331122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3331122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331122E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33311223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33311223barEv,_ZThn8_N3aaa9GG33311223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33311223barEv,_ZThn20_N3aaa9GG33311223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33311223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311223barEv,_ZThn8_N3aaa9GG33311223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311223barEv,_ZThn20_N3aaa9GG33311223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331122E[];
Class_Descriptor cd__ZN3aaa9GG3331122E = {  "_ZN3aaa9GG3331122E", // class name
  bases__ZN3aaa9GG3331122E, 6,
  &(vtc__ZN3aaa9GG3331122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331123  : ::aaa::EE333 , ::aaa::FF112 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33311233fooEv
  virtual void  bar(); // _ZN3aaa9GG33311233barEv
  ~GG3331123(); // tgen
  GG3331123(); // tgen
};
//SIG(1 _ZN3aaa9GG3331123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33311233fooEv");}
void  aaa::GG3331123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33311233barEv");}
aaa::GG3331123 ::~GG3331123(){ note_dtor("_ZN3aaa9GG3331123E", this);} // tgen
aaa::GG3331123 ::GG3331123(){ note_ctor("_ZN3aaa9GG3331123E", this);} // tgen
}
static void Test__ZN3aaa9GG3331123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331123E, buf);
    ::aaa::GG3331123 *dp, &lv = *(dp=new (buf) ::aaa::GG3331123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331123E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331123E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3331123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF112*), ABISELECT(48,28), "_ZN3aaa9GG3331123E");
    check_base_class_offset(lv, (::aaa::FF112*), ABISELECT(32,20), "_ZN3aaa9GG3331123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331123E);
    dp->::aaa::GG3331123::~GG3331123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331123E(Test__ZN3aaa9GG3331123E, "_ZN3aaa9GG3331123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331123C1Ev();
extern void _ZN3aaa9GG3331123D1Ev();
Name_Map name_map__ZN3aaa9GG3331123E[] = {
  NSPAIR(_ZN3aaa9GG3331123C1Ev),
  NSPAIR(_ZN3aaa9GG3331123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF112E;
extern VTBL_ENTRY _ZTIN3aaa5FF112E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF112E[];
static Base_Class bases__ZN3aaa9GG3331123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF112E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331123E[];
extern void _ZN3aaa9GG33311233fooEv();
extern void _ZN3aaa9GG33311233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33311233fooEv,_ZThn8_N3aaa9GG33311233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33311233barEv,_ZThn8_N3aaa9GG33311233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33311233fooEv,_ZThn20_N3aaa9GG33311233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33311233barEv,_ZThn20_N3aaa9GG33311233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33311233fooEv,_ZThn28_N3aaa9GG33311233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33311233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33311233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311233fooEv,_ZThn8_N3aaa9GG33311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311233barEv,_ZThn8_N3aaa9GG33311233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311233fooEv,_ZThn20_N3aaa9GG33311233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311233barEv,_ZThn20_N3aaa9GG33311233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33311233fooEv,_ZThn28_N3aaa9GG33311233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331123E[];
Class_Descriptor cd__ZN3aaa9GG3331123E = {  "_ZN3aaa9GG3331123E", // class name
  bases__ZN3aaa9GG3331123E, 6,
  &(vtc__ZN3aaa9GG3331123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331131  : ::aaa::EE333 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33311313fooEv
  ~GG3331131(); // tgen
  GG3331131(); // tgen
};
//SIG(1 _ZN3aaa9GG3331131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33311313fooEv");}
aaa::GG3331131 ::~GG3331131(){ note_dtor("_ZN3aaa9GG3331131E", this);} // tgen
aaa::GG3331131 ::GG3331131(){ note_ctor("_ZN3aaa9GG3331131E", this);} // tgen
}
static void Test__ZN3aaa9GG3331131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331131E, buf);
    ::aaa::GG3331131 *dp, &lv = *(dp=new (buf) ::aaa::GG3331131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331131E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331131E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3331131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3331131E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3331131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331131E);
    dp->::aaa::GG3331131::~GG3331131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331131E(Test__ZN3aaa9GG3331131E, "_ZN3aaa9GG3331131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331131C1Ev();
extern void _ZN3aaa9GG3331131D1Ev();
Name_Map name_map__ZN3aaa9GG3331131E[] = {
  NSPAIR(_ZN3aaa9GG3331131C1Ev),
  NSPAIR(_ZN3aaa9GG3331131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3331131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331131E[];
extern void _ZN3aaa9GG33311313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33311313fooEv,_ZThn8_N3aaa9GG33311313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33311313fooEv,_ZThn20_N3aaa9GG33311313fooEv)();
extern void _ZN3aaa5FF1133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33311313fooEv,_ZThn28_N3aaa9GG33311313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33311313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311313fooEv,_ZThn8_N3aaa9GG33311313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311313fooEv,_ZThn20_N3aaa9GG33311313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33311313fooEv,_ZThn28_N3aaa9GG33311313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331131E[];
Class_Descriptor cd__ZN3aaa9GG3331131E = {  "_ZN3aaa9GG3331131E", // class name
  bases__ZN3aaa9GG3331131E, 6,
  &(vtc__ZN3aaa9GG3331131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331132  : ::aaa::EE333 , ::aaa::FF113 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33311323barEv
  ~GG3331132(); // tgen
  GG3331132(); // tgen
};
//SIG(1 _ZN3aaa9GG3331132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33311323barEv");}
aaa::GG3331132 ::~GG3331132(){ note_dtor("_ZN3aaa9GG3331132E", this);} // tgen
aaa::GG3331132 ::GG3331132(){ note_ctor("_ZN3aaa9GG3331132E", this);} // tgen
}
static void Test__ZN3aaa9GG3331132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331132E, buf);
    ::aaa::GG3331132 *dp, &lv = *(dp=new (buf) ::aaa::GG3331132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331132E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331132E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3331132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3331132E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3331132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331132E);
    dp->::aaa::GG3331132::~GG3331132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331132E(Test__ZN3aaa9GG3331132E, "_ZN3aaa9GG3331132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331132C1Ev();
extern void _ZN3aaa9GG3331132D1Ev();
Name_Map name_map__ZN3aaa9GG3331132E[] = {
  NSPAIR(_ZN3aaa9GG3331132C1Ev),
  NSPAIR(_ZN3aaa9GG3331132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3331132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331132E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33311323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33311323barEv,_ZThn8_N3aaa9GG33311323barEv)();
extern void _ZN3aaa5FF1133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33311323barEv,_ZThn20_N3aaa9GG33311323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33311323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311323barEv,_ZThn8_N3aaa9GG33311323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311323barEv,_ZThn20_N3aaa9GG33311323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1133fooEv,_ZThn8_N3aaa5FF1133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331132E[];
Class_Descriptor cd__ZN3aaa9GG3331132E = {  "_ZN3aaa9GG3331132E", // class name
  bases__ZN3aaa9GG3331132E, 6,
  &(vtc__ZN3aaa9GG3331132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331133  : ::aaa::EE333 , ::aaa::FF113 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33311333fooEv
  virtual void  bar(); // _ZN3aaa9GG33311333barEv
  ~GG3331133(); // tgen
  GG3331133(); // tgen
};
//SIG(1 _ZN3aaa9GG3331133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33311333fooEv");}
void  aaa::GG3331133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33311333barEv");}
aaa::GG3331133 ::~GG3331133(){ note_dtor("_ZN3aaa9GG3331133E", this);} // tgen
aaa::GG3331133 ::GG3331133(){ note_ctor("_ZN3aaa9GG3331133E", this);} // tgen
}
static void Test__ZN3aaa9GG3331133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331133E, buf);
    ::aaa::GG3331133 *dp, &lv = *(dp=new (buf) ::aaa::GG3331133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331133E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331133E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3331133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF113*), ABISELECT(48,28), "_ZN3aaa9GG3331133E");
    check_base_class_offset(lv, (::aaa::FF113*), ABISELECT(32,20), "_ZN3aaa9GG3331133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331133E);
    dp->::aaa::GG3331133::~GG3331133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331133E(Test__ZN3aaa9GG3331133E, "_ZN3aaa9GG3331133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331133C1Ev();
extern void _ZN3aaa9GG3331133D1Ev();
Name_Map name_map__ZN3aaa9GG3331133E[] = {
  NSPAIR(_ZN3aaa9GG3331133C1Ev),
  NSPAIR(_ZN3aaa9GG3331133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF113E;
extern VTBL_ENTRY _ZTIN3aaa5FF113E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF113E[];
static Base_Class bases__ZN3aaa9GG3331133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF113E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331133E[];
extern void _ZN3aaa9GG33311333fooEv();
extern void _ZN3aaa9GG33311333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33311333fooEv,_ZThn8_N3aaa9GG33311333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33311333barEv,_ZThn8_N3aaa9GG33311333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33311333fooEv,_ZThn20_N3aaa9GG33311333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33311333barEv,_ZThn20_N3aaa9GG33311333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33311333fooEv,_ZThn28_N3aaa9GG33311333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33311333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33311333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311333fooEv,_ZThn8_N3aaa9GG33311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33311333barEv,_ZThn8_N3aaa9GG33311333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311333fooEv,_ZThn20_N3aaa9GG33311333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33311333barEv,_ZThn20_N3aaa9GG33311333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33311333fooEv,_ZThn28_N3aaa9GG33311333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331133E[];
Class_Descriptor cd__ZN3aaa9GG3331133E = {  "_ZN3aaa9GG3331133E", // class name
  bases__ZN3aaa9GG3331133E, 6,
  &(vtc__ZN3aaa9GG3331133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331211  : ::aaa::EE333 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33312113fooEv
  ~GG3331211(); // tgen
  GG3331211(); // tgen
};
//SIG(1 _ZN3aaa9GG3331211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33312113fooEv");}
aaa::GG3331211 ::~GG3331211(){ note_dtor("_ZN3aaa9GG3331211E", this);} // tgen
aaa::GG3331211 ::GG3331211(){ note_ctor("_ZN3aaa9GG3331211E", this);} // tgen
}
static void Test__ZN3aaa9GG3331211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331211E, buf);
    ::aaa::GG3331211 *dp, &lv = *(dp=new (buf) ::aaa::GG3331211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331211E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331211E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3331211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3331211E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3331211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331211E);
    dp->::aaa::GG3331211::~GG3331211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331211E(Test__ZN3aaa9GG3331211E, "_ZN3aaa9GG3331211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331211C1Ev();
extern void _ZN3aaa9GG3331211D1Ev();
Name_Map name_map__ZN3aaa9GG3331211E[] = {
  NSPAIR(_ZN3aaa9GG3331211C1Ev),
  NSPAIR(_ZN3aaa9GG3331211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3331211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331211E[];
extern void _ZN3aaa9GG33312113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33312113fooEv,_ZThn8_N3aaa9GG33312113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33312113fooEv,_ZThn20_N3aaa9GG33312113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33312113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312113fooEv,_ZThn8_N3aaa9GG33312113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312113fooEv,_ZThn20_N3aaa9GG33312113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331211E[];
Class_Descriptor cd__ZN3aaa9GG3331211E = {  "_ZN3aaa9GG3331211E", // class name
  bases__ZN3aaa9GG3331211E, 6,
  &(vtc__ZN3aaa9GG3331211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331211E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331212  : ::aaa::EE333 , ::aaa::FF121 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33312123barEv
  ~GG3331212(); // tgen
  GG3331212(); // tgen
};
//SIG(1 _ZN3aaa9GG3331212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33312123barEv");}
aaa::GG3331212 ::~GG3331212(){ note_dtor("_ZN3aaa9GG3331212E", this);} // tgen
aaa::GG3331212 ::GG3331212(){ note_ctor("_ZN3aaa9GG3331212E", this);} // tgen
}
static void Test__ZN3aaa9GG3331212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331212E, buf);
    ::aaa::GG3331212 *dp, &lv = *(dp=new (buf) ::aaa::GG3331212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331212E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331212E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3331212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3331212E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3331212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331212E);
    dp->::aaa::GG3331212::~GG3331212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331212E(Test__ZN3aaa9GG3331212E, "_ZN3aaa9GG3331212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331212C1Ev();
extern void _ZN3aaa9GG3331212D1Ev();
Name_Map name_map__ZN3aaa9GG3331212E[] = {
  NSPAIR(_ZN3aaa9GG3331212C1Ev),
  NSPAIR(_ZN3aaa9GG3331212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3331212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331212E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33312123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33312123barEv,_ZThn8_N3aaa9GG33312123barEv)();
extern void _ZN3aaa5FF1213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33312123barEv,_ZThn28_N3aaa9GG33312123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33312123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312123barEv,_ZThn8_N3aaa9GG33312123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33312123barEv,_ZThn28_N3aaa9GG33312123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331212E[];
Class_Descriptor cd__ZN3aaa9GG3331212E = {  "_ZN3aaa9GG3331212E", // class name
  bases__ZN3aaa9GG3331212E, 6,
  &(vtc__ZN3aaa9GG3331212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331212E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331213  : ::aaa::EE333 , ::aaa::FF121 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33312133fooEv
  virtual void  bar(); // _ZN3aaa9GG33312133barEv
  ~GG3331213(); // tgen
  GG3331213(); // tgen
};
//SIG(1 _ZN3aaa9GG3331213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33312133fooEv");}
void  aaa::GG3331213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33312133barEv");}
aaa::GG3331213 ::~GG3331213(){ note_dtor("_ZN3aaa9GG3331213E", this);} // tgen
aaa::GG3331213 ::GG3331213(){ note_ctor("_ZN3aaa9GG3331213E", this);} // tgen
}
static void Test__ZN3aaa9GG3331213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331213E, buf);
    ::aaa::GG3331213 *dp, &lv = *(dp=new (buf) ::aaa::GG3331213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331213E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331213E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3331213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF121*), ABISELECT(48,28), "_ZN3aaa9GG3331213E");
    check_base_class_offset(lv, (::aaa::FF121*), ABISELECT(32,20), "_ZN3aaa9GG3331213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331213E);
    dp->::aaa::GG3331213::~GG3331213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331213E(Test__ZN3aaa9GG3331213E, "_ZN3aaa9GG3331213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331213C1Ev();
extern void _ZN3aaa9GG3331213D1Ev();
Name_Map name_map__ZN3aaa9GG3331213E[] = {
  NSPAIR(_ZN3aaa9GG3331213C1Ev),
  NSPAIR(_ZN3aaa9GG3331213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF121E;
extern VTBL_ENTRY _ZTIN3aaa5FF121E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF121E[];
static Base_Class bases__ZN3aaa9GG3331213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF121E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331213E[];
extern void _ZN3aaa9GG33312133fooEv();
extern void _ZN3aaa9GG33312133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33312133fooEv,_ZThn8_N3aaa9GG33312133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33312133barEv,_ZThn8_N3aaa9GG33312133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33312133fooEv,_ZThn20_N3aaa9GG33312133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33312133barEv,_ZThn28_N3aaa9GG33312133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33312133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33312133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312133fooEv,_ZThn8_N3aaa9GG33312133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312133barEv,_ZThn8_N3aaa9GG33312133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312133fooEv,_ZThn20_N3aaa9GG33312133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33312133barEv,_ZThn28_N3aaa9GG33312133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331213E[];
Class_Descriptor cd__ZN3aaa9GG3331213E = {  "_ZN3aaa9GG3331213E", // class name
  bases__ZN3aaa9GG3331213E, 6,
  &(vtc__ZN3aaa9GG3331213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331213E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331221  : ::aaa::EE333 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33312213fooEv
  ~GG3331221(); // tgen
  GG3331221(); // tgen
};
//SIG(1 _ZN3aaa9GG3331221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33312213fooEv");}
aaa::GG3331221 ::~GG3331221(){ note_dtor("_ZN3aaa9GG3331221E", this);} // tgen
aaa::GG3331221 ::GG3331221(){ note_ctor("_ZN3aaa9GG3331221E", this);} // tgen
}
static void Test__ZN3aaa9GG3331221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331221E, buf);
    ::aaa::GG3331221 *dp, &lv = *(dp=new (buf) ::aaa::GG3331221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331221E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331221E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3331221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3331221E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3331221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331221E);
    dp->::aaa::GG3331221::~GG3331221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331221E(Test__ZN3aaa9GG3331221E, "_ZN3aaa9GG3331221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331221C1Ev();
extern void _ZN3aaa9GG3331221D1Ev();
Name_Map name_map__ZN3aaa9GG3331221E[] = {
  NSPAIR(_ZN3aaa9GG3331221C1Ev),
  NSPAIR(_ZN3aaa9GG3331221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3331221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331221E[];
extern void _ZN3aaa9GG33312213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33312213fooEv,_ZThn8_N3aaa9GG33312213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33312213fooEv,_ZThn20_N3aaa9GG33312213fooEv)();
extern void _ZN3aaa5FF1223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33312213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312213fooEv,_ZThn8_N3aaa9GG33312213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312213fooEv,_ZThn20_N3aaa9GG33312213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1223barEv,_ZThn8_N3aaa5FF1223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331221E[];
Class_Descriptor cd__ZN3aaa9GG3331221E = {  "_ZN3aaa9GG3331221E", // class name
  bases__ZN3aaa9GG3331221E, 6,
  &(vtc__ZN3aaa9GG3331221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331222  : ::aaa::EE333 , ::aaa::FF122 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33312223barEv
  ~GG3331222(); // tgen
  GG3331222(); // tgen
};
//SIG(1 _ZN3aaa9GG3331222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33312223barEv");}
aaa::GG3331222 ::~GG3331222(){ note_dtor("_ZN3aaa9GG3331222E", this);} // tgen
aaa::GG3331222 ::GG3331222(){ note_ctor("_ZN3aaa9GG3331222E", this);} // tgen
}
static void Test__ZN3aaa9GG3331222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331222E, buf);
    ::aaa::GG3331222 *dp, &lv = *(dp=new (buf) ::aaa::GG3331222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331222E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331222E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3331222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3331222E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3331222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331222E);
    dp->::aaa::GG3331222::~GG3331222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331222E(Test__ZN3aaa9GG3331222E, "_ZN3aaa9GG3331222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331222C1Ev();
extern void _ZN3aaa9GG3331222D1Ev();
Name_Map name_map__ZN3aaa9GG3331222E[] = {
  NSPAIR(_ZN3aaa9GG3331222C1Ev),
  NSPAIR(_ZN3aaa9GG3331222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3331222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331222E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33312223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33312223barEv,_ZThn8_N3aaa9GG33312223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33312223barEv,_ZThn20_N3aaa9GG33312223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33312223barEv,_ZThn28_N3aaa9GG33312223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33312223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312223barEv,_ZThn8_N3aaa9GG33312223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312223barEv,_ZThn20_N3aaa9GG33312223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33312223barEv,_ZThn28_N3aaa9GG33312223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331222E[];
Class_Descriptor cd__ZN3aaa9GG3331222E = {  "_ZN3aaa9GG3331222E", // class name
  bases__ZN3aaa9GG3331222E, 6,
  &(vtc__ZN3aaa9GG3331222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331223  : ::aaa::EE333 , ::aaa::FF122 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33312233fooEv
  virtual void  bar(); // _ZN3aaa9GG33312233barEv
  ~GG3331223(); // tgen
  GG3331223(); // tgen
};
//SIG(1 _ZN3aaa9GG3331223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33312233fooEv");}
void  aaa::GG3331223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33312233barEv");}
aaa::GG3331223 ::~GG3331223(){ note_dtor("_ZN3aaa9GG3331223E", this);} // tgen
aaa::GG3331223 ::GG3331223(){ note_ctor("_ZN3aaa9GG3331223E", this);} // tgen
}
static void Test__ZN3aaa9GG3331223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331223E, buf);
    ::aaa::GG3331223 *dp, &lv = *(dp=new (buf) ::aaa::GG3331223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331223E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331223E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3331223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF122*), ABISELECT(48,28), "_ZN3aaa9GG3331223E");
    check_base_class_offset(lv, (::aaa::FF122*), ABISELECT(32,20), "_ZN3aaa9GG3331223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331223E);
    dp->::aaa::GG3331223::~GG3331223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331223E(Test__ZN3aaa9GG3331223E, "_ZN3aaa9GG3331223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331223C1Ev();
extern void _ZN3aaa9GG3331223D1Ev();
Name_Map name_map__ZN3aaa9GG3331223E[] = {
  NSPAIR(_ZN3aaa9GG3331223C1Ev),
  NSPAIR(_ZN3aaa9GG3331223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF122E;
extern VTBL_ENTRY _ZTIN3aaa5FF122E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF122E[];
static Base_Class bases__ZN3aaa9GG3331223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF122E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331223E[];
extern void _ZN3aaa9GG33312233fooEv();
extern void _ZN3aaa9GG33312233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33312233fooEv,_ZThn8_N3aaa9GG33312233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33312233barEv,_ZThn8_N3aaa9GG33312233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33312233fooEv,_ZThn20_N3aaa9GG33312233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33312233barEv,_ZThn20_N3aaa9GG33312233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33312233barEv,_ZThn28_N3aaa9GG33312233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33312233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33312233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312233fooEv,_ZThn8_N3aaa9GG33312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312233barEv,_ZThn8_N3aaa9GG33312233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312233fooEv,_ZThn20_N3aaa9GG33312233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312233barEv,_ZThn20_N3aaa9GG33312233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33312233barEv,_ZThn28_N3aaa9GG33312233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331223E[];
Class_Descriptor cd__ZN3aaa9GG3331223E = {  "_ZN3aaa9GG3331223E", // class name
  bases__ZN3aaa9GG3331223E, 6,
  &(vtc__ZN3aaa9GG3331223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331231  : ::aaa::EE333 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33312313fooEv
  ~GG3331231(); // tgen
  GG3331231(); // tgen
};
//SIG(1 _ZN3aaa9GG3331231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33312313fooEv");}
aaa::GG3331231 ::~GG3331231(){ note_dtor("_ZN3aaa9GG3331231E", this);} // tgen
aaa::GG3331231 ::GG3331231(){ note_ctor("_ZN3aaa9GG3331231E", this);} // tgen
}
static void Test__ZN3aaa9GG3331231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331231E, buf);
    ::aaa::GG3331231 *dp, &lv = *(dp=new (buf) ::aaa::GG3331231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331231E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331231E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3331231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3331231E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3331231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331231E);
    dp->::aaa::GG3331231::~GG3331231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331231E(Test__ZN3aaa9GG3331231E, "_ZN3aaa9GG3331231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331231C1Ev();
extern void _ZN3aaa9GG3331231D1Ev();
Name_Map name_map__ZN3aaa9GG3331231E[] = {
  NSPAIR(_ZN3aaa9GG3331231C1Ev),
  NSPAIR(_ZN3aaa9GG3331231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3331231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331231E[];
extern void _ZN3aaa9GG33312313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33312313fooEv,_ZThn8_N3aaa9GG33312313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33312313fooEv,_ZThn20_N3aaa9GG33312313fooEv)();
extern void _ZN3aaa5FF1233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33312313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312313fooEv,_ZThn8_N3aaa9GG33312313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312313fooEv,_ZThn20_N3aaa9GG33312313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1233barEv,_ZThn8_N3aaa5FF1233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331231E[];
Class_Descriptor cd__ZN3aaa9GG3331231E = {  "_ZN3aaa9GG3331231E", // class name
  bases__ZN3aaa9GG3331231E, 6,
  &(vtc__ZN3aaa9GG3331231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331232  : ::aaa::EE333 , ::aaa::FF123 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33312323barEv
  ~GG3331232(); // tgen
  GG3331232(); // tgen
};
//SIG(1 _ZN3aaa9GG3331232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33312323barEv");}
aaa::GG3331232 ::~GG3331232(){ note_dtor("_ZN3aaa9GG3331232E", this);} // tgen
aaa::GG3331232 ::GG3331232(){ note_ctor("_ZN3aaa9GG3331232E", this);} // tgen
}
static void Test__ZN3aaa9GG3331232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331232E, buf);
    ::aaa::GG3331232 *dp, &lv = *(dp=new (buf) ::aaa::GG3331232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331232E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331232E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3331232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3331232E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3331232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331232E);
    dp->::aaa::GG3331232::~GG3331232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331232E(Test__ZN3aaa9GG3331232E, "_ZN3aaa9GG3331232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331232C1Ev();
extern void _ZN3aaa9GG3331232D1Ev();
Name_Map name_map__ZN3aaa9GG3331232E[] = {
  NSPAIR(_ZN3aaa9GG3331232C1Ev),
  NSPAIR(_ZN3aaa9GG3331232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3331232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331232E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33312323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33312323barEv,_ZThn8_N3aaa9GG33312323barEv)();
extern void _ZN3aaa5FF1233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33312323barEv,_ZThn20_N3aaa9GG33312323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33312323barEv,_ZThn28_N3aaa9GG33312323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33312323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312323barEv,_ZThn8_N3aaa9GG33312323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312323barEv,_ZThn20_N3aaa9GG33312323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33312323barEv,_ZThn28_N3aaa9GG33312323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331232E[];
Class_Descriptor cd__ZN3aaa9GG3331232E = {  "_ZN3aaa9GG3331232E", // class name
  bases__ZN3aaa9GG3331232E, 6,
  &(vtc__ZN3aaa9GG3331232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331233  : ::aaa::EE333 , ::aaa::FF123 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33312333fooEv
  virtual void  bar(); // _ZN3aaa9GG33312333barEv
  ~GG3331233(); // tgen
  GG3331233(); // tgen
};
//SIG(1 _ZN3aaa9GG3331233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33312333fooEv");}
void  aaa::GG3331233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33312333barEv");}
aaa::GG3331233 ::~GG3331233(){ note_dtor("_ZN3aaa9GG3331233E", this);} // tgen
aaa::GG3331233 ::GG3331233(){ note_ctor("_ZN3aaa9GG3331233E", this);} // tgen
}
static void Test__ZN3aaa9GG3331233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331233E, buf);
    ::aaa::GG3331233 *dp, &lv = *(dp=new (buf) ::aaa::GG3331233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331233E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331233E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3331233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF123*), ABISELECT(48,28), "_ZN3aaa9GG3331233E");
    check_base_class_offset(lv, (::aaa::FF123*), ABISELECT(32,20), "_ZN3aaa9GG3331233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331233E);
    dp->::aaa::GG3331233::~GG3331233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331233E(Test__ZN3aaa9GG3331233E, "_ZN3aaa9GG3331233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331233C1Ev();
extern void _ZN3aaa9GG3331233D1Ev();
Name_Map name_map__ZN3aaa9GG3331233E[] = {
  NSPAIR(_ZN3aaa9GG3331233C1Ev),
  NSPAIR(_ZN3aaa9GG3331233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF123E;
extern VTBL_ENTRY _ZTIN3aaa5FF123E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF123E[];
static Base_Class bases__ZN3aaa9GG3331233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF123E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331233E[];
extern void _ZN3aaa9GG33312333fooEv();
extern void _ZN3aaa9GG33312333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33312333fooEv,_ZThn8_N3aaa9GG33312333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33312333barEv,_ZThn8_N3aaa9GG33312333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33312333fooEv,_ZThn20_N3aaa9GG33312333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33312333barEv,_ZThn20_N3aaa9GG33312333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33312333barEv,_ZThn28_N3aaa9GG33312333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33312333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33312333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312333fooEv,_ZThn8_N3aaa9GG33312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33312333barEv,_ZThn8_N3aaa9GG33312333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312333fooEv,_ZThn20_N3aaa9GG33312333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33312333barEv,_ZThn20_N3aaa9GG33312333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33312333barEv,_ZThn28_N3aaa9GG33312333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331233E[];
Class_Descriptor cd__ZN3aaa9GG3331233E = {  "_ZN3aaa9GG3331233E", // class name
  bases__ZN3aaa9GG3331233E, 6,
  &(vtc__ZN3aaa9GG3331233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331311  : ::aaa::EE333 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33313113fooEv
  ~GG3331311(); // tgen
  GG3331311(); // tgen
};
//SIG(1 _ZN3aaa9GG3331311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33313113fooEv");}
aaa::GG3331311 ::~GG3331311(){ note_dtor("_ZN3aaa9GG3331311E", this);} // tgen
aaa::GG3331311 ::GG3331311(){ note_ctor("_ZN3aaa9GG3331311E", this);} // tgen
}
static void Test__ZN3aaa9GG3331311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331311E, buf);
    ::aaa::GG3331311 *dp, &lv = *(dp=new (buf) ::aaa::GG3331311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331311E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331311E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3331311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3331311E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3331311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331311E);
    dp->::aaa::GG3331311::~GG3331311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331311E(Test__ZN3aaa9GG3331311E, "_ZN3aaa9GG3331311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331311C1Ev();
extern void _ZN3aaa9GG3331311D1Ev();
Name_Map name_map__ZN3aaa9GG3331311E[] = {
  NSPAIR(_ZN3aaa9GG3331311C1Ev),
  NSPAIR(_ZN3aaa9GG3331311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3331311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331311E[];
extern void _ZN3aaa9GG33313113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33313113fooEv,_ZThn8_N3aaa9GG33313113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33313113fooEv,_ZThn20_N3aaa9GG33313113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313113fooEv,_ZThn28_N3aaa9GG33313113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33313113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313113fooEv,_ZThn8_N3aaa9GG33313113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313113fooEv,_ZThn20_N3aaa9GG33313113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313113fooEv,_ZThn28_N3aaa9GG33313113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331311E[];
Class_Descriptor cd__ZN3aaa9GG3331311E = {  "_ZN3aaa9GG3331311E", // class name
  bases__ZN3aaa9GG3331311E, 6,
  &(vtc__ZN3aaa9GG3331311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331311E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331312  : ::aaa::EE333 , ::aaa::FF131 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33313123barEv
  ~GG3331312(); // tgen
  GG3331312(); // tgen
};
//SIG(1 _ZN3aaa9GG3331312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33313123barEv");}
aaa::GG3331312 ::~GG3331312(){ note_dtor("_ZN3aaa9GG3331312E", this);} // tgen
aaa::GG3331312 ::GG3331312(){ note_ctor("_ZN3aaa9GG3331312E", this);} // tgen
}
static void Test__ZN3aaa9GG3331312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331312E, buf);
    ::aaa::GG3331312 *dp, &lv = *(dp=new (buf) ::aaa::GG3331312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331312E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331312E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3331312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3331312E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3331312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331312E);
    dp->::aaa::GG3331312::~GG3331312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331312E(Test__ZN3aaa9GG3331312E, "_ZN3aaa9GG3331312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331312C1Ev();
extern void _ZN3aaa9GG3331312D1Ev();
Name_Map name_map__ZN3aaa9GG3331312E[] = {
  NSPAIR(_ZN3aaa9GG3331312C1Ev),
  NSPAIR(_ZN3aaa9GG3331312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3331312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331312E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33313123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33313123barEv,_ZThn8_N3aaa9GG33313123barEv)();
extern void _ZN3aaa5FF1313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313123barEv,_ZThn28_N3aaa9GG33313123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33313123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313123barEv,_ZThn8_N3aaa9GG33313123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1313fooEv,_ZThn8_N3aaa5FF1313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313123barEv,_ZThn28_N3aaa9GG33313123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331312E[];
Class_Descriptor cd__ZN3aaa9GG3331312E = {  "_ZN3aaa9GG3331312E", // class name
  bases__ZN3aaa9GG3331312E, 6,
  &(vtc__ZN3aaa9GG3331312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331312E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331313  : ::aaa::EE333 , ::aaa::FF131 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33313133fooEv
  virtual void  bar(); // _ZN3aaa9GG33313133barEv
  ~GG3331313(); // tgen
  GG3331313(); // tgen
};
//SIG(1 _ZN3aaa9GG3331313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33313133fooEv");}
void  aaa::GG3331313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33313133barEv");}
aaa::GG3331313 ::~GG3331313(){ note_dtor("_ZN3aaa9GG3331313E", this);} // tgen
aaa::GG3331313 ::GG3331313(){ note_ctor("_ZN3aaa9GG3331313E", this);} // tgen
}
static void Test__ZN3aaa9GG3331313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331313E, buf);
    ::aaa::GG3331313 *dp, &lv = *(dp=new (buf) ::aaa::GG3331313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331313E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331313E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3331313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF131*), ABISELECT(48,28), "_ZN3aaa9GG3331313E");
    check_base_class_offset(lv, (::aaa::FF131*), ABISELECT(32,20), "_ZN3aaa9GG3331313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331313E);
    dp->::aaa::GG3331313::~GG3331313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331313E(Test__ZN3aaa9GG3331313E, "_ZN3aaa9GG3331313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331313C1Ev();
extern void _ZN3aaa9GG3331313D1Ev();
Name_Map name_map__ZN3aaa9GG3331313E[] = {
  NSPAIR(_ZN3aaa9GG3331313C1Ev),
  NSPAIR(_ZN3aaa9GG3331313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF131E;
extern VTBL_ENTRY _ZTIN3aaa5FF131E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF131E[];
static Base_Class bases__ZN3aaa9GG3331313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF131E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331313E[];
extern void _ZN3aaa9GG33313133fooEv();
extern void _ZN3aaa9GG33313133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33313133fooEv,_ZThn8_N3aaa9GG33313133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33313133barEv,_ZThn8_N3aaa9GG33313133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33313133fooEv,_ZThn20_N3aaa9GG33313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313133fooEv,_ZThn28_N3aaa9GG33313133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313133barEv,_ZThn28_N3aaa9GG33313133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33313133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33313133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313133fooEv,_ZThn8_N3aaa9GG33313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313133barEv,_ZThn8_N3aaa9GG33313133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313133fooEv,_ZThn20_N3aaa9GG33313133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313133fooEv,_ZThn28_N3aaa9GG33313133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313133barEv,_ZThn28_N3aaa9GG33313133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331313E[];
Class_Descriptor cd__ZN3aaa9GG3331313E = {  "_ZN3aaa9GG3331313E", // class name
  bases__ZN3aaa9GG3331313E, 6,
  &(vtc__ZN3aaa9GG3331313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331313E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331321  : ::aaa::EE333 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33313213fooEv
  ~GG3331321(); // tgen
  GG3331321(); // tgen
};
//SIG(1 _ZN3aaa9GG3331321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33313213fooEv");}
aaa::GG3331321 ::~GG3331321(){ note_dtor("_ZN3aaa9GG3331321E", this);} // tgen
aaa::GG3331321 ::GG3331321(){ note_ctor("_ZN3aaa9GG3331321E", this);} // tgen
}
static void Test__ZN3aaa9GG3331321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331321E, buf);
    ::aaa::GG3331321 *dp, &lv = *(dp=new (buf) ::aaa::GG3331321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331321E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331321E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3331321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3331321E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3331321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331321E);
    dp->::aaa::GG3331321::~GG3331321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331321E(Test__ZN3aaa9GG3331321E, "_ZN3aaa9GG3331321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331321C1Ev();
extern void _ZN3aaa9GG3331321D1Ev();
Name_Map name_map__ZN3aaa9GG3331321E[] = {
  NSPAIR(_ZN3aaa9GG3331321C1Ev),
  NSPAIR(_ZN3aaa9GG3331321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3331321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331321E[];
extern void _ZN3aaa9GG33313213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33313213fooEv,_ZThn8_N3aaa9GG33313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33313213fooEv,_ZThn20_N3aaa9GG33313213fooEv)();
extern void _ZN3aaa5FF1323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33313213fooEv,_ZThn28_N3aaa9GG33313213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33313213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313213fooEv,_ZThn8_N3aaa9GG33313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313213fooEv,_ZThn20_N3aaa9GG33313213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313213fooEv,_ZThn28_N3aaa9GG33313213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1323barEv,_ZThn8_N3aaa5FF1323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331321E[];
Class_Descriptor cd__ZN3aaa9GG3331321E = {  "_ZN3aaa9GG3331321E", // class name
  bases__ZN3aaa9GG3331321E, 6,
  &(vtc__ZN3aaa9GG3331321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331322  : ::aaa::EE333 , ::aaa::FF132 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33313223barEv
  ~GG3331322(); // tgen
  GG3331322(); // tgen
};
//SIG(1 _ZN3aaa9GG3331322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33313223barEv");}
aaa::GG3331322 ::~GG3331322(){ note_dtor("_ZN3aaa9GG3331322E", this);} // tgen
aaa::GG3331322 ::GG3331322(){ note_ctor("_ZN3aaa9GG3331322E", this);} // tgen
}
static void Test__ZN3aaa9GG3331322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331322E, buf);
    ::aaa::GG3331322 *dp, &lv = *(dp=new (buf) ::aaa::GG3331322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331322E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331322E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3331322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3331322E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3331322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331322E);
    dp->::aaa::GG3331322::~GG3331322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331322E(Test__ZN3aaa9GG3331322E, "_ZN3aaa9GG3331322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331322C1Ev();
extern void _ZN3aaa9GG3331322D1Ev();
Name_Map name_map__ZN3aaa9GG3331322E[] = {
  NSPAIR(_ZN3aaa9GG3331322C1Ev),
  NSPAIR(_ZN3aaa9GG3331322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3331322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331322E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33313223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33313223barEv,_ZThn8_N3aaa9GG33313223barEv)();
extern void _ZN3aaa3AA13fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33313223barEv,_ZThn20_N3aaa9GG33313223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33313223barEv,_ZThn28_N3aaa9GG33313223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33313223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313223barEv,_ZThn8_N3aaa9GG33313223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA13fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313223barEv,_ZThn20_N3aaa9GG33313223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313223barEv,_ZThn28_N3aaa9GG33313223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331322E[];
Class_Descriptor cd__ZN3aaa9GG3331322E = {  "_ZN3aaa9GG3331322E", // class name
  bases__ZN3aaa9GG3331322E, 6,
  &(vtc__ZN3aaa9GG3331322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331323  : ::aaa::EE333 , ::aaa::FF132 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33313233fooEv
  virtual void  bar(); // _ZN3aaa9GG33313233barEv
  ~GG3331323(); // tgen
  GG3331323(); // tgen
};
//SIG(1 _ZN3aaa9GG3331323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33313233fooEv");}
void  aaa::GG3331323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33313233barEv");}
aaa::GG3331323 ::~GG3331323(){ note_dtor("_ZN3aaa9GG3331323E", this);} // tgen
aaa::GG3331323 ::GG3331323(){ note_ctor("_ZN3aaa9GG3331323E", this);} // tgen
}
static void Test__ZN3aaa9GG3331323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331323E, buf);
    ::aaa::GG3331323 *dp, &lv = *(dp=new (buf) ::aaa::GG3331323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331323E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331323E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3331323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF132*), ABISELECT(48,28), "_ZN3aaa9GG3331323E");
    check_base_class_offset(lv, (::aaa::FF132*), ABISELECT(32,20), "_ZN3aaa9GG3331323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331323E);
    dp->::aaa::GG3331323::~GG3331323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331323E(Test__ZN3aaa9GG3331323E, "_ZN3aaa9GG3331323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331323C1Ev();
extern void _ZN3aaa9GG3331323D1Ev();
Name_Map name_map__ZN3aaa9GG3331323E[] = {
  NSPAIR(_ZN3aaa9GG3331323C1Ev),
  NSPAIR(_ZN3aaa9GG3331323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF132E;
extern VTBL_ENTRY _ZTIN3aaa5FF132E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF132E[];
static Base_Class bases__ZN3aaa9GG3331323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF132E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331323E[];
extern void _ZN3aaa9GG33313233fooEv();
extern void _ZN3aaa9GG33313233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33313233fooEv,_ZThn8_N3aaa9GG33313233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33313233barEv,_ZThn8_N3aaa9GG33313233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33313233fooEv,_ZThn20_N3aaa9GG33313233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33313233barEv,_ZThn20_N3aaa9GG33313233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313233fooEv,_ZThn28_N3aaa9GG33313233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313233barEv,_ZThn28_N3aaa9GG33313233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33313233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33313233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313233fooEv,_ZThn8_N3aaa9GG33313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313233barEv,_ZThn8_N3aaa9GG33313233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313233fooEv,_ZThn20_N3aaa9GG33313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313233barEv,_ZThn20_N3aaa9GG33313233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313233fooEv,_ZThn28_N3aaa9GG33313233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313233barEv,_ZThn28_N3aaa9GG33313233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331323E[];
Class_Descriptor cd__ZN3aaa9GG3331323E = {  "_ZN3aaa9GG3331323E", // class name
  bases__ZN3aaa9GG3331323E, 6,
  &(vtc__ZN3aaa9GG3331323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331331  : ::aaa::EE333 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33313313fooEv
  ~GG3331331(); // tgen
  GG3331331(); // tgen
};
//SIG(1 _ZN3aaa9GG3331331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33313313fooEv");}
aaa::GG3331331 ::~GG3331331(){ note_dtor("_ZN3aaa9GG3331331E", this);} // tgen
aaa::GG3331331 ::GG3331331(){ note_ctor("_ZN3aaa9GG3331331E", this);} // tgen
}
static void Test__ZN3aaa9GG3331331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331331E, buf);
    ::aaa::GG3331331 *dp, &lv = *(dp=new (buf) ::aaa::GG3331331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331331E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331331E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3331331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3331331E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3331331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331331E);
    dp->::aaa::GG3331331::~GG3331331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331331E(Test__ZN3aaa9GG3331331E, "_ZN3aaa9GG3331331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331331C1Ev();
extern void _ZN3aaa9GG3331331D1Ev();
Name_Map name_map__ZN3aaa9GG3331331E[] = {
  NSPAIR(_ZN3aaa9GG3331331C1Ev),
  NSPAIR(_ZN3aaa9GG3331331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3331331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331331E[];
extern void _ZN3aaa9GG33313313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33313313fooEv,_ZThn8_N3aaa9GG33313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33313313fooEv,_ZThn20_N3aaa9GG33313313fooEv)();
extern void _ZN3aaa5FF1333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33313313fooEv,_ZThn28_N3aaa9GG33313313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33313313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313313fooEv,_ZThn8_N3aaa9GG33313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313313fooEv,_ZThn20_N3aaa9GG33313313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF1333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313313fooEv,_ZThn28_N3aaa9GG33313313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333barEv,_ZThn8_N3aaa5FF1333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331331E[];
Class_Descriptor cd__ZN3aaa9GG3331331E = {  "_ZN3aaa9GG3331331E", // class name
  bases__ZN3aaa9GG3331331E, 6,
  &(vtc__ZN3aaa9GG3331331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331332  : ::aaa::EE333 , ::aaa::FF133 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33313323barEv
  ~GG3331332(); // tgen
  GG3331332(); // tgen
};
//SIG(1 _ZN3aaa9GG3331332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v3 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3331332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33313323barEv");}
aaa::GG3331332 ::~GG3331332(){ note_dtor("_ZN3aaa9GG3331332E", this);} // tgen
aaa::GG3331332 ::GG3331332(){ note_ctor("_ZN3aaa9GG3331332E", this);} // tgen
}
static void Test__ZN3aaa9GG3331332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331332E, buf);
    ::aaa::GG3331332 *dp, &lv = *(dp=new (buf) ::aaa::GG3331332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331332E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331332E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3331332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3331332E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3331332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331332E);
    dp->::aaa::GG3331332::~GG3331332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331332E(Test__ZN3aaa9GG3331332E, "_ZN3aaa9GG3331332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331332C1Ev();
extern void _ZN3aaa9GG3331332D1Ev();
Name_Map name_map__ZN3aaa9GG3331332E[] = {
  NSPAIR(_ZN3aaa9GG3331332C1Ev),
  NSPAIR(_ZN3aaa9GG3331332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3331332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331332E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33313323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33313323barEv,_ZThn8_N3aaa9GG33313323barEv)();
extern void _ZN3aaa5FF1333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33313323barEv,_ZThn20_N3aaa9GG33313323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313323barEv,_ZThn28_N3aaa9GG33313323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33313323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313323barEv,_ZThn8_N3aaa9GG33313323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF1333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313323barEv,_ZThn20_N3aaa9GG33313323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF1333fooEv,_ZThn8_N3aaa5FF1333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313323barEv,_ZThn28_N3aaa9GG33313323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331332E[];
Class_Descriptor cd__ZN3aaa9GG3331332E = {  "_ZN3aaa9GG3331332E", // class name
  bases__ZN3aaa9GG3331332E, 6,
  &(vtc__ZN3aaa9GG3331332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3331333  : ::aaa::EE333 , ::aaa::FF133 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33313333fooEv
  virtual void  bar(); // _ZN3aaa9GG33313333barEv
  ~GG3331333(); // tgen
  GG3331333(); // tgen
};
//SIG(1 _ZN3aaa9GG3331333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v1 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3331333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33313333fooEv");}
void  aaa::GG3331333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33313333barEv");}
aaa::GG3331333 ::~GG3331333(){ note_dtor("_ZN3aaa9GG3331333E", this);} // tgen
aaa::GG3331333 ::GG3331333(){ note_ctor("_ZN3aaa9GG3331333E", this);} // tgen
}
static void Test__ZN3aaa9GG3331333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3331333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3331333E, buf);
    ::aaa::GG3331333 *dp, &lv = *(dp=new (buf) ::aaa::GG3331333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3331333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3331333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3331333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3331333E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3331333E");
    check_base_class_offset(lv, (::aaa::AA1*)(::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3331333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF133*), ABISELECT(48,28), "_ZN3aaa9GG3331333E");
    check_base_class_offset(lv, (::aaa::FF133*), ABISELECT(32,20), "_ZN3aaa9GG3331333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3331333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3331333E);
    dp->::aaa::GG3331333::~GG3331333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3331333E(Test__ZN3aaa9GG3331333E, "_ZN3aaa9GG3331333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3331333C1Ev();
extern void _ZN3aaa9GG3331333D1Ev();
Name_Map name_map__ZN3aaa9GG3331333E[] = {
  NSPAIR(_ZN3aaa9GG3331333C1Ev),
  NSPAIR(_ZN3aaa9GG3331333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA1E;
extern VTBL_ENTRY _ZTIN3aaa3AA1E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA1E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF133E;
extern VTBL_ENTRY _ZTIN3aaa5FF133E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF133E[];
static Base_Class bases__ZN3aaa9GG3331333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA1E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF133E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3331333E[];
extern void _ZN3aaa9GG33313333fooEv();
extern void _ZN3aaa9GG33313333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33313333fooEv,_ZThn8_N3aaa9GG33313333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33313333barEv,_ZThn8_N3aaa9GG33313333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33313333fooEv,_ZThn20_N3aaa9GG33313333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33313333barEv,_ZThn20_N3aaa9GG33313333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313333fooEv,_ZThn28_N3aaa9GG33313333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33313333barEv,_ZThn28_N3aaa9GG33313333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3331333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33313333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33313333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313333fooEv,_ZThn8_N3aaa9GG33313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33313333barEv,_ZThn8_N3aaa9GG33313333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313333fooEv,_ZThn20_N3aaa9GG33313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33313333barEv,_ZThn20_N3aaa9GG33313333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3331333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313333fooEv,_ZThn28_N3aaa9GG33313333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33313333barEv,_ZThn28_N3aaa9GG33313333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3331333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3331333E[];
Class_Descriptor cd__ZN3aaa9GG3331333E = {  "_ZN3aaa9GG3331333E", // class name
  bases__ZN3aaa9GG3331333E, 6,
  &(vtc__ZN3aaa9GG3331333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3331333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3331333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332111  : ::aaa::EE333 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33321113fooEv
  ~GG3332111(); // tgen
  GG3332111(); // tgen
};
//SIG(1 _ZN3aaa9GG3332111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33321113fooEv");}
aaa::GG3332111 ::~GG3332111(){ note_dtor("_ZN3aaa9GG3332111E", this);} // tgen
aaa::GG3332111 ::GG3332111(){ note_ctor("_ZN3aaa9GG3332111E", this);} // tgen
}
static void Test__ZN3aaa9GG3332111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332111E, buf);
    ::aaa::GG3332111 *dp, &lv = *(dp=new (buf) ::aaa::GG3332111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332111E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332111E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3332111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3332111E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3332111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332111E);
    dp->::aaa::GG3332111::~GG3332111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332111E(Test__ZN3aaa9GG3332111E, "_ZN3aaa9GG3332111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332111C1Ev();
extern void _ZN3aaa9GG3332111D1Ev();
Name_Map name_map__ZN3aaa9GG3332111E[] = {
  NSPAIR(_ZN3aaa9GG3332111C1Ev),
  NSPAIR(_ZN3aaa9GG3332111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3332111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332111E[];
extern void _ZN3aaa9GG33321113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33321113fooEv,_ZThn8_N3aaa9GG33321113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33321113fooEv,_ZThn20_N3aaa9GG33321113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33321113fooEv,_ZThn28_N3aaa9GG33321113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33321113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321113fooEv,_ZThn8_N3aaa9GG33321113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332111E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321113fooEv,_ZThn20_N3aaa9GG33321113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33321113fooEv,_ZThn28_N3aaa9GG33321113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332111E[];
Class_Descriptor cd__ZN3aaa9GG3332111E = {  "_ZN3aaa9GG3332111E", // class name
  bases__ZN3aaa9GG3332111E, 6,
  &(vtc__ZN3aaa9GG3332111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332112  : ::aaa::EE333 , ::aaa::FF211 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33321123barEv
  ~GG3332112(); // tgen
  GG3332112(); // tgen
};
//SIG(1 _ZN3aaa9GG3332112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33321123barEv");}
aaa::GG3332112 ::~GG3332112(){ note_dtor("_ZN3aaa9GG3332112E", this);} // tgen
aaa::GG3332112 ::GG3332112(){ note_ctor("_ZN3aaa9GG3332112E", this);} // tgen
}
static void Test__ZN3aaa9GG3332112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332112E, buf);
    ::aaa::GG3332112 *dp, &lv = *(dp=new (buf) ::aaa::GG3332112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332112E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332112E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3332112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3332112E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3332112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332112E);
    dp->::aaa::GG3332112::~GG3332112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332112E(Test__ZN3aaa9GG3332112E, "_ZN3aaa9GG3332112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332112C1Ev();
extern void _ZN3aaa9GG3332112D1Ev();
Name_Map name_map__ZN3aaa9GG3332112E[] = {
  NSPAIR(_ZN3aaa9GG3332112C1Ev),
  NSPAIR(_ZN3aaa9GG3332112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3332112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332112E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33321123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33321123barEv,_ZThn8_N3aaa9GG33321123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33321123barEv,_ZThn20_N3aaa9GG33321123barEv)();
extern void _ZN3aaa5FF2113fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33321123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321123barEv,_ZThn8_N3aaa9GG33321123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321123barEv,_ZThn20_N3aaa9GG33321123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2113fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2113fooEv,_ZThn8_N3aaa5FF2113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332112E[];
Class_Descriptor cd__ZN3aaa9GG3332112E = {  "_ZN3aaa9GG3332112E", // class name
  bases__ZN3aaa9GG3332112E, 6,
  &(vtc__ZN3aaa9GG3332112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332113  : ::aaa::EE333 , ::aaa::FF211 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33321133fooEv
  virtual void  bar(); // _ZN3aaa9GG33321133barEv
  ~GG3332113(); // tgen
  GG3332113(); // tgen
};
//SIG(1 _ZN3aaa9GG3332113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33321133fooEv");}
void  aaa::GG3332113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33321133barEv");}
aaa::GG3332113 ::~GG3332113(){ note_dtor("_ZN3aaa9GG3332113E", this);} // tgen
aaa::GG3332113 ::GG3332113(){ note_ctor("_ZN3aaa9GG3332113E", this);} // tgen
}
static void Test__ZN3aaa9GG3332113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332113E, buf);
    ::aaa::GG3332113 *dp, &lv = *(dp=new (buf) ::aaa::GG3332113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332113E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332113E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3332113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF211*), ABISELECT(48,28), "_ZN3aaa9GG3332113E");
    check_base_class_offset(lv, (::aaa::FF211*), ABISELECT(32,20), "_ZN3aaa9GG3332113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332113E);
    dp->::aaa::GG3332113::~GG3332113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332113E(Test__ZN3aaa9GG3332113E, "_ZN3aaa9GG3332113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332113C1Ev();
extern void _ZN3aaa9GG3332113D1Ev();
Name_Map name_map__ZN3aaa9GG3332113E[] = {
  NSPAIR(_ZN3aaa9GG3332113C1Ev),
  NSPAIR(_ZN3aaa9GG3332113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF211E;
extern VTBL_ENTRY _ZTIN3aaa5FF211E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF211E[];
static Base_Class bases__ZN3aaa9GG3332113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF211E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332113E[];
extern void _ZN3aaa9GG33321133fooEv();
extern void _ZN3aaa9GG33321133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33321133fooEv,_ZThn8_N3aaa9GG33321133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33321133barEv,_ZThn8_N3aaa9GG33321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33321133barEv,_ZThn20_N3aaa9GG33321133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33321133fooEv,_ZThn20_N3aaa9GG33321133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33321133fooEv,_ZThn28_N3aaa9GG33321133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33321133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33321133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321133fooEv,_ZThn8_N3aaa9GG33321133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321133barEv,_ZThn8_N3aaa9GG33321133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321133barEv,_ZThn20_N3aaa9GG33321133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321133fooEv,_ZThn20_N3aaa9GG33321133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33321133fooEv,_ZThn28_N3aaa9GG33321133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332113E[];
Class_Descriptor cd__ZN3aaa9GG3332113E = {  "_ZN3aaa9GG3332113E", // class name
  bases__ZN3aaa9GG3332113E, 6,
  &(vtc__ZN3aaa9GG3332113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332121  : ::aaa::EE333 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33321213fooEv
  ~GG3332121(); // tgen
  GG3332121(); // tgen
};
//SIG(1 _ZN3aaa9GG3332121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33321213fooEv");}
aaa::GG3332121 ::~GG3332121(){ note_dtor("_ZN3aaa9GG3332121E", this);} // tgen
aaa::GG3332121 ::GG3332121(){ note_ctor("_ZN3aaa9GG3332121E", this);} // tgen
}
static void Test__ZN3aaa9GG3332121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332121E, buf);
    ::aaa::GG3332121 *dp, &lv = *(dp=new (buf) ::aaa::GG3332121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332121E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332121E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3332121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3332121E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3332121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332121E);
    dp->::aaa::GG3332121::~GG3332121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332121E(Test__ZN3aaa9GG3332121E, "_ZN3aaa9GG3332121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332121C1Ev();
extern void _ZN3aaa9GG3332121D1Ev();
Name_Map name_map__ZN3aaa9GG3332121E[] = {
  NSPAIR(_ZN3aaa9GG3332121C1Ev),
  NSPAIR(_ZN3aaa9GG3332121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3332121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332121E[];
extern void _ZN3aaa9GG33321213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33321213fooEv,_ZThn8_N3aaa9GG33321213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa5FF2123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33321213fooEv,_ZThn28_N3aaa9GG33321213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33321213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321213fooEv,_ZThn8_N3aaa9GG33321213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332121E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33321213fooEv,_ZThn28_N3aaa9GG33321213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332121E[];
Class_Descriptor cd__ZN3aaa9GG3332121E = {  "_ZN3aaa9GG3332121E", // class name
  bases__ZN3aaa9GG3332121E, 6,
  &(vtc__ZN3aaa9GG3332121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332121E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332122  : ::aaa::EE333 , ::aaa::FF212 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33321223barEv
  ~GG3332122(); // tgen
  GG3332122(); // tgen
};
//SIG(1 _ZN3aaa9GG3332122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33321223barEv");}
aaa::GG3332122 ::~GG3332122(){ note_dtor("_ZN3aaa9GG3332122E", this);} // tgen
aaa::GG3332122 ::GG3332122(){ note_ctor("_ZN3aaa9GG3332122E", this);} // tgen
}
static void Test__ZN3aaa9GG3332122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332122E, buf);
    ::aaa::GG3332122 *dp, &lv = *(dp=new (buf) ::aaa::GG3332122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332122E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332122E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3332122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3332122E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3332122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332122E);
    dp->::aaa::GG3332122::~GG3332122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332122E(Test__ZN3aaa9GG3332122E, "_ZN3aaa9GG3332122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332122C1Ev();
extern void _ZN3aaa9GG3332122D1Ev();
Name_Map name_map__ZN3aaa9GG3332122E[] = {
  NSPAIR(_ZN3aaa9GG3332122C1Ev),
  NSPAIR(_ZN3aaa9GG3332122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3332122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332122E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33321223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33321223barEv,_ZThn8_N3aaa9GG33321223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33321223barEv,_ZThn20_N3aaa9GG33321223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33321223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321223barEv,_ZThn8_N3aaa9GG33321223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321223barEv,_ZThn20_N3aaa9GG33321223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332122E[];
Class_Descriptor cd__ZN3aaa9GG3332122E = {  "_ZN3aaa9GG3332122E", // class name
  bases__ZN3aaa9GG3332122E, 6,
  &(vtc__ZN3aaa9GG3332122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332122E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332123  : ::aaa::EE333 , ::aaa::FF212 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33321233fooEv
  virtual void  bar(); // _ZN3aaa9GG33321233barEv
  ~GG3332123(); // tgen
  GG3332123(); // tgen
};
//SIG(1 _ZN3aaa9GG3332123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33321233fooEv");}
void  aaa::GG3332123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33321233barEv");}
aaa::GG3332123 ::~GG3332123(){ note_dtor("_ZN3aaa9GG3332123E", this);} // tgen
aaa::GG3332123 ::GG3332123(){ note_ctor("_ZN3aaa9GG3332123E", this);} // tgen
}
static void Test__ZN3aaa9GG3332123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332123E, buf);
    ::aaa::GG3332123 *dp, &lv = *(dp=new (buf) ::aaa::GG3332123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332123E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332123E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3332123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF212*), ABISELECT(48,28), "_ZN3aaa9GG3332123E");
    check_base_class_offset(lv, (::aaa::FF212*), ABISELECT(32,20), "_ZN3aaa9GG3332123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332123E);
    dp->::aaa::GG3332123::~GG3332123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332123E(Test__ZN3aaa9GG3332123E, "_ZN3aaa9GG3332123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332123C1Ev();
extern void _ZN3aaa9GG3332123D1Ev();
Name_Map name_map__ZN3aaa9GG3332123E[] = {
  NSPAIR(_ZN3aaa9GG3332123C1Ev),
  NSPAIR(_ZN3aaa9GG3332123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF212E;
extern VTBL_ENTRY _ZTIN3aaa5FF212E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF212E[];
static Base_Class bases__ZN3aaa9GG3332123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF212E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332123E[];
extern void _ZN3aaa9GG33321233fooEv();
extern void _ZN3aaa9GG33321233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33321233fooEv,_ZThn8_N3aaa9GG33321233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33321233barEv,_ZThn8_N3aaa9GG33321233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33321233barEv,_ZThn20_N3aaa9GG33321233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33321233fooEv,_ZThn28_N3aaa9GG33321233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33321233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33321233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321233fooEv,_ZThn8_N3aaa9GG33321233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321233barEv,_ZThn8_N3aaa9GG33321233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321233barEv,_ZThn20_N3aaa9GG33321233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33321233fooEv,_ZThn28_N3aaa9GG33321233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332123E[];
Class_Descriptor cd__ZN3aaa9GG3332123E = {  "_ZN3aaa9GG3332123E", // class name
  bases__ZN3aaa9GG3332123E, 6,
  &(vtc__ZN3aaa9GG3332123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332123E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332131  : ::aaa::EE333 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33321313fooEv
  ~GG3332131(); // tgen
  GG3332131(); // tgen
};
//SIG(1 _ZN3aaa9GG3332131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33321313fooEv");}
aaa::GG3332131 ::~GG3332131(){ note_dtor("_ZN3aaa9GG3332131E", this);} // tgen
aaa::GG3332131 ::GG3332131(){ note_ctor("_ZN3aaa9GG3332131E", this);} // tgen
}
static void Test__ZN3aaa9GG3332131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332131E, buf);
    ::aaa::GG3332131 *dp, &lv = *(dp=new (buf) ::aaa::GG3332131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332131E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332131E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3332131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3332131E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3332131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332131E);
    dp->::aaa::GG3332131::~GG3332131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332131E(Test__ZN3aaa9GG3332131E, "_ZN3aaa9GG3332131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332131C1Ev();
extern void _ZN3aaa9GG3332131D1Ev();
Name_Map name_map__ZN3aaa9GG3332131E[] = {
  NSPAIR(_ZN3aaa9GG3332131C1Ev),
  NSPAIR(_ZN3aaa9GG3332131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3332131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332131E[];
extern void _ZN3aaa9GG33321313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33321313fooEv,_ZThn8_N3aaa9GG33321313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa5FF2133barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33321313fooEv,_ZThn20_N3aaa9GG33321313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33321313fooEv,_ZThn28_N3aaa9GG33321313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33321313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321313fooEv,_ZThn8_N3aaa9GG33321313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332131E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2133barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321313fooEv,_ZThn20_N3aaa9GG33321313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33321313fooEv,_ZThn28_N3aaa9GG33321313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332131E[];
Class_Descriptor cd__ZN3aaa9GG3332131E = {  "_ZN3aaa9GG3332131E", // class name
  bases__ZN3aaa9GG3332131E, 6,
  &(vtc__ZN3aaa9GG3332131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332132  : ::aaa::EE333 , ::aaa::FF213 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33321323barEv
  ~GG3332132(); // tgen
  GG3332132(); // tgen
};
//SIG(1 _ZN3aaa9GG3332132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33321323barEv");}
aaa::GG3332132 ::~GG3332132(){ note_dtor("_ZN3aaa9GG3332132E", this);} // tgen
aaa::GG3332132 ::GG3332132(){ note_ctor("_ZN3aaa9GG3332132E", this);} // tgen
}
static void Test__ZN3aaa9GG3332132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332132E, buf);
    ::aaa::GG3332132 *dp, &lv = *(dp=new (buf) ::aaa::GG3332132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332132E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332132E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3332132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3332132E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3332132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332132E);
    dp->::aaa::GG3332132::~GG3332132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332132E(Test__ZN3aaa9GG3332132E, "_ZN3aaa9GG3332132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332132C1Ev();
extern void _ZN3aaa9GG3332132D1Ev();
Name_Map name_map__ZN3aaa9GG3332132E[] = {
  NSPAIR(_ZN3aaa9GG3332132C1Ev),
  NSPAIR(_ZN3aaa9GG3332132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3332132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332132E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33321323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33321323barEv,_ZThn8_N3aaa9GG33321323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33321323barEv,_ZThn20_N3aaa9GG33321323barEv)();
extern void _ZN3aaa5FF2133fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33321323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321323barEv,_ZThn8_N3aaa9GG33321323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321323barEv,_ZThn20_N3aaa9GG33321323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2133fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2133fooEv,_ZThn8_N3aaa5FF2133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332132E[];
Class_Descriptor cd__ZN3aaa9GG3332132E = {  "_ZN3aaa9GG3332132E", // class name
  bases__ZN3aaa9GG3332132E, 6,
  &(vtc__ZN3aaa9GG3332132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332133  : ::aaa::EE333 , ::aaa::FF213 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33321333fooEv
  virtual void  bar(); // _ZN3aaa9GG33321333barEv
  ~GG3332133(); // tgen
  GG3332133(); // tgen
};
//SIG(1 _ZN3aaa9GG3332133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33321333fooEv");}
void  aaa::GG3332133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33321333barEv");}
aaa::GG3332133 ::~GG3332133(){ note_dtor("_ZN3aaa9GG3332133E", this);} // tgen
aaa::GG3332133 ::GG3332133(){ note_ctor("_ZN3aaa9GG3332133E", this);} // tgen
}
static void Test__ZN3aaa9GG3332133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332133E, buf);
    ::aaa::GG3332133 *dp, &lv = *(dp=new (buf) ::aaa::GG3332133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332133E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332133E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3332133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF213*), ABISELECT(48,28), "_ZN3aaa9GG3332133E");
    check_base_class_offset(lv, (::aaa::FF213*), ABISELECT(32,20), "_ZN3aaa9GG3332133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332133E);
    dp->::aaa::GG3332133::~GG3332133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332133E(Test__ZN3aaa9GG3332133E, "_ZN3aaa9GG3332133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332133C1Ev();
extern void _ZN3aaa9GG3332133D1Ev();
Name_Map name_map__ZN3aaa9GG3332133E[] = {
  NSPAIR(_ZN3aaa9GG3332133C1Ev),
  NSPAIR(_ZN3aaa9GG3332133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF213E;
extern VTBL_ENTRY _ZTIN3aaa5FF213E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF213E[];
static Base_Class bases__ZN3aaa9GG3332133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF213E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332133E[];
extern void _ZN3aaa9GG33321333fooEv();
extern void _ZN3aaa9GG33321333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33321333fooEv,_ZThn8_N3aaa9GG33321333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33321333barEv,_ZThn8_N3aaa9GG33321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33321333barEv,_ZThn20_N3aaa9GG33321333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33321333fooEv,_ZThn20_N3aaa9GG33321333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33321333fooEv,_ZThn28_N3aaa9GG33321333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33321333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33321333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321333fooEv,_ZThn8_N3aaa9GG33321333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33321333barEv,_ZThn8_N3aaa9GG33321333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321333barEv,_ZThn20_N3aaa9GG33321333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33321333fooEv,_ZThn20_N3aaa9GG33321333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33321333fooEv,_ZThn28_N3aaa9GG33321333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332133E[];
Class_Descriptor cd__ZN3aaa9GG3332133E = {  "_ZN3aaa9GG3332133E", // class name
  bases__ZN3aaa9GG3332133E, 6,
  &(vtc__ZN3aaa9GG3332133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332211  : ::aaa::EE333 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33322113fooEv
  ~GG3332211(); // tgen
  GG3332211(); // tgen
};
//SIG(1 _ZN3aaa9GG3332211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v4 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33322113fooEv");}
aaa::GG3332211 ::~GG3332211(){ note_dtor("_ZN3aaa9GG3332211E", this);} // tgen
aaa::GG3332211 ::GG3332211(){ note_ctor("_ZN3aaa9GG3332211E", this);} // tgen
}
static void Test__ZN3aaa9GG3332211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332211E, buf);
    ::aaa::GG3332211 *dp, &lv = *(dp=new (buf) ::aaa::GG3332211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332211E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332211E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3332211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3332211E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3332211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332211E);
    dp->::aaa::GG3332211::~GG3332211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332211E(Test__ZN3aaa9GG3332211E, "_ZN3aaa9GG3332211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332211C1Ev();
extern void _ZN3aaa9GG3332211D1Ev();
Name_Map name_map__ZN3aaa9GG3332211E[] = {
  NSPAIR(_ZN3aaa9GG3332211C1Ev),
  NSPAIR(_ZN3aaa9GG3332211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3332211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332211E[];
extern void _ZN3aaa9GG33322113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33322113fooEv,_ZThn8_N3aaa9GG33322113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33322113fooEv,_ZThn20_N3aaa9GG33322113fooEv)();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33322113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322113fooEv,_ZThn8_N3aaa9GG33322113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322113fooEv,_ZThn20_N3aaa9GG33322113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332211E[];
Class_Descriptor cd__ZN3aaa9GG3332211E = {  "_ZN3aaa9GG3332211E", // class name
  bases__ZN3aaa9GG3332211E, 6,
  &(vtc__ZN3aaa9GG3332211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332212  : ::aaa::EE333 , ::aaa::FF221 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33322123barEv
  ~GG3332212(); // tgen
  GG3332212(); // tgen
};
//SIG(1 _ZN3aaa9GG3332212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33322123barEv");}
aaa::GG3332212 ::~GG3332212(){ note_dtor("_ZN3aaa9GG3332212E", this);} // tgen
aaa::GG3332212 ::GG3332212(){ note_ctor("_ZN3aaa9GG3332212E", this);} // tgen
}
static void Test__ZN3aaa9GG3332212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332212E, buf);
    ::aaa::GG3332212 *dp, &lv = *(dp=new (buf) ::aaa::GG3332212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332212E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332212E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3332212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3332212E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3332212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332212E);
    dp->::aaa::GG3332212::~GG3332212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332212E(Test__ZN3aaa9GG3332212E, "_ZN3aaa9GG3332212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332212C1Ev();
extern void _ZN3aaa9GG3332212D1Ev();
Name_Map name_map__ZN3aaa9GG3332212E[] = {
  NSPAIR(_ZN3aaa9GG3332212C1Ev),
  NSPAIR(_ZN3aaa9GG3332212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3332212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332212E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33322123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33322123barEv,_ZThn8_N3aaa9GG33322123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33322123barEv,_ZThn20_N3aaa9GG33322123barEv)();
extern void _ZN3aaa5FF2213fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33322123barEv,_ZThn28_N3aaa9GG33322123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33322123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322123barEv,_ZThn8_N3aaa9GG33322123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322123barEv,_ZThn20_N3aaa9GG33322123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33322123barEv,_ZThn28_N3aaa9GG33322123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332212E[];
Class_Descriptor cd__ZN3aaa9GG3332212E = {  "_ZN3aaa9GG3332212E", // class name
  bases__ZN3aaa9GG3332212E, 6,
  &(vtc__ZN3aaa9GG3332212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332213  : ::aaa::EE333 , ::aaa::FF221 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33322133fooEv
  virtual void  bar(); // _ZN3aaa9GG33322133barEv
  ~GG3332213(); // tgen
  GG3332213(); // tgen
};
//SIG(1 _ZN3aaa9GG3332213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33322133fooEv");}
void  aaa::GG3332213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33322133barEv");}
aaa::GG3332213 ::~GG3332213(){ note_dtor("_ZN3aaa9GG3332213E", this);} // tgen
aaa::GG3332213 ::GG3332213(){ note_ctor("_ZN3aaa9GG3332213E", this);} // tgen
}
static void Test__ZN3aaa9GG3332213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332213E, buf);
    ::aaa::GG3332213 *dp, &lv = *(dp=new (buf) ::aaa::GG3332213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332213E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332213E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3332213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF221*), ABISELECT(48,28), "_ZN3aaa9GG3332213E");
    check_base_class_offset(lv, (::aaa::FF221*), ABISELECT(32,20), "_ZN3aaa9GG3332213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332213E);
    dp->::aaa::GG3332213::~GG3332213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332213E(Test__ZN3aaa9GG3332213E, "_ZN3aaa9GG3332213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332213C1Ev();
extern void _ZN3aaa9GG3332213D1Ev();
Name_Map name_map__ZN3aaa9GG3332213E[] = {
  NSPAIR(_ZN3aaa9GG3332213C1Ev),
  NSPAIR(_ZN3aaa9GG3332213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF221E;
extern VTBL_ENTRY _ZTIN3aaa5FF221E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF221E[];
static Base_Class bases__ZN3aaa9GG3332213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF221E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332213E[];
extern void _ZN3aaa9GG33322133fooEv();
extern void _ZN3aaa9GG33322133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33322133fooEv,_ZThn8_N3aaa9GG33322133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33322133barEv,_ZThn8_N3aaa9GG33322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33322133barEv,_ZThn20_N3aaa9GG33322133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33322133fooEv,_ZThn20_N3aaa9GG33322133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33322133barEv,_ZThn28_N3aaa9GG33322133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33322133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33322133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322133fooEv,_ZThn8_N3aaa9GG33322133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322133barEv,_ZThn8_N3aaa9GG33322133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322133barEv,_ZThn20_N3aaa9GG33322133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322133fooEv,_ZThn20_N3aaa9GG33322133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33322133barEv,_ZThn28_N3aaa9GG33322133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332213E[];
Class_Descriptor cd__ZN3aaa9GG3332213E = {  "_ZN3aaa9GG3332213E", // class name
  bases__ZN3aaa9GG3332213E, 6,
  &(vtc__ZN3aaa9GG3332213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332221  : ::aaa::EE333 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33322213fooEv
  ~GG3332221(); // tgen
  GG3332221(); // tgen
};
//SIG(1 _ZN3aaa9GG3332221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33322213fooEv");}
aaa::GG3332221 ::~GG3332221(){ note_dtor("_ZN3aaa9GG3332221E", this);} // tgen
aaa::GG3332221 ::GG3332221(){ note_ctor("_ZN3aaa9GG3332221E", this);} // tgen
}
static void Test__ZN3aaa9GG3332221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332221E, buf);
    ::aaa::GG3332221 *dp, &lv = *(dp=new (buf) ::aaa::GG3332221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332221E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332221E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3332221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3332221E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3332221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332221E);
    dp->::aaa::GG3332221::~GG3332221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332221E(Test__ZN3aaa9GG3332221E, "_ZN3aaa9GG3332221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332221C1Ev();
extern void _ZN3aaa9GG3332221D1Ev();
Name_Map name_map__ZN3aaa9GG3332221E[] = {
  NSPAIR(_ZN3aaa9GG3332221C1Ev),
  NSPAIR(_ZN3aaa9GG3332221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3332221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332221E[];
extern void _ZN3aaa9GG33322213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33322213fooEv,_ZThn8_N3aaa9GG33322213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa5FF2223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33322213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322213fooEv,_ZThn8_N3aaa9GG33322213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332221E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2223barEv,_ZThn8_N3aaa5FF2223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332221E[];
Class_Descriptor cd__ZN3aaa9GG3332221E = {  "_ZN3aaa9GG3332221E", // class name
  bases__ZN3aaa9GG3332221E, 6,
  &(vtc__ZN3aaa9GG3332221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332221E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332222  : ::aaa::EE333 , ::aaa::FF222 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33322223barEv
  ~GG3332222(); // tgen
  GG3332222(); // tgen
};
//SIG(1 _ZN3aaa9GG3332222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33322223barEv");}
aaa::GG3332222 ::~GG3332222(){ note_dtor("_ZN3aaa9GG3332222E", this);} // tgen
aaa::GG3332222 ::GG3332222(){ note_ctor("_ZN3aaa9GG3332222E", this);} // tgen
}
static void Test__ZN3aaa9GG3332222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332222E, buf);
    ::aaa::GG3332222 *dp, &lv = *(dp=new (buf) ::aaa::GG3332222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332222E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332222E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3332222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3332222E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3332222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332222E);
    dp->::aaa::GG3332222::~GG3332222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332222E(Test__ZN3aaa9GG3332222E, "_ZN3aaa9GG3332222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332222C1Ev();
extern void _ZN3aaa9GG3332222D1Ev();
Name_Map name_map__ZN3aaa9GG3332222E[] = {
  NSPAIR(_ZN3aaa9GG3332222C1Ev),
  NSPAIR(_ZN3aaa9GG3332222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3332222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332222E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33322223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33322223barEv,_ZThn8_N3aaa9GG33322223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33322223barEv,_ZThn20_N3aaa9GG33322223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33322223barEv,_ZThn28_N3aaa9GG33322223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33322223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322223barEv,_ZThn8_N3aaa9GG33322223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322223barEv,_ZThn20_N3aaa9GG33322223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33322223barEv,_ZThn28_N3aaa9GG33322223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332222E[];
Class_Descriptor cd__ZN3aaa9GG3332222E = {  "_ZN3aaa9GG3332222E", // class name
  bases__ZN3aaa9GG3332222E, 6,
  &(vtc__ZN3aaa9GG3332222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332222E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332223  : ::aaa::EE333 , ::aaa::FF222 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33322233fooEv
  virtual void  bar(); // _ZN3aaa9GG33322233barEv
  ~GG3332223(); // tgen
  GG3332223(); // tgen
};
//SIG(1 _ZN3aaa9GG3332223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33322233fooEv");}
void  aaa::GG3332223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33322233barEv");}
aaa::GG3332223 ::~GG3332223(){ note_dtor("_ZN3aaa9GG3332223E", this);} // tgen
aaa::GG3332223 ::GG3332223(){ note_ctor("_ZN3aaa9GG3332223E", this);} // tgen
}
static void Test__ZN3aaa9GG3332223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332223E, buf);
    ::aaa::GG3332223 *dp, &lv = *(dp=new (buf) ::aaa::GG3332223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332223E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332223E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3332223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF222*), ABISELECT(48,28), "_ZN3aaa9GG3332223E");
    check_base_class_offset(lv, (::aaa::FF222*), ABISELECT(32,20), "_ZN3aaa9GG3332223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332223E);
    dp->::aaa::GG3332223::~GG3332223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332223E(Test__ZN3aaa9GG3332223E, "_ZN3aaa9GG3332223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332223C1Ev();
extern void _ZN3aaa9GG3332223D1Ev();
Name_Map name_map__ZN3aaa9GG3332223E[] = {
  NSPAIR(_ZN3aaa9GG3332223C1Ev),
  NSPAIR(_ZN3aaa9GG3332223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF222E;
extern VTBL_ENTRY _ZTIN3aaa5FF222E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF222E[];
static Base_Class bases__ZN3aaa9GG3332223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF222E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332223E[];
extern void _ZN3aaa9GG33322233fooEv();
extern void _ZN3aaa9GG33322233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33322233fooEv,_ZThn8_N3aaa9GG33322233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33322233barEv,_ZThn8_N3aaa9GG33322233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33322233barEv,_ZThn20_N3aaa9GG33322233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33322233barEv,_ZThn28_N3aaa9GG33322233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33322233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33322233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322233fooEv,_ZThn8_N3aaa9GG33322233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322233barEv,_ZThn8_N3aaa9GG33322233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322233barEv,_ZThn20_N3aaa9GG33322233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33322233barEv,_ZThn28_N3aaa9GG33322233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332223E[];
Class_Descriptor cd__ZN3aaa9GG3332223E = {  "_ZN3aaa9GG3332223E", // class name
  bases__ZN3aaa9GG3332223E, 6,
  &(vtc__ZN3aaa9GG3332223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332223E),14, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332231  : ::aaa::EE333 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33322313fooEv
  ~GG3332231(); // tgen
  GG3332231(); // tgen
};
//SIG(1 _ZN3aaa9GG3332231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC7{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33322313fooEv");}
aaa::GG3332231 ::~GG3332231(){ note_dtor("_ZN3aaa9GG3332231E", this);} // tgen
aaa::GG3332231 ::GG3332231(){ note_ctor("_ZN3aaa9GG3332231E", this);} // tgen
}
static void Test__ZN3aaa9GG3332231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332231E, buf);
    ::aaa::GG3332231 *dp, &lv = *(dp=new (buf) ::aaa::GG3332231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332231E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332231E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3332231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3332231E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3332231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332231E);
    dp->::aaa::GG3332231::~GG3332231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332231E(Test__ZN3aaa9GG3332231E, "_ZN3aaa9GG3332231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332231C1Ev();
extern void _ZN3aaa9GG3332231D1Ev();
Name_Map name_map__ZN3aaa9GG3332231E[] = {
  NSPAIR(_ZN3aaa9GG3332231C1Ev),
  NSPAIR(_ZN3aaa9GG3332231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3332231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332231E[];
extern void _ZN3aaa9GG33322313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33322313fooEv,_ZThn8_N3aaa9GG33322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa5FF2233barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33322313fooEv,_ZThn20_N3aaa9GG33322313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33322313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322313fooEv,_ZThn8_N3aaa9GG33322313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332231E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2233barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322313fooEv,_ZThn20_N3aaa9GG33322313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2233barEv,_ZThn8_N3aaa5FF2233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332231E[];
Class_Descriptor cd__ZN3aaa9GG3332231E = {  "_ZN3aaa9GG3332231E", // class name
  bases__ZN3aaa9GG3332231E, 6,
  &(vtc__ZN3aaa9GG3332231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332232  : ::aaa::EE333 , ::aaa::FF223 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33322323barEv
  ~GG3332232(); // tgen
  GG3332232(); // tgen
};
//SIG(1 _ZN3aaa9GG3332232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC7{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33322323barEv");}
aaa::GG3332232 ::~GG3332232(){ note_dtor("_ZN3aaa9GG3332232E", this);} // tgen
aaa::GG3332232 ::GG3332232(){ note_ctor("_ZN3aaa9GG3332232E", this);} // tgen
}
static void Test__ZN3aaa9GG3332232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332232E, buf);
    ::aaa::GG3332232 *dp, &lv = *(dp=new (buf) ::aaa::GG3332232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332232E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332232E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3332232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3332232E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3332232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332232E);
    dp->::aaa::GG3332232::~GG3332232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332232E(Test__ZN3aaa9GG3332232E, "_ZN3aaa9GG3332232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332232C1Ev();
extern void _ZN3aaa9GG3332232D1Ev();
Name_Map name_map__ZN3aaa9GG3332232E[] = {
  NSPAIR(_ZN3aaa9GG3332232C1Ev),
  NSPAIR(_ZN3aaa9GG3332232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3332232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332232E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33322323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33322323barEv,_ZThn8_N3aaa9GG33322323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33322323barEv,_ZThn20_N3aaa9GG33322323barEv)();
extern void _ZN3aaa5FF2233fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33322323barEv,_ZThn28_N3aaa9GG33322323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33322323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322323barEv,_ZThn8_N3aaa9GG33322323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322323barEv,_ZThn20_N3aaa9GG33322323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2233fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33322323barEv,_ZThn28_N3aaa9GG33322323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332232E[];
Class_Descriptor cd__ZN3aaa9GG3332232E = {  "_ZN3aaa9GG3332232E", // class name
  bases__ZN3aaa9GG3332232E, 6,
  &(vtc__ZN3aaa9GG3332232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332233  : ::aaa::EE333 , ::aaa::FF223 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33322333fooEv
  virtual void  bar(); // _ZN3aaa9GG33322333barEv
  ~GG3332233(); // tgen
  GG3332233(); // tgen
};
//SIG(1 _ZN3aaa9GG3332233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC7{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33322333fooEv");}
void  aaa::GG3332233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33322333barEv");}
aaa::GG3332233 ::~GG3332233(){ note_dtor("_ZN3aaa9GG3332233E", this);} // tgen
aaa::GG3332233 ::GG3332233(){ note_ctor("_ZN3aaa9GG3332233E", this);} // tgen
}
static void Test__ZN3aaa9GG3332233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332233E, buf);
    ::aaa::GG3332233 *dp, &lv = *(dp=new (buf) ::aaa::GG3332233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332233E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332233E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3332233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF223*), ABISELECT(48,28), "_ZN3aaa9GG3332233E");
    check_base_class_offset(lv, (::aaa::FF223*), ABISELECT(32,20), "_ZN3aaa9GG3332233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332233E);
    dp->::aaa::GG3332233::~GG3332233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332233E(Test__ZN3aaa9GG3332233E, "_ZN3aaa9GG3332233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332233C1Ev();
extern void _ZN3aaa9GG3332233D1Ev();
Name_Map name_map__ZN3aaa9GG3332233E[] = {
  NSPAIR(_ZN3aaa9GG3332233C1Ev),
  NSPAIR(_ZN3aaa9GG3332233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF223E;
extern VTBL_ENTRY _ZTIN3aaa5FF223E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF223E[];
static Base_Class bases__ZN3aaa9GG3332233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF223E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332233E[];
extern void _ZN3aaa9GG33322333fooEv();
extern void _ZN3aaa9GG33322333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33322333fooEv,_ZThn8_N3aaa9GG33322333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33322333barEv,_ZThn8_N3aaa9GG33322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33322333barEv,_ZThn20_N3aaa9GG33322333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33322333fooEv,_ZThn20_N3aaa9GG33322333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33322333barEv,_ZThn28_N3aaa9GG33322333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33322333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33322333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322333fooEv,_ZThn8_N3aaa9GG33322333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33322333barEv,_ZThn8_N3aaa9GG33322333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322333barEv,_ZThn20_N3aaa9GG33322333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33322333fooEv,_ZThn20_N3aaa9GG33322333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33322333barEv,_ZThn28_N3aaa9GG33322333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332233E[];
Class_Descriptor cd__ZN3aaa9GG3332233E = {  "_ZN3aaa9GG3332233E", // class name
  bases__ZN3aaa9GG3332233E, 6,
  &(vtc__ZN3aaa9GG3332233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332311  : ::aaa::EE333 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33323113fooEv
  ~GG3332311(); // tgen
  GG3332311(); // tgen
};
//SIG(1 _ZN3aaa9GG3332311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33323113fooEv");}
aaa::GG3332311 ::~GG3332311(){ note_dtor("_ZN3aaa9GG3332311E", this);} // tgen
aaa::GG3332311 ::GG3332311(){ note_ctor("_ZN3aaa9GG3332311E", this);} // tgen
}
static void Test__ZN3aaa9GG3332311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332311E, buf);
    ::aaa::GG3332311 *dp, &lv = *(dp=new (buf) ::aaa::GG3332311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332311E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332311E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3332311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3332311E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3332311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332311E);
    dp->::aaa::GG3332311::~GG3332311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332311E(Test__ZN3aaa9GG3332311E, "_ZN3aaa9GG3332311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332311C1Ev();
extern void _ZN3aaa9GG3332311D1Ev();
Name_Map name_map__ZN3aaa9GG3332311E[] = {
  NSPAIR(_ZN3aaa9GG3332311C1Ev),
  NSPAIR(_ZN3aaa9GG3332311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3332311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332311E[];
extern void _ZN3aaa9GG33323113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33323113fooEv,_ZThn8_N3aaa9GG33323113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa3AA23barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33323113fooEv,_ZThn20_N3aaa9GG33323113fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323113fooEv,_ZThn28_N3aaa9GG33323113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33323113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323113fooEv,_ZThn8_N3aaa9GG33323113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332311E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA23barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323113fooEv,_ZThn20_N3aaa9GG33323113fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323113fooEv,_ZThn28_N3aaa9GG33323113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332311E[];
Class_Descriptor cd__ZN3aaa9GG3332311E = {  "_ZN3aaa9GG3332311E", // class name
  bases__ZN3aaa9GG3332311E, 6,
  &(vtc__ZN3aaa9GG3332311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332312  : ::aaa::EE333 , ::aaa::FF231 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33323123barEv
  ~GG3332312(); // tgen
  GG3332312(); // tgen
};
//SIG(1 _ZN3aaa9GG3332312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33323123barEv");}
aaa::GG3332312 ::~GG3332312(){ note_dtor("_ZN3aaa9GG3332312E", this);} // tgen
aaa::GG3332312 ::GG3332312(){ note_ctor("_ZN3aaa9GG3332312E", this);} // tgen
}
static void Test__ZN3aaa9GG3332312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332312E, buf);
    ::aaa::GG3332312 *dp, &lv = *(dp=new (buf) ::aaa::GG3332312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332312E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332312E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3332312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3332312E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3332312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332312E);
    dp->::aaa::GG3332312::~GG3332312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332312E(Test__ZN3aaa9GG3332312E, "_ZN3aaa9GG3332312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332312C1Ev();
extern void _ZN3aaa9GG3332312D1Ev();
Name_Map name_map__ZN3aaa9GG3332312E[] = {
  NSPAIR(_ZN3aaa9GG3332312C1Ev),
  NSPAIR(_ZN3aaa9GG3332312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3332312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332312E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33323123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33323123barEv,_ZThn8_N3aaa9GG33323123barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33323123barEv,_ZThn20_N3aaa9GG33323123barEv)();
extern void _ZN3aaa5FF2313fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323123barEv,_ZThn28_N3aaa9GG33323123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33323123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323123barEv,_ZThn8_N3aaa9GG33323123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323123barEv,_ZThn20_N3aaa9GG33323123barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2313fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2313fooEv,_ZThn8_N3aaa5FF2313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323123barEv,_ZThn28_N3aaa9GG33323123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332312E[];
Class_Descriptor cd__ZN3aaa9GG3332312E = {  "_ZN3aaa9GG3332312E", // class name
  bases__ZN3aaa9GG3332312E, 6,
  &(vtc__ZN3aaa9GG3332312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332313  : ::aaa::EE333 , ::aaa::FF231 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33323133fooEv
  virtual void  bar(); // _ZN3aaa9GG33323133barEv
  ~GG3332313(); // tgen
  GG3332313(); // tgen
};
//SIG(1 _ZN3aaa9GG3332313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33323133fooEv");}
void  aaa::GG3332313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33323133barEv");}
aaa::GG3332313 ::~GG3332313(){ note_dtor("_ZN3aaa9GG3332313E", this);} // tgen
aaa::GG3332313 ::GG3332313(){ note_ctor("_ZN3aaa9GG3332313E", this);} // tgen
}
static void Test__ZN3aaa9GG3332313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332313E, buf);
    ::aaa::GG3332313 *dp, &lv = *(dp=new (buf) ::aaa::GG3332313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332313E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332313E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3332313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF231*), ABISELECT(48,28), "_ZN3aaa9GG3332313E");
    check_base_class_offset(lv, (::aaa::FF231*), ABISELECT(32,20), "_ZN3aaa9GG3332313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332313E);
    dp->::aaa::GG3332313::~GG3332313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332313E(Test__ZN3aaa9GG3332313E, "_ZN3aaa9GG3332313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332313C1Ev();
extern void _ZN3aaa9GG3332313D1Ev();
Name_Map name_map__ZN3aaa9GG3332313E[] = {
  NSPAIR(_ZN3aaa9GG3332313C1Ev),
  NSPAIR(_ZN3aaa9GG3332313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF231E;
extern VTBL_ENTRY _ZTIN3aaa5FF231E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF231E[];
static Base_Class bases__ZN3aaa9GG3332313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF231E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332313E[];
extern void _ZN3aaa9GG33323133fooEv();
extern void _ZN3aaa9GG33323133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33323133fooEv,_ZThn8_N3aaa9GG33323133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33323133barEv,_ZThn8_N3aaa9GG33323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33323133barEv,_ZThn20_N3aaa9GG33323133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33323133fooEv,_ZThn20_N3aaa9GG33323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323133fooEv,_ZThn28_N3aaa9GG33323133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323133barEv,_ZThn28_N3aaa9GG33323133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33323133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33323133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323133fooEv,_ZThn8_N3aaa9GG33323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323133barEv,_ZThn8_N3aaa9GG33323133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323133barEv,_ZThn20_N3aaa9GG33323133barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323133fooEv,_ZThn20_N3aaa9GG33323133fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323133fooEv,_ZThn28_N3aaa9GG33323133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323133barEv,_ZThn28_N3aaa9GG33323133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332313E[];
Class_Descriptor cd__ZN3aaa9GG3332313E = {  "_ZN3aaa9GG3332313E", // class name
  bases__ZN3aaa9GG3332313E, 6,
  &(vtc__ZN3aaa9GG3332313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332321  : ::aaa::EE333 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33323213fooEv
  ~GG3332321(); // tgen
  GG3332321(); // tgen
};
//SIG(1 _ZN3aaa9GG3332321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33323213fooEv");}
aaa::GG3332321 ::~GG3332321(){ note_dtor("_ZN3aaa9GG3332321E", this);} // tgen
aaa::GG3332321 ::GG3332321(){ note_ctor("_ZN3aaa9GG3332321E", this);} // tgen
}
static void Test__ZN3aaa9GG3332321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332321E, buf);
    ::aaa::GG3332321 *dp, &lv = *(dp=new (buf) ::aaa::GG3332321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332321E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332321E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3332321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3332321E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3332321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332321E);
    dp->::aaa::GG3332321::~GG3332321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332321E(Test__ZN3aaa9GG3332321E, "_ZN3aaa9GG3332321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332321C1Ev();
extern void _ZN3aaa9GG3332321D1Ev();
Name_Map name_map__ZN3aaa9GG3332321E[] = {
  NSPAIR(_ZN3aaa9GG3332321C1Ev),
  NSPAIR(_ZN3aaa9GG3332321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3332321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332321E[];
extern void _ZN3aaa9GG33323213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33323213fooEv,_ZThn8_N3aaa9GG33323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa5FF2323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33323213fooEv,_ZThn28_N3aaa9GG33323213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33323213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323213fooEv,_ZThn8_N3aaa9GG33323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332321E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323213fooEv,_ZThn28_N3aaa9GG33323213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2323barEv,_ZThn8_N3aaa5FF2323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332321E[];
Class_Descriptor cd__ZN3aaa9GG3332321E = {  "_ZN3aaa9GG3332321E", // class name
  bases__ZN3aaa9GG3332321E, 6,
  &(vtc__ZN3aaa9GG3332321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332321E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332322  : ::aaa::EE333 , ::aaa::FF232 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33323223barEv
  ~GG3332322(); // tgen
  GG3332322(); // tgen
};
//SIG(1 _ZN3aaa9GG3332322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33323223barEv");}
aaa::GG3332322 ::~GG3332322(){ note_dtor("_ZN3aaa9GG3332322E", this);} // tgen
aaa::GG3332322 ::GG3332322(){ note_ctor("_ZN3aaa9GG3332322E", this);} // tgen
}
static void Test__ZN3aaa9GG3332322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332322E, buf);
    ::aaa::GG3332322 *dp, &lv = *(dp=new (buf) ::aaa::GG3332322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332322E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332322E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3332322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3332322E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3332322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332322E);
    dp->::aaa::GG3332322::~GG3332322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332322E(Test__ZN3aaa9GG3332322E, "_ZN3aaa9GG3332322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332322C1Ev();
extern void _ZN3aaa9GG3332322D1Ev();
Name_Map name_map__ZN3aaa9GG3332322E[] = {
  NSPAIR(_ZN3aaa9GG3332322C1Ev),
  NSPAIR(_ZN3aaa9GG3332322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3332322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332322E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33323223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33323223barEv,_ZThn8_N3aaa9GG33323223barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33323223barEv,_ZThn20_N3aaa9GG33323223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33323223barEv,_ZThn28_N3aaa9GG33323223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33323223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323223barEv,_ZThn8_N3aaa9GG33323223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323223barEv,_ZThn20_N3aaa9GG33323223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323223barEv,_ZThn28_N3aaa9GG33323223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332322E[];
Class_Descriptor cd__ZN3aaa9GG3332322E = {  "_ZN3aaa9GG3332322E", // class name
  bases__ZN3aaa9GG3332322E, 6,
  &(vtc__ZN3aaa9GG3332322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332322E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332323  : ::aaa::EE333 , ::aaa::FF232 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33323233fooEv
  virtual void  bar(); // _ZN3aaa9GG33323233barEv
  ~GG3332323(); // tgen
  GG3332323(); // tgen
};
//SIG(1 _ZN3aaa9GG3332323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33323233fooEv");}
void  aaa::GG3332323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33323233barEv");}
aaa::GG3332323 ::~GG3332323(){ note_dtor("_ZN3aaa9GG3332323E", this);} // tgen
aaa::GG3332323 ::GG3332323(){ note_ctor("_ZN3aaa9GG3332323E", this);} // tgen
}
static void Test__ZN3aaa9GG3332323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332323E, buf);
    ::aaa::GG3332323 *dp, &lv = *(dp=new (buf) ::aaa::GG3332323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332323E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332323E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3332323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF232*), ABISELECT(48,28), "_ZN3aaa9GG3332323E");
    check_base_class_offset(lv, (::aaa::FF232*), ABISELECT(32,20), "_ZN3aaa9GG3332323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332323E);
    dp->::aaa::GG3332323::~GG3332323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332323E(Test__ZN3aaa9GG3332323E, "_ZN3aaa9GG3332323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332323C1Ev();
extern void _ZN3aaa9GG3332323D1Ev();
Name_Map name_map__ZN3aaa9GG3332323E[] = {
  NSPAIR(_ZN3aaa9GG3332323C1Ev),
  NSPAIR(_ZN3aaa9GG3332323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF232E;
extern VTBL_ENTRY _ZTIN3aaa5FF232E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF232E[];
static Base_Class bases__ZN3aaa9GG3332323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF232E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332323E[];
extern void _ZN3aaa9GG33323233fooEv();
extern void _ZN3aaa9GG33323233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33323233fooEv,_ZThn8_N3aaa9GG33323233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33323233barEv,_ZThn8_N3aaa9GG33323233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33323233barEv,_ZThn20_N3aaa9GG33323233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323233fooEv,_ZThn28_N3aaa9GG33323233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323233barEv,_ZThn28_N3aaa9GG33323233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33323233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33323233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323233fooEv,_ZThn8_N3aaa9GG33323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323233barEv,_ZThn8_N3aaa9GG33323233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323233barEv,_ZThn20_N3aaa9GG33323233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323233fooEv,_ZThn28_N3aaa9GG33323233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323233barEv,_ZThn28_N3aaa9GG33323233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332323E[];
Class_Descriptor cd__ZN3aaa9GG3332323E = {  "_ZN3aaa9GG3332323E", // class name
  bases__ZN3aaa9GG3332323E, 6,
  &(vtc__ZN3aaa9GG3332323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332323E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332331  : ::aaa::EE333 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33323313fooEv
  ~GG3332331(); // tgen
  GG3332331(); // tgen
};
//SIG(1 _ZN3aaa9GG3332331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v3 Fi} BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33323313fooEv");}
aaa::GG3332331 ::~GG3332331(){ note_dtor("_ZN3aaa9GG3332331E", this);} // tgen
aaa::GG3332331 ::GG3332331(){ note_ctor("_ZN3aaa9GG3332331E", this);} // tgen
}
static void Test__ZN3aaa9GG3332331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332331E, buf);
    ::aaa::GG3332331 *dp, &lv = *(dp=new (buf) ::aaa::GG3332331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332331E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332331E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3332331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3332331E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3332331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332331E);
    dp->::aaa::GG3332331::~GG3332331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332331E(Test__ZN3aaa9GG3332331E, "_ZN3aaa9GG3332331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332331C1Ev();
extern void _ZN3aaa9GG3332331D1Ev();
Name_Map name_map__ZN3aaa9GG3332331E[] = {
  NSPAIR(_ZN3aaa9GG3332331C1Ev),
  NSPAIR(_ZN3aaa9GG3332331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3332331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332331E[];
extern void _ZN3aaa9GG33323313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33323313fooEv,_ZThn8_N3aaa9GG33323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void _ZN3aaa5FF2333barEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33323313fooEv,_ZThn20_N3aaa9GG33323313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323313fooEv,_ZThn28_N3aaa9GG33323313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33323313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323313fooEv,_ZThn8_N3aaa9GG33323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332331E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF2333barEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323313fooEv,_ZThn20_N3aaa9GG33323313fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323313fooEv,_ZThn28_N3aaa9GG33323313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333barEv,_ZThn8_N3aaa5FF2333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332331E[];
Class_Descriptor cd__ZN3aaa9GG3332331E = {  "_ZN3aaa9GG3332331E", // class name
  bases__ZN3aaa9GG3332331E, 6,
  &(vtc__ZN3aaa9GG3332331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332332  : ::aaa::EE333 , ::aaa::FF233 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33323323barEv
  ~GG3332332(); // tgen
  GG3332332(); // tgen
};
//SIG(1 _ZN3aaa9GG3332332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC6{ v1 Fi} BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3332332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33323323barEv");}
aaa::GG3332332 ::~GG3332332(){ note_dtor("_ZN3aaa9GG3332332E", this);} // tgen
aaa::GG3332332 ::GG3332332(){ note_ctor("_ZN3aaa9GG3332332E", this);} // tgen
}
static void Test__ZN3aaa9GG3332332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332332E, buf);
    ::aaa::GG3332332 *dp, &lv = *(dp=new (buf) ::aaa::GG3332332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332332E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332332E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3332332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3332332E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3332332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332332E);
    dp->::aaa::GG3332332::~GG3332332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332332E(Test__ZN3aaa9GG3332332E, "_ZN3aaa9GG3332332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332332C1Ev();
extern void _ZN3aaa9GG3332332D1Ev();
Name_Map name_map__ZN3aaa9GG3332332E[] = {
  NSPAIR(_ZN3aaa9GG3332332C1Ev),
  NSPAIR(_ZN3aaa9GG3332332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3332332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332332E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33323323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33323323barEv,_ZThn8_N3aaa9GG33323323barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33323323barEv,_ZThn20_N3aaa9GG33323323barEv)();
extern void _ZN3aaa5FF2333fooEv();
extern void ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323323barEv,_ZThn28_N3aaa9GG33323323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33323323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323323barEv,_ZThn8_N3aaa9GG33323323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323323barEv,_ZThn20_N3aaa9GG33323323barEv),
  (VTBL_ENTRY)&_ZN3aaa5FF2333fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF2333fooEv,_ZThn8_N3aaa5FF2333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323323barEv,_ZThn28_N3aaa9GG33323323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332332E[];
Class_Descriptor cd__ZN3aaa9GG3332332E = {  "_ZN3aaa9GG3332332E", // class name
  bases__ZN3aaa9GG3332332E, 6,
  &(vtc__ZN3aaa9GG3332332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3332333  : ::aaa::EE333 , ::aaa::FF233 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33323333fooEv
  virtual void  bar(); // _ZN3aaa9GG33323333barEv
  ~GG3332333(); // tgen
  GG3332333(); // tgen
};
//SIG(1 _ZN3aaa9GG3332333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC6{ v2 Fi} BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3332333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33323333fooEv");}
void  aaa::GG3332333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33323333barEv");}
aaa::GG3332333 ::~GG3332333(){ note_dtor("_ZN3aaa9GG3332333E", this);} // tgen
aaa::GG3332333 ::GG3332333(){ note_ctor("_ZN3aaa9GG3332333E", this);} // tgen
}
static void Test__ZN3aaa9GG3332333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3332333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3332333E, buf);
    ::aaa::GG3332333 *dp, &lv = *(dp=new (buf) ::aaa::GG3332333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3332333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3332333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3332333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3332333E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3332333E");
    check_base_class_offset(lv, (::aaa::AA2*)(::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3332333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF233*), ABISELECT(48,28), "_ZN3aaa9GG3332333E");
    check_base_class_offset(lv, (::aaa::FF233*), ABISELECT(32,20), "_ZN3aaa9GG3332333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3332333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3332333E);
    dp->::aaa::GG3332333::~GG3332333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3332333E(Test__ZN3aaa9GG3332333E, "_ZN3aaa9GG3332333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3332333C1Ev();
extern void _ZN3aaa9GG3332333D1Ev();
Name_Map name_map__ZN3aaa9GG3332333E[] = {
  NSPAIR(_ZN3aaa9GG3332333C1Ev),
  NSPAIR(_ZN3aaa9GG3332333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA2E;
extern VTBL_ENTRY _ZTIN3aaa3AA2E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA2E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF233E;
extern VTBL_ENTRY _ZTIN3aaa5FF233E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF233E[];
static Base_Class bases__ZN3aaa9GG3332333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA2E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF233E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3332333E[];
extern void _ZN3aaa9GG33323333fooEv();
extern void _ZN3aaa9GG33323333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33323333fooEv,_ZThn8_N3aaa9GG33323333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33323333barEv,_ZThn8_N3aaa9GG33323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33323333barEv,_ZThn20_N3aaa9GG33323333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33323333fooEv,_ZThn20_N3aaa9GG33323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323333fooEv,_ZThn28_N3aaa9GG33323333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33323333barEv,_ZThn28_N3aaa9GG33323333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3332333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33323333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33323333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323333fooEv,_ZThn8_N3aaa9GG33323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33323333barEv,_ZThn8_N3aaa9GG33323333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323333barEv,_ZThn20_N3aaa9GG33323333barEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33323333fooEv,_ZThn20_N3aaa9GG33323333fooEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3332333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323333fooEv,_ZThn28_N3aaa9GG33323333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33323333barEv,_ZThn28_N3aaa9GG33323333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3332333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3332333E[];
Class_Descriptor cd__ZN3aaa9GG3332333E = {  "_ZN3aaa9GG3332333E", // class name
  bases__ZN3aaa9GG3332333E, 6,
  &(vtc__ZN3aaa9GG3332333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3332333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3332333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333111  : ::aaa::EE333 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33331113fooEv
  ~GG3333111(); // tgen
  GG3333111(); // tgen
};
//SIG(1 _ZN3aaa9GG3333111E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333111 ::foo(){vfunc_called(this, "_ZN3aaa9GG33331113fooEv");}
aaa::GG3333111 ::~GG3333111(){ note_dtor("_ZN3aaa9GG3333111E", this);} // tgen
aaa::GG3333111 ::GG3333111(){ note_ctor("_ZN3aaa9GG3333111E", this);} // tgen
}
static void Test__ZN3aaa9GG3333111E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333111E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333111E, buf);
    ::aaa::GG3333111 *dp, &lv = *(dp=new (buf) ::aaa::GG3333111());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333111E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333111E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333111E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333111E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333111E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3333111E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3333111E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3333111E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333111E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333111E);
    dp->::aaa::GG3333111::~GG3333111();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333111E(Test__ZN3aaa9GG3333111E, "_ZN3aaa9GG3333111E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333111C1Ev();
extern void _ZN3aaa9GG3333111D1Ev();
Name_Map name_map__ZN3aaa9GG3333111E[] = {
  NSPAIR(_ZN3aaa9GG3333111C1Ev),
  NSPAIR(_ZN3aaa9GG3333111D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3333111E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333111E[];
extern void _ZN3aaa9GG33331113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33331113fooEv,_ZThn8_N3aaa9GG33331113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331113fooEv,_ZThn20_N3aaa9GG33331113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33331113fooEv,_ZThn28_N3aaa9GG33331113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333111E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333111E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33331113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331113fooEv,_ZThn8_N3aaa9GG33331113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331113fooEv,_ZThn20_N3aaa9GG33331113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333111E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33331113fooEv,_ZThn28_N3aaa9GG33331113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333111E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333111E[];
Class_Descriptor cd__ZN3aaa9GG3333111E = {  "_ZN3aaa9GG3333111E", // class name
  bases__ZN3aaa9GG3333111E, 6,
  &(vtc__ZN3aaa9GG3333111E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333111E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333111E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333112  : ::aaa::EE333 , ::aaa::FF311 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33331123barEv
  ~GG3333112(); // tgen
  GG3333112(); // tgen
};
//SIG(1 _ZN3aaa9GG3333112E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333112 ::bar(){vfunc_called(this, "_ZN3aaa9GG33331123barEv");}
aaa::GG3333112 ::~GG3333112(){ note_dtor("_ZN3aaa9GG3333112E", this);} // tgen
aaa::GG3333112 ::GG3333112(){ note_ctor("_ZN3aaa9GG3333112E", this);} // tgen
}
static void Test__ZN3aaa9GG3333112E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333112E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333112E, buf);
    ::aaa::GG3333112 *dp, &lv = *(dp=new (buf) ::aaa::GG3333112());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333112E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333112E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333112E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333112E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333112E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3333112E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3333112E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3333112E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333112E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333112E);
    dp->::aaa::GG3333112::~GG3333112();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333112E(Test__ZN3aaa9GG3333112E, "_ZN3aaa9GG3333112E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333112C1Ev();
extern void _ZN3aaa9GG3333112D1Ev();
Name_Map name_map__ZN3aaa9GG3333112E[] = {
  NSPAIR(_ZN3aaa9GG3333112C1Ev),
  NSPAIR(_ZN3aaa9GG3333112D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3333112E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333112E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33331123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33331123barEv,_ZThn8_N3aaa9GG33331123barEv)();
extern void _ZN3aaa5FF3113fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33331123barEv,_ZThn20_N3aaa9GG33331123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333112E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33331123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331123barEv,_ZThn8_N3aaa9GG33331123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333112E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3113fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331123barEv,_ZThn20_N3aaa9GG33331123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333112E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3113fooEv,_ZThn8_N3aaa5FF3113fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333112E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333112E[];
Class_Descriptor cd__ZN3aaa9GG3333112E = {  "_ZN3aaa9GG3333112E", // class name
  bases__ZN3aaa9GG3333112E, 6,
  &(vtc__ZN3aaa9GG3333112E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333112E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333112E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333113  : ::aaa::EE333 , ::aaa::FF311 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33331133fooEv
  virtual void  bar(); // _ZN3aaa9GG33331133barEv
  ~GG3333113(); // tgen
  GG3333113(); // tgen
};
//SIG(1 _ZN3aaa9GG3333113E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333113 ::foo(){vfunc_called(this, "_ZN3aaa9GG33331133fooEv");}
void  aaa::GG3333113 ::bar(){vfunc_called(this, "_ZN3aaa9GG33331133barEv");}
aaa::GG3333113 ::~GG3333113(){ note_dtor("_ZN3aaa9GG3333113E", this);} // tgen
aaa::GG3333113 ::GG3333113(){ note_ctor("_ZN3aaa9GG3333113E", this);} // tgen
}
static void Test__ZN3aaa9GG3333113E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333113E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333113E, buf);
    ::aaa::GG3333113 *dp, &lv = *(dp=new (buf) ::aaa::GG3333113());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333113E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333113E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333113E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333113E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333113E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3333113E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF311*), ABISELECT(48,28), "_ZN3aaa9GG3333113E");
    check_base_class_offset(lv, (::aaa::FF311*), ABISELECT(32,20), "_ZN3aaa9GG3333113E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333113E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333113E);
    dp->::aaa::GG3333113::~GG3333113();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333113E(Test__ZN3aaa9GG3333113E, "_ZN3aaa9GG3333113E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333113C1Ev();
extern void _ZN3aaa9GG3333113D1Ev();
Name_Map name_map__ZN3aaa9GG3333113E[] = {
  NSPAIR(_ZN3aaa9GG3333113C1Ev),
  NSPAIR(_ZN3aaa9GG3333113D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF311E;
extern VTBL_ENTRY _ZTIN3aaa5FF311E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF311E[];
static Base_Class bases__ZN3aaa9GG3333113E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF311E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333113E[];
extern void _ZN3aaa9GG33331133fooEv();
extern void _ZN3aaa9GG33331133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33331133fooEv,_ZThn8_N3aaa9GG33331133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33331133barEv,_ZThn8_N3aaa9GG33331133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331133fooEv,_ZThn20_N3aaa9GG33331133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331133barEv,_ZThn20_N3aaa9GG33331133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33331133fooEv,_ZThn28_N3aaa9GG33331133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333113E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333113E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33331133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33331133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331133fooEv,_ZThn8_N3aaa9GG33331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331133barEv,_ZThn8_N3aaa9GG33331133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331133fooEv,_ZThn20_N3aaa9GG33331133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331133barEv,_ZThn20_N3aaa9GG33331133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333113E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33331133fooEv,_ZThn28_N3aaa9GG33331133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333113E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333113E[];
Class_Descriptor cd__ZN3aaa9GG3333113E = {  "_ZN3aaa9GG3333113E", // class name
  bases__ZN3aaa9GG3333113E, 6,
  &(vtc__ZN3aaa9GG3333113E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333113E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333113E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333121  : ::aaa::EE333 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33331213fooEv
  ~GG3333121(); // tgen
  GG3333121(); // tgen
};
//SIG(1 _ZN3aaa9GG3333121E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333121 ::foo(){vfunc_called(this, "_ZN3aaa9GG33331213fooEv");}
aaa::GG3333121 ::~GG3333121(){ note_dtor("_ZN3aaa9GG3333121E", this);} // tgen
aaa::GG3333121 ::GG3333121(){ note_ctor("_ZN3aaa9GG3333121E", this);} // tgen
}
static void Test__ZN3aaa9GG3333121E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333121E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333121E, buf);
    ::aaa::GG3333121 *dp, &lv = *(dp=new (buf) ::aaa::GG3333121());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333121E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333121E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333121E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333121E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333121E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3333121E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3333121E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3333121E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333121E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333121E);
    dp->::aaa::GG3333121::~GG3333121();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333121E(Test__ZN3aaa9GG3333121E, "_ZN3aaa9GG3333121E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333121C1Ev();
extern void _ZN3aaa9GG3333121D1Ev();
Name_Map name_map__ZN3aaa9GG3333121E[] = {
  NSPAIR(_ZN3aaa9GG3333121C1Ev),
  NSPAIR(_ZN3aaa9GG3333121D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3333121E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333121E[];
extern void _ZN3aaa9GG33331213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33331213fooEv,_ZThn8_N3aaa9GG33331213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331213fooEv,_ZThn20_N3aaa9GG33331213fooEv)();
extern void _ZN3aaa5FF3123barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33331213fooEv,_ZThn28_N3aaa9GG33331213fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333121E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333121E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33331213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331213fooEv,_ZThn8_N3aaa9GG33331213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331213fooEv,_ZThn20_N3aaa9GG33331213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3123barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333121E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33331213fooEv,_ZThn28_N3aaa9GG33331213fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333121E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333121E[];
Class_Descriptor cd__ZN3aaa9GG3333121E = {  "_ZN3aaa9GG3333121E", // class name
  bases__ZN3aaa9GG3333121E, 6,
  &(vtc__ZN3aaa9GG3333121E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333121E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333121E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333122  : ::aaa::EE333 , ::aaa::FF312 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33331223barEv
  ~GG3333122(); // tgen
  GG3333122(); // tgen
};
//SIG(1 _ZN3aaa9GG3333122E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333122 ::bar(){vfunc_called(this, "_ZN3aaa9GG33331223barEv");}
aaa::GG3333122 ::~GG3333122(){ note_dtor("_ZN3aaa9GG3333122E", this);} // tgen
aaa::GG3333122 ::GG3333122(){ note_ctor("_ZN3aaa9GG3333122E", this);} // tgen
}
static void Test__ZN3aaa9GG3333122E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333122E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333122E, buf);
    ::aaa::GG3333122 *dp, &lv = *(dp=new (buf) ::aaa::GG3333122());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333122E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333122E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333122E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333122E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333122E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3333122E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3333122E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3333122E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333122E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333122E);
    dp->::aaa::GG3333122::~GG3333122();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333122E(Test__ZN3aaa9GG3333122E, "_ZN3aaa9GG3333122E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333122C1Ev();
extern void _ZN3aaa9GG3333122D1Ev();
Name_Map name_map__ZN3aaa9GG3333122E[] = {
  NSPAIR(_ZN3aaa9GG3333122C1Ev),
  NSPAIR(_ZN3aaa9GG3333122D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3333122E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333122E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33331223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33331223barEv,_ZThn8_N3aaa9GG33331223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33331223barEv,_ZThn20_N3aaa9GG33331223barEv)();
extern void _ZN3aaa3BB13fooEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333122E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33331223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333122E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331223barEv,_ZThn8_N3aaa9GG33331223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331223barEv,_ZThn20_N3aaa9GG33331223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333122E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB13fooEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333122E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333122E[];
Class_Descriptor cd__ZN3aaa9GG3333122E = {  "_ZN3aaa9GG3333122E", // class name
  bases__ZN3aaa9GG3333122E, 6,
  &(vtc__ZN3aaa9GG3333122E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333122E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333122E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333123  : ::aaa::EE333 , ::aaa::FF312 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33331233fooEv
  virtual void  bar(); // _ZN3aaa9GG33331233barEv
  ~GG3333123(); // tgen
  GG3333123(); // tgen
};
//SIG(1 _ZN3aaa9GG3333123E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333123 ::foo(){vfunc_called(this, "_ZN3aaa9GG33331233fooEv");}
void  aaa::GG3333123 ::bar(){vfunc_called(this, "_ZN3aaa9GG33331233barEv");}
aaa::GG3333123 ::~GG3333123(){ note_dtor("_ZN3aaa9GG3333123E", this);} // tgen
aaa::GG3333123 ::GG3333123(){ note_ctor("_ZN3aaa9GG3333123E", this);} // tgen
}
static void Test__ZN3aaa9GG3333123E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333123E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333123E, buf);
    ::aaa::GG3333123 *dp, &lv = *(dp=new (buf) ::aaa::GG3333123());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333123E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333123E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333123E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333123E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333123E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3333123E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF312*), ABISELECT(48,28), "_ZN3aaa9GG3333123E");
    check_base_class_offset(lv, (::aaa::FF312*), ABISELECT(32,20), "_ZN3aaa9GG3333123E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333123E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333123E);
    dp->::aaa::GG3333123::~GG3333123();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333123E(Test__ZN3aaa9GG3333123E, "_ZN3aaa9GG3333123E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333123C1Ev();
extern void _ZN3aaa9GG3333123D1Ev();
Name_Map name_map__ZN3aaa9GG3333123E[] = {
  NSPAIR(_ZN3aaa9GG3333123C1Ev),
  NSPAIR(_ZN3aaa9GG3333123D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF312E;
extern VTBL_ENTRY _ZTIN3aaa5FF312E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF312E[];
static Base_Class bases__ZN3aaa9GG3333123E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF312E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333123E[];
extern void _ZN3aaa9GG33331233fooEv();
extern void _ZN3aaa9GG33331233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33331233fooEv,_ZThn8_N3aaa9GG33331233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33331233barEv,_ZThn8_N3aaa9GG33331233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331233fooEv,_ZThn20_N3aaa9GG33331233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331233barEv,_ZThn20_N3aaa9GG33331233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33331233fooEv,_ZThn28_N3aaa9GG33331233fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333123E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333123E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33331233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33331233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331233fooEv,_ZThn8_N3aaa9GG33331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331233barEv,_ZThn8_N3aaa9GG33331233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331233fooEv,_ZThn20_N3aaa9GG33331233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331233barEv,_ZThn20_N3aaa9GG33331233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333123E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33331233fooEv,_ZThn28_N3aaa9GG33331233fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333123E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333123E[];
Class_Descriptor cd__ZN3aaa9GG3333123E = {  "_ZN3aaa9GG3333123E", // class name
  bases__ZN3aaa9GG3333123E, 6,
  &(vtc__ZN3aaa9GG3333123E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333123E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333123E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333131  : ::aaa::EE333 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33331313fooEv
  ~GG3333131(); // tgen
  GG3333131(); // tgen
};
//SIG(1 _ZN3aaa9GG3333131E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333131 ::foo(){vfunc_called(this, "_ZN3aaa9GG33331313fooEv");}
aaa::GG3333131 ::~GG3333131(){ note_dtor("_ZN3aaa9GG3333131E", this);} // tgen
aaa::GG3333131 ::GG3333131(){ note_ctor("_ZN3aaa9GG3333131E", this);} // tgen
}
static void Test__ZN3aaa9GG3333131E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333131E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333131E, buf);
    ::aaa::GG3333131 *dp, &lv = *(dp=new (buf) ::aaa::GG3333131());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333131E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333131E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333131E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333131E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333131E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3333131E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3333131E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3333131E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333131E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333131E);
    dp->::aaa::GG3333131::~GG3333131();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333131E(Test__ZN3aaa9GG3333131E, "_ZN3aaa9GG3333131E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333131C1Ev();
extern void _ZN3aaa9GG3333131D1Ev();
Name_Map name_map__ZN3aaa9GG3333131E[] = {
  NSPAIR(_ZN3aaa9GG3333131C1Ev),
  NSPAIR(_ZN3aaa9GG3333131D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3333131E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333131E[];
extern void _ZN3aaa9GG33331313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33331313fooEv,_ZThn8_N3aaa9GG33331313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331313fooEv,_ZThn20_N3aaa9GG33331313fooEv)();
extern void _ZN3aaa5FF3133barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33331313fooEv,_ZThn28_N3aaa9GG33331313fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333131E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333131E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33331313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331313fooEv,_ZThn8_N3aaa9GG33331313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331313fooEv,_ZThn20_N3aaa9GG33331313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3133barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333131E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33331313fooEv,_ZThn28_N3aaa9GG33331313fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333131E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333131E[];
Class_Descriptor cd__ZN3aaa9GG3333131E = {  "_ZN3aaa9GG3333131E", // class name
  bases__ZN3aaa9GG3333131E, 6,
  &(vtc__ZN3aaa9GG3333131E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333131E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333131E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333132  : ::aaa::EE333 , ::aaa::FF313 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33331323barEv
  ~GG3333132(); // tgen
  GG3333132(); // tgen
};
//SIG(1 _ZN3aaa9GG3333132E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v3 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333132 ::bar(){vfunc_called(this, "_ZN3aaa9GG33331323barEv");}
aaa::GG3333132 ::~GG3333132(){ note_dtor("_ZN3aaa9GG3333132E", this);} // tgen
aaa::GG3333132 ::GG3333132(){ note_ctor("_ZN3aaa9GG3333132E", this);} // tgen
}
static void Test__ZN3aaa9GG3333132E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333132E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333132E, buf);
    ::aaa::GG3333132 *dp, &lv = *(dp=new (buf) ::aaa::GG3333132());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333132E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333132E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333132E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333132E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333132E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3333132E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3333132E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3333132E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333132E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333132E);
    dp->::aaa::GG3333132::~GG3333132();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333132E(Test__ZN3aaa9GG3333132E, "_ZN3aaa9GG3333132E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333132C1Ev();
extern void _ZN3aaa9GG3333132D1Ev();
Name_Map name_map__ZN3aaa9GG3333132E[] = {
  NSPAIR(_ZN3aaa9GG3333132C1Ev),
  NSPAIR(_ZN3aaa9GG3333132D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3333132E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333132E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33331323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33331323barEv,_ZThn8_N3aaa9GG33331323barEv)();
extern void _ZN3aaa5FF3133fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33331323barEv,_ZThn20_N3aaa9GG33331323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333132E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33331323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331323barEv,_ZThn8_N3aaa9GG33331323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333132E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3133fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331323barEv,_ZThn20_N3aaa9GG33331323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333132E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3133fooEv,_ZThn8_N3aaa5FF3133fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333132E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333132E[];
Class_Descriptor cd__ZN3aaa9GG3333132E = {  "_ZN3aaa9GG3333132E", // class name
  bases__ZN3aaa9GG3333132E, 6,
  &(vtc__ZN3aaa9GG3333132E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333132E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333132E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333133  : ::aaa::EE333 , ::aaa::FF313 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33331333fooEv
  virtual void  bar(); // _ZN3aaa9GG33331333barEv
  ~GG3333133(); // tgen
  GG3333133(); // tgen
};
//SIG(1 _ZN3aaa9GG3333133E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v1 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333133 ::foo(){vfunc_called(this, "_ZN3aaa9GG33331333fooEv");}
void  aaa::GG3333133 ::bar(){vfunc_called(this, "_ZN3aaa9GG33331333barEv");}
aaa::GG3333133 ::~GG3333133(){ note_dtor("_ZN3aaa9GG3333133E", this);} // tgen
aaa::GG3333133 ::GG3333133(){ note_ctor("_ZN3aaa9GG3333133E", this);} // tgen
}
static void Test__ZN3aaa9GG3333133E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333133E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333133E, buf);
    ::aaa::GG3333133 *dp, &lv = *(dp=new (buf) ::aaa::GG3333133());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333133E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333133E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333133E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333133E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333133E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3333133E");
    check_base_class_offset(lv, (::aaa::BB1*)(::aaa::FF313*), ABISELECT(48,28), "_ZN3aaa9GG3333133E");
    check_base_class_offset(lv, (::aaa::FF313*), ABISELECT(32,20), "_ZN3aaa9GG3333133E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333133E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333133E);
    dp->::aaa::GG3333133::~GG3333133();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333133E(Test__ZN3aaa9GG3333133E, "_ZN3aaa9GG3333133E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333133C1Ev();
extern void _ZN3aaa9GG3333133D1Ev();
Name_Map name_map__ZN3aaa9GG3333133E[] = {
  NSPAIR(_ZN3aaa9GG3333133C1Ev),
  NSPAIR(_ZN3aaa9GG3333133D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB1E;
extern VTBL_ENTRY _ZTIN3aaa3BB1E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB1E[];
extern Class_Descriptor cd__ZN3aaa5FF313E;
extern VTBL_ENTRY _ZTIN3aaa5FF313E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF313E[];
static Base_Class bases__ZN3aaa9GG3333133E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB1E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF313E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333133E[];
extern void _ZN3aaa9GG33331333fooEv();
extern void _ZN3aaa9GG33331333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33331333fooEv,_ZThn8_N3aaa9GG33331333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33331333barEv,_ZThn8_N3aaa9GG33331333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331333fooEv,_ZThn20_N3aaa9GG33331333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33331333barEv,_ZThn20_N3aaa9GG33331333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33331333fooEv,_ZThn28_N3aaa9GG33331333fooEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333133E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333133E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33331333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33331333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331333fooEv,_ZThn8_N3aaa9GG33331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33331333barEv,_ZThn8_N3aaa9GG33331333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331333fooEv,_ZThn20_N3aaa9GG33331333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33331333barEv,_ZThn20_N3aaa9GG33331333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333133E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33331333fooEv,_ZThn28_N3aaa9GG33331333fooEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333133E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333133E[];
Class_Descriptor cd__ZN3aaa9GG3333133E = {  "_ZN3aaa9GG3333133E", // class name
  bases__ZN3aaa9GG3333133E, 6,
  &(vtc__ZN3aaa9GG3333133E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333133E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333133E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333211  : ::aaa::EE333 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33332113fooEv
  ~GG3333211(); // tgen
  GG3333211(); // tgen
};
//SIG(1 _ZN3aaa9GG3333211E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333211 ::foo(){vfunc_called(this, "_ZN3aaa9GG33332113fooEv");}
aaa::GG3333211 ::~GG3333211(){ note_dtor("_ZN3aaa9GG3333211E", this);} // tgen
aaa::GG3333211 ::GG3333211(){ note_ctor("_ZN3aaa9GG3333211E", this);} // tgen
}
static void Test__ZN3aaa9GG3333211E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333211E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333211E, buf);
    ::aaa::GG3333211 *dp, &lv = *(dp=new (buf) ::aaa::GG3333211());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333211E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333211E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333211E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333211E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333211E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3333211E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3333211E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3333211E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333211E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333211E);
    dp->::aaa::GG3333211::~GG3333211();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333211E(Test__ZN3aaa9GG3333211E, "_ZN3aaa9GG3333211E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333211C1Ev();
extern void _ZN3aaa9GG3333211D1Ev();
Name_Map name_map__ZN3aaa9GG3333211E[] = {
  NSPAIR(_ZN3aaa9GG3333211C1Ev),
  NSPAIR(_ZN3aaa9GG3333211D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3333211E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333211E[];
extern void _ZN3aaa9GG33332113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33332113fooEv,_ZThn8_N3aaa9GG33332113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332113fooEv,_ZThn20_N3aaa9GG33332113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void _ZN3aaa3BB23barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333211E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333211E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33332113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332113fooEv,_ZThn8_N3aaa9GG33332113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333211E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332113fooEv,_ZThn20_N3aaa9GG33332113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333211E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB23barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333211E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333211E[];
Class_Descriptor cd__ZN3aaa9GG3333211E = {  "_ZN3aaa9GG3333211E", // class name
  bases__ZN3aaa9GG3333211E, 6,
  &(vtc__ZN3aaa9GG3333211E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333211E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333211E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333212  : ::aaa::EE333 , ::aaa::FF321 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33332123barEv
  ~GG3333212(); // tgen
  GG3333212(); // tgen
};
//SIG(1 _ZN3aaa9GG3333212E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333212 ::bar(){vfunc_called(this, "_ZN3aaa9GG33332123barEv");}
aaa::GG3333212 ::~GG3333212(){ note_dtor("_ZN3aaa9GG3333212E", this);} // tgen
aaa::GG3333212 ::GG3333212(){ note_ctor("_ZN3aaa9GG3333212E", this);} // tgen
}
static void Test__ZN3aaa9GG3333212E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333212E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333212E, buf);
    ::aaa::GG3333212 *dp, &lv = *(dp=new (buf) ::aaa::GG3333212());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333212E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333212E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333212E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333212E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333212E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3333212E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3333212E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3333212E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333212E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333212E);
    dp->::aaa::GG3333212::~GG3333212();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333212E(Test__ZN3aaa9GG3333212E, "_ZN3aaa9GG3333212E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333212C1Ev();
extern void _ZN3aaa9GG3333212D1Ev();
Name_Map name_map__ZN3aaa9GG3333212E[] = {
  NSPAIR(_ZN3aaa9GG3333212C1Ev),
  NSPAIR(_ZN3aaa9GG3333212D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3333212E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333212E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33332123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33332123barEv,_ZThn8_N3aaa9GG33332123barEv)();
extern void _ZN3aaa5FF3213fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33332123barEv,_ZThn20_N3aaa9GG33332123barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33332123barEv,_ZThn28_N3aaa9GG33332123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333212E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33332123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332123barEv,_ZThn8_N3aaa9GG33332123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333212E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3213fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332123barEv,_ZThn20_N3aaa9GG33332123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333212E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33332123barEv,_ZThn28_N3aaa9GG33332123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333212E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333212E[];
Class_Descriptor cd__ZN3aaa9GG3333212E = {  "_ZN3aaa9GG3333212E", // class name
  bases__ZN3aaa9GG3333212E, 6,
  &(vtc__ZN3aaa9GG3333212E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333212E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333212E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333213  : ::aaa::EE333 , ::aaa::FF321 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33332133fooEv
  virtual void  bar(); // _ZN3aaa9GG33332133barEv
  ~GG3333213(); // tgen
  GG3333213(); // tgen
};
//SIG(1 _ZN3aaa9GG3333213E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333213 ::foo(){vfunc_called(this, "_ZN3aaa9GG33332133fooEv");}
void  aaa::GG3333213 ::bar(){vfunc_called(this, "_ZN3aaa9GG33332133barEv");}
aaa::GG3333213 ::~GG3333213(){ note_dtor("_ZN3aaa9GG3333213E", this);} // tgen
aaa::GG3333213 ::GG3333213(){ note_ctor("_ZN3aaa9GG3333213E", this);} // tgen
}
static void Test__ZN3aaa9GG3333213E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333213E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333213E, buf);
    ::aaa::GG3333213 *dp, &lv = *(dp=new (buf) ::aaa::GG3333213());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333213E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333213E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333213E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333213E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333213E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3333213E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF321*), ABISELECT(48,28), "_ZN3aaa9GG3333213E");
    check_base_class_offset(lv, (::aaa::FF321*), ABISELECT(32,20), "_ZN3aaa9GG3333213E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333213E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333213E);
    dp->::aaa::GG3333213::~GG3333213();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333213E(Test__ZN3aaa9GG3333213E, "_ZN3aaa9GG3333213E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333213C1Ev();
extern void _ZN3aaa9GG3333213D1Ev();
Name_Map name_map__ZN3aaa9GG3333213E[] = {
  NSPAIR(_ZN3aaa9GG3333213C1Ev),
  NSPAIR(_ZN3aaa9GG3333213D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF321E;
extern VTBL_ENTRY _ZTIN3aaa5FF321E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF321E[];
static Base_Class bases__ZN3aaa9GG3333213E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF321E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333213E[];
extern void _ZN3aaa9GG33332133fooEv();
extern void _ZN3aaa9GG33332133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33332133fooEv,_ZThn8_N3aaa9GG33332133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33332133barEv,_ZThn8_N3aaa9GG33332133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332133fooEv,_ZThn20_N3aaa9GG33332133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332133barEv,_ZThn20_N3aaa9GG33332133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33332133barEv,_ZThn28_N3aaa9GG33332133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333213E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333213E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33332133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33332133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332133fooEv,_ZThn8_N3aaa9GG33332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332133barEv,_ZThn8_N3aaa9GG33332133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332133fooEv,_ZThn20_N3aaa9GG33332133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332133barEv,_ZThn20_N3aaa9GG33332133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333213E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33332133barEv,_ZThn28_N3aaa9GG33332133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333213E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333213E[];
Class_Descriptor cd__ZN3aaa9GG3333213E = {  "_ZN3aaa9GG3333213E", // class name
  bases__ZN3aaa9GG3333213E, 6,
  &(vtc__ZN3aaa9GG3333213E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333213E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333213E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333221  : ::aaa::EE333 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33332213fooEv
  ~GG3333221(); // tgen
  GG3333221(); // tgen
};
//SIG(1 _ZN3aaa9GG3333221E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333221 ::foo(){vfunc_called(this, "_ZN3aaa9GG33332213fooEv");}
aaa::GG3333221 ::~GG3333221(){ note_dtor("_ZN3aaa9GG3333221E", this);} // tgen
aaa::GG3333221 ::GG3333221(){ note_ctor("_ZN3aaa9GG3333221E", this);} // tgen
}
static void Test__ZN3aaa9GG3333221E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333221E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333221E, buf);
    ::aaa::GG3333221 *dp, &lv = *(dp=new (buf) ::aaa::GG3333221());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333221E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333221E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333221E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333221E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333221E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3333221E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3333221E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3333221E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333221E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333221E);
    dp->::aaa::GG3333221::~GG3333221();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333221E(Test__ZN3aaa9GG3333221E, "_ZN3aaa9GG3333221E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333221C1Ev();
extern void _ZN3aaa9GG3333221D1Ev();
Name_Map name_map__ZN3aaa9GG3333221E[] = {
  NSPAIR(_ZN3aaa9GG3333221C1Ev),
  NSPAIR(_ZN3aaa9GG3333221D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3333221E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333221E[];
extern void _ZN3aaa9GG33332213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33332213fooEv,_ZThn8_N3aaa9GG33332213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332213fooEv,_ZThn20_N3aaa9GG33332213fooEv)();
extern void _ZN3aaa5FF3223barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333221E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333221E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33332213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332213fooEv,_ZThn8_N3aaa9GG33332213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332213fooEv,_ZThn20_N3aaa9GG33332213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3223barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333221E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3223barEv,_ZThn8_N3aaa5FF3223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333221E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333221E[];
Class_Descriptor cd__ZN3aaa9GG3333221E = {  "_ZN3aaa9GG3333221E", // class name
  bases__ZN3aaa9GG3333221E, 6,
  &(vtc__ZN3aaa9GG3333221E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333221E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333221E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333222  : ::aaa::EE333 , ::aaa::FF322 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33332223barEv
  ~GG3333222(); // tgen
  GG3333222(); // tgen
};
//SIG(1 _ZN3aaa9GG3333222E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333222 ::bar(){vfunc_called(this, "_ZN3aaa9GG33332223barEv");}
aaa::GG3333222 ::~GG3333222(){ note_dtor("_ZN3aaa9GG3333222E", this);} // tgen
aaa::GG3333222 ::GG3333222(){ note_ctor("_ZN3aaa9GG3333222E", this);} // tgen
}
static void Test__ZN3aaa9GG3333222E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333222E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333222E, buf);
    ::aaa::GG3333222 *dp, &lv = *(dp=new (buf) ::aaa::GG3333222());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333222E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333222E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333222E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333222E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333222E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3333222E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3333222E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3333222E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333222E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333222E);
    dp->::aaa::GG3333222::~GG3333222();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333222E(Test__ZN3aaa9GG3333222E, "_ZN3aaa9GG3333222E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333222C1Ev();
extern void _ZN3aaa9GG3333222D1Ev();
Name_Map name_map__ZN3aaa9GG3333222E[] = {
  NSPAIR(_ZN3aaa9GG3333222C1Ev),
  NSPAIR(_ZN3aaa9GG3333222D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3333222E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333222E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33332223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33332223barEv,_ZThn8_N3aaa9GG33332223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33332223barEv,_ZThn20_N3aaa9GG33332223barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33332223barEv,_ZThn28_N3aaa9GG33332223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333222E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333222E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33332223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332223barEv,_ZThn8_N3aaa9GG33332223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333222E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332223barEv,_ZThn20_N3aaa9GG33332223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333222E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33332223barEv,_ZThn28_N3aaa9GG33332223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333222E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333222E[];
Class_Descriptor cd__ZN3aaa9GG3333222E = {  "_ZN3aaa9GG3333222E", // class name
  bases__ZN3aaa9GG3333222E, 6,
  &(vtc__ZN3aaa9GG3333222E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333222E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333222E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333223  : ::aaa::EE333 , ::aaa::FF322 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33332233fooEv
  virtual void  bar(); // _ZN3aaa9GG33332233barEv
  ~GG3333223(); // tgen
  GG3333223(); // tgen
};
//SIG(1 _ZN3aaa9GG3333223E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333223 ::foo(){vfunc_called(this, "_ZN3aaa9GG33332233fooEv");}
void  aaa::GG3333223 ::bar(){vfunc_called(this, "_ZN3aaa9GG33332233barEv");}
aaa::GG3333223 ::~GG3333223(){ note_dtor("_ZN3aaa9GG3333223E", this);} // tgen
aaa::GG3333223 ::GG3333223(){ note_ctor("_ZN3aaa9GG3333223E", this);} // tgen
}
static void Test__ZN3aaa9GG3333223E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333223E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333223E, buf);
    ::aaa::GG3333223 *dp, &lv = *(dp=new (buf) ::aaa::GG3333223());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333223E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333223E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333223E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333223E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333223E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3333223E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF322*), ABISELECT(48,28), "_ZN3aaa9GG3333223E");
    check_base_class_offset(lv, (::aaa::FF322*), ABISELECT(32,20), "_ZN3aaa9GG3333223E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333223E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333223E);
    dp->::aaa::GG3333223::~GG3333223();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333223E(Test__ZN3aaa9GG3333223E, "_ZN3aaa9GG3333223E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333223C1Ev();
extern void _ZN3aaa9GG3333223D1Ev();
Name_Map name_map__ZN3aaa9GG3333223E[] = {
  NSPAIR(_ZN3aaa9GG3333223C1Ev),
  NSPAIR(_ZN3aaa9GG3333223D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF322E;
extern VTBL_ENTRY _ZTIN3aaa5FF322E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF322E[];
static Base_Class bases__ZN3aaa9GG3333223E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF322E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333223E[];
extern void _ZN3aaa9GG33332233fooEv();
extern void _ZN3aaa9GG33332233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33332233fooEv,_ZThn8_N3aaa9GG33332233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33332233barEv,_ZThn8_N3aaa9GG33332233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332233fooEv,_ZThn20_N3aaa9GG33332233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332233barEv,_ZThn20_N3aaa9GG33332233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33332233barEv,_ZThn28_N3aaa9GG33332233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333223E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333223E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33332233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33332233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332233fooEv,_ZThn8_N3aaa9GG33332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332233barEv,_ZThn8_N3aaa9GG33332233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332233fooEv,_ZThn20_N3aaa9GG33332233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332233barEv,_ZThn20_N3aaa9GG33332233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333223E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33332233barEv,_ZThn28_N3aaa9GG33332233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333223E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333223E[];
Class_Descriptor cd__ZN3aaa9GG3333223E = {  "_ZN3aaa9GG3333223E", // class name
  bases__ZN3aaa9GG3333223E, 6,
  &(vtc__ZN3aaa9GG3333223E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333223E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333223E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333231  : ::aaa::EE333 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33332313fooEv
  ~GG3333231(); // tgen
  GG3333231(); // tgen
};
//SIG(1 _ZN3aaa9GG3333231E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v3 Fi} v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333231 ::foo(){vfunc_called(this, "_ZN3aaa9GG33332313fooEv");}
aaa::GG3333231 ::~GG3333231(){ note_dtor("_ZN3aaa9GG3333231E", this);} // tgen
aaa::GG3333231 ::GG3333231(){ note_ctor("_ZN3aaa9GG3333231E", this);} // tgen
}
static void Test__ZN3aaa9GG3333231E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333231E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333231E, buf);
    ::aaa::GG3333231 *dp, &lv = *(dp=new (buf) ::aaa::GG3333231());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333231E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333231E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333231E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333231E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333231E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3333231E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3333231E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3333231E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333231E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333231E);
    dp->::aaa::GG3333231::~GG3333231();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333231E(Test__ZN3aaa9GG3333231E, "_ZN3aaa9GG3333231E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333231C1Ev();
extern void _ZN3aaa9GG3333231D1Ev();
Name_Map name_map__ZN3aaa9GG3333231E[] = {
  NSPAIR(_ZN3aaa9GG3333231C1Ev),
  NSPAIR(_ZN3aaa9GG3333231D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3333231E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333231E[];
extern void _ZN3aaa9GG33332313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33332313fooEv,_ZThn8_N3aaa9GG33332313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332313fooEv,_ZThn20_N3aaa9GG33332313fooEv)();
extern void _ZN3aaa5FF3233barEv();
extern void ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333231E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333231E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33332313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332313fooEv,_ZThn8_N3aaa9GG33332313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332313fooEv,_ZThn20_N3aaa9GG33332313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3233barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333231E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3233barEv,_ZThn8_N3aaa5FF3233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333231E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333231E[];
Class_Descriptor cd__ZN3aaa9GG3333231E = {  "_ZN3aaa9GG3333231E", // class name
  bases__ZN3aaa9GG3333231E, 6,
  &(vtc__ZN3aaa9GG3333231E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333231E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333231E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333232  : ::aaa::EE333 , ::aaa::FF323 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33332323barEv
  ~GG3333232(); // tgen
  GG3333232(); // tgen
};
//SIG(1 _ZN3aaa9GG3333232E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC6{ v1 Fi} v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333232 ::bar(){vfunc_called(this, "_ZN3aaa9GG33332323barEv");}
aaa::GG3333232 ::~GG3333232(){ note_dtor("_ZN3aaa9GG3333232E", this);} // tgen
aaa::GG3333232 ::GG3333232(){ note_ctor("_ZN3aaa9GG3333232E", this);} // tgen
}
static void Test__ZN3aaa9GG3333232E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333232E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333232E, buf);
    ::aaa::GG3333232 *dp, &lv = *(dp=new (buf) ::aaa::GG3333232());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333232E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333232E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333232E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333232E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333232E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3333232E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3333232E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3333232E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333232E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333232E);
    dp->::aaa::GG3333232::~GG3333232();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333232E(Test__ZN3aaa9GG3333232E, "_ZN3aaa9GG3333232E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333232C1Ev();
extern void _ZN3aaa9GG3333232D1Ev();
Name_Map name_map__ZN3aaa9GG3333232E[] = {
  NSPAIR(_ZN3aaa9GG3333232C1Ev),
  NSPAIR(_ZN3aaa9GG3333232D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3333232E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333232E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33332323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33332323barEv,_ZThn8_N3aaa9GG33332323barEv)();
extern void _ZN3aaa5FF3233fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33332323barEv,_ZThn20_N3aaa9GG33332323barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33332323barEv,_ZThn28_N3aaa9GG33332323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333232E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33332323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332323barEv,_ZThn8_N3aaa9GG33332323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333232E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3233fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332323barEv,_ZThn20_N3aaa9GG33332323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333232E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33332323barEv,_ZThn28_N3aaa9GG33332323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333232E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333232E[];
Class_Descriptor cd__ZN3aaa9GG3333232E = {  "_ZN3aaa9GG3333232E", // class name
  bases__ZN3aaa9GG3333232E, 6,
  &(vtc__ZN3aaa9GG3333232E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333232E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333232E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333233  : ::aaa::EE333 , ::aaa::FF323 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33332333fooEv
  virtual void  bar(); // _ZN3aaa9GG33332333barEv
  ~GG3333233(); // tgen
  GG3333233(); // tgen
};
//SIG(1 _ZN3aaa9GG3333233E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC6{ v2 Fi} v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333233 ::foo(){vfunc_called(this, "_ZN3aaa9GG33332333fooEv");}
void  aaa::GG3333233 ::bar(){vfunc_called(this, "_ZN3aaa9GG33332333barEv");}
aaa::GG3333233 ::~GG3333233(){ note_dtor("_ZN3aaa9GG3333233E", this);} // tgen
aaa::GG3333233 ::GG3333233(){ note_ctor("_ZN3aaa9GG3333233E", this);} // tgen
}
static void Test__ZN3aaa9GG3333233E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333233E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333233E, buf);
    ::aaa::GG3333233 *dp, &lv = *(dp=new (buf) ::aaa::GG3333233());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333233E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333233E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333233E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333233E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333233E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3333233E");
    check_base_class_offset(lv, (::aaa::BB2*)(::aaa::FF323*), ABISELECT(48,28), "_ZN3aaa9GG3333233E");
    check_base_class_offset(lv, (::aaa::FF323*), ABISELECT(32,20), "_ZN3aaa9GG3333233E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333233E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333233E);
    dp->::aaa::GG3333233::~GG3333233();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333233E(Test__ZN3aaa9GG3333233E, "_ZN3aaa9GG3333233E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333233C1Ev();
extern void _ZN3aaa9GG3333233D1Ev();
Name_Map name_map__ZN3aaa9GG3333233E[] = {
  NSPAIR(_ZN3aaa9GG3333233C1Ev),
  NSPAIR(_ZN3aaa9GG3333233D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB2E;
extern VTBL_ENTRY _ZTIN3aaa3BB2E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB2E[];
extern Class_Descriptor cd__ZN3aaa5FF323E;
extern VTBL_ENTRY _ZTIN3aaa5FF323E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF323E[];
static Base_Class bases__ZN3aaa9GG3333233E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB2E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF323E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333233E[];
extern void _ZN3aaa9GG33332333fooEv();
extern void _ZN3aaa9GG33332333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33332333fooEv,_ZThn8_N3aaa9GG33332333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33332333barEv,_ZThn8_N3aaa9GG33332333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332333fooEv,_ZThn20_N3aaa9GG33332333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33332333barEv,_ZThn20_N3aaa9GG33332333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33332333barEv,_ZThn28_N3aaa9GG33332333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333233E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333233E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33332333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33332333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332333fooEv,_ZThn8_N3aaa9GG33332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33332333barEv,_ZThn8_N3aaa9GG33332333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332333fooEv,_ZThn20_N3aaa9GG33332333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33332333barEv,_ZThn20_N3aaa9GG33332333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333233E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33332333barEv,_ZThn28_N3aaa9GG33332333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333233E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333233E[];
Class_Descriptor cd__ZN3aaa9GG3333233E = {  "_ZN3aaa9GG3333233E", // class name
  bases__ZN3aaa9GG3333233E, 6,
  &(vtc__ZN3aaa9GG3333233E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333233E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333233E),15, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333311  : ::aaa::EE333 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33333113fooEv
  ~GG3333311(); // tgen
  GG3333311(); // tgen
};
//SIG(1 _ZN3aaa9GG3333311E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333311 ::foo(){vfunc_called(this, "_ZN3aaa9GG33333113fooEv");}
aaa::GG3333311 ::~GG3333311(){ note_dtor("_ZN3aaa9GG3333311E", this);} // tgen
aaa::GG3333311 ::GG3333311(){ note_ctor("_ZN3aaa9GG3333311E", this);} // tgen
}
static void Test__ZN3aaa9GG3333311E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333311E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333311E, buf);
    ::aaa::GG3333311 *dp, &lv = *(dp=new (buf) ::aaa::GG3333311());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333311E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333311E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333311E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333311E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3333311E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3333311E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3333311E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333311E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333311E);
    dp->::aaa::GG3333311::~GG3333311();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333311E(Test__ZN3aaa9GG3333311E, "_ZN3aaa9GG3333311E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333311C1Ev();
extern void _ZN3aaa9GG3333311D1Ev();
Name_Map name_map__ZN3aaa9GG3333311E[] = {
  NSPAIR(_ZN3aaa9GG3333311C1Ev),
  NSPAIR(_ZN3aaa9GG3333311D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3333311E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333311E[];
extern void _ZN3aaa9GG33333113fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33333113fooEv,_ZThn8_N3aaa9GG33333113fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333113fooEv,_ZThn20_N3aaa9GG33333113fooEv)();
extern void _ZN3aaa3AA33barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33333113fooEv,_ZThn28_N3aaa9GG33333113fooEv)();
extern void _ZN3aaa3BB33barEv();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333311E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333311E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33333113fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333113fooEv,_ZThn8_N3aaa9GG33333113fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333113fooEv,_ZThn20_N3aaa9GG33333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3AA33barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333311E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333113fooEv,_ZThn28_N3aaa9GG33333113fooEv),
  (VTBL_ENTRY)&_ZN3aaa3BB33barEv,
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333311E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333311E[];
Class_Descriptor cd__ZN3aaa9GG3333311E = {  "_ZN3aaa9GG3333311E", // class name
  bases__ZN3aaa9GG3333311E, 6,
  &(vtc__ZN3aaa9GG3333311E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333311E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333311E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333312  : ::aaa::EE333 , ::aaa::FF331 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33333123barEv
  ~GG3333312(); // tgen
  GG3333312(); // tgen
};
//SIG(1 _ZN3aaa9GG3333312E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333312 ::bar(){vfunc_called(this, "_ZN3aaa9GG33333123barEv");}
aaa::GG3333312 ::~GG3333312(){ note_dtor("_ZN3aaa9GG3333312E", this);} // tgen
aaa::GG3333312 ::GG3333312(){ note_ctor("_ZN3aaa9GG3333312E", this);} // tgen
}
static void Test__ZN3aaa9GG3333312E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333312E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333312E, buf);
    ::aaa::GG3333312 *dp, &lv = *(dp=new (buf) ::aaa::GG3333312());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333312E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333312E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333312E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333312E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3333312E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3333312E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3333312E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333312E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333312E);
    dp->::aaa::GG3333312::~GG3333312();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333312E(Test__ZN3aaa9GG3333312E, "_ZN3aaa9GG3333312E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333312C1Ev();
extern void _ZN3aaa9GG3333312D1Ev();
Name_Map name_map__ZN3aaa9GG3333312E[] = {
  NSPAIR(_ZN3aaa9GG3333312C1Ev),
  NSPAIR(_ZN3aaa9GG3333312D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3333312E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333312E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33333123barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33333123barEv,_ZThn8_N3aaa9GG33333123barEv)();
extern void _ZN3aaa5FF3313fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33333123barEv,_ZThn20_N3aaa9GG33333123barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33333123barEv,_ZThn28_N3aaa9GG33333123barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333312E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33333123barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333123barEv,_ZThn8_N3aaa9GG33333123barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333312E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3313fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333123barEv,_ZThn20_N3aaa9GG33333123barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333312E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3313fooEv,_ZThn8_N3aaa5FF3313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333123barEv,_ZThn28_N3aaa9GG33333123barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333312E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333312E[];
Class_Descriptor cd__ZN3aaa9GG3333312E = {  "_ZN3aaa9GG3333312E", // class name
  bases__ZN3aaa9GG3333312E, 6,
  &(vtc__ZN3aaa9GG3333312E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333312E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333312E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333313  : ::aaa::EE333 , ::aaa::FF331 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33333133fooEv
  virtual void  bar(); // _ZN3aaa9GG33333133barEv
  ~GG3333313(); // tgen
  GG3333313(); // tgen
};
//SIG(1 _ZN3aaa9GG3333313E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333313 ::foo(){vfunc_called(this, "_ZN3aaa9GG33333133fooEv");}
void  aaa::GG3333313 ::bar(){vfunc_called(this, "_ZN3aaa9GG33333133barEv");}
aaa::GG3333313 ::~GG3333313(){ note_dtor("_ZN3aaa9GG3333313E", this);} // tgen
aaa::GG3333313 ::GG3333313(){ note_ctor("_ZN3aaa9GG3333313E", this);} // tgen
}
static void Test__ZN3aaa9GG3333313E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333313E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333313E, buf);
    ::aaa::GG3333313 *dp, &lv = *(dp=new (buf) ::aaa::GG3333313());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333313E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333313E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333313E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333313E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3333313E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF331*), ABISELECT(48,28), "_ZN3aaa9GG3333313E");
    check_base_class_offset(lv, (::aaa::FF331*), ABISELECT(32,20), "_ZN3aaa9GG3333313E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333313E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333313E);
    dp->::aaa::GG3333313::~GG3333313();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333313E(Test__ZN3aaa9GG3333313E, "_ZN3aaa9GG3333313E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333313C1Ev();
extern void _ZN3aaa9GG3333313D1Ev();
Name_Map name_map__ZN3aaa9GG3333313E[] = {
  NSPAIR(_ZN3aaa9GG3333313C1Ev),
  NSPAIR(_ZN3aaa9GG3333313D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF331E;
extern VTBL_ENTRY _ZTIN3aaa5FF331E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF331E[];
static Base_Class bases__ZN3aaa9GG3333313E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF331E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333313E[];
extern void _ZN3aaa9GG33333133fooEv();
extern void _ZN3aaa9GG33333133barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33333133fooEv,_ZThn8_N3aaa9GG33333133fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33333133barEv,_ZThn8_N3aaa9GG33333133barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333133fooEv,_ZThn20_N3aaa9GG33333133fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333133barEv,_ZThn20_N3aaa9GG33333133barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33333133fooEv,_ZThn28_N3aaa9GG33333133fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33333133barEv,_ZThn28_N3aaa9GG33333133barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333313E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333313E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33333133fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33333133barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333133fooEv,_ZThn8_N3aaa9GG33333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333133barEv,_ZThn8_N3aaa9GG33333133barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333133fooEv,_ZThn20_N3aaa9GG33333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333133barEv,_ZThn20_N3aaa9GG33333133barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333313E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333133fooEv,_ZThn28_N3aaa9GG33333133fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333133barEv,_ZThn28_N3aaa9GG33333133barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333313E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333313E[];
Class_Descriptor cd__ZN3aaa9GG3333313E = {  "_ZN3aaa9GG3333313E", // class name
  bases__ZN3aaa9GG3333313E, 6,
  &(vtc__ZN3aaa9GG3333313E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333313E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333313E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333321  : ::aaa::EE333 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33333213fooEv
  ~GG3333321(); // tgen
  GG3333321(); // tgen
};
//SIG(1 _ZN3aaa9GG3333321E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333321 ::foo(){vfunc_called(this, "_ZN3aaa9GG33333213fooEv");}
aaa::GG3333321 ::~GG3333321(){ note_dtor("_ZN3aaa9GG3333321E", this);} // tgen
aaa::GG3333321 ::GG3333321(){ note_ctor("_ZN3aaa9GG3333321E", this);} // tgen
}
static void Test__ZN3aaa9GG3333321E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333321E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333321E, buf);
    ::aaa::GG3333321 *dp, &lv = *(dp=new (buf) ::aaa::GG3333321());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333321E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333321E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333321E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333321E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3333321E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3333321E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3333321E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333321E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333321E);
    dp->::aaa::GG3333321::~GG3333321();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333321E(Test__ZN3aaa9GG3333321E, "_ZN3aaa9GG3333321E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333321C1Ev();
extern void _ZN3aaa9GG3333321D1Ev();
Name_Map name_map__ZN3aaa9GG3333321E[] = {
  NSPAIR(_ZN3aaa9GG3333321C1Ev),
  NSPAIR(_ZN3aaa9GG3333321D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3333321E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333321E[];
extern void _ZN3aaa9GG33333213fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33333213fooEv,_ZThn8_N3aaa9GG33333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333213fooEv,_ZThn20_N3aaa9GG33333213fooEv)();
extern void _ZN3aaa5FF3323barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33333213fooEv,_ZThn28_N3aaa9GG33333213fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333321E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333321E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33333213fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333213fooEv,_ZThn8_N3aaa9GG33333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333213fooEv,_ZThn20_N3aaa9GG33333213fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3323barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333321E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333213fooEv,_ZThn28_N3aaa9GG33333213fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3323barEv,_ZThn8_N3aaa5FF3323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333321E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333321E[];
Class_Descriptor cd__ZN3aaa9GG3333321E = {  "_ZN3aaa9GG3333321E", // class name
  bases__ZN3aaa9GG3333321E, 6,
  &(vtc__ZN3aaa9GG3333321E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333321E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333321E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333322  : ::aaa::EE333 , ::aaa::FF332 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33333223barEv
  ~GG3333322(); // tgen
  GG3333322(); // tgen
};
//SIG(1 _ZN3aaa9GG3333322E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333322 ::bar(){vfunc_called(this, "_ZN3aaa9GG33333223barEv");}
aaa::GG3333322 ::~GG3333322(){ note_dtor("_ZN3aaa9GG3333322E", this);} // tgen
aaa::GG3333322 ::GG3333322(){ note_ctor("_ZN3aaa9GG3333322E", this);} // tgen
}
static void Test__ZN3aaa9GG3333322E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333322E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333322E, buf);
    ::aaa::GG3333322 *dp, &lv = *(dp=new (buf) ::aaa::GG3333322());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333322E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333322E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333322E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333322E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3333322E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3333322E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3333322E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333322E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333322E);
    dp->::aaa::GG3333322::~GG3333322();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333322E(Test__ZN3aaa9GG3333322E, "_ZN3aaa9GG3333322E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333322C1Ev();
extern void _ZN3aaa9GG3333322D1Ev();
Name_Map name_map__ZN3aaa9GG3333322E[] = {
  NSPAIR(_ZN3aaa9GG3333322C1Ev),
  NSPAIR(_ZN3aaa9GG3333322D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3333322E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333322E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33333223barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33333223barEv,_ZThn8_N3aaa9GG33333223barEv)();
extern void _ZN3aaa3AA33fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33333223barEv,_ZThn20_N3aaa9GG33333223barEv)();
extern void _ZN3aaa3BB33fooEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33333223barEv,_ZThn28_N3aaa9GG33333223barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333322E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33333223barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333322E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333223barEv,_ZThn8_N3aaa9GG33333223barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3AA33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333223barEv,_ZThn20_N3aaa9GG33333223barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333322E[0]),
  (VTBL_ENTRY)&_ZN3aaa3BB33fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333223barEv,_ZThn28_N3aaa9GG33333223barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333322E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333322E[];
Class_Descriptor cd__ZN3aaa9GG3333322E = {  "_ZN3aaa9GG3333322E", // class name
  bases__ZN3aaa9GG3333322E, 6,
  &(vtc__ZN3aaa9GG3333322E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333322E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333322E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333323  : ::aaa::EE333 , ::aaa::FF332 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33333233fooEv
  virtual void  bar(); // _ZN3aaa9GG33333233barEv
  ~GG3333323(); // tgen
  GG3333323(); // tgen
};
//SIG(1 _ZN3aaa9GG3333323E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333323 ::foo(){vfunc_called(this, "_ZN3aaa9GG33333233fooEv");}
void  aaa::GG3333323 ::bar(){vfunc_called(this, "_ZN3aaa9GG33333233barEv");}
aaa::GG3333323 ::~GG3333323(){ note_dtor("_ZN3aaa9GG3333323E", this);} // tgen
aaa::GG3333323 ::GG3333323(){ note_ctor("_ZN3aaa9GG3333323E", this);} // tgen
}
static void Test__ZN3aaa9GG3333323E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333323E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333323E, buf);
    ::aaa::GG3333323 *dp, &lv = *(dp=new (buf) ::aaa::GG3333323());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333323E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333323E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333323E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333323E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3333323E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF332*), ABISELECT(48,28), "_ZN3aaa9GG3333323E");
    check_base_class_offset(lv, (::aaa::FF332*), ABISELECT(32,20), "_ZN3aaa9GG3333323E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333323E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333323E);
    dp->::aaa::GG3333323::~GG3333323();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333323E(Test__ZN3aaa9GG3333323E, "_ZN3aaa9GG3333323E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333323C1Ev();
extern void _ZN3aaa9GG3333323D1Ev();
Name_Map name_map__ZN3aaa9GG3333323E[] = {
  NSPAIR(_ZN3aaa9GG3333323C1Ev),
  NSPAIR(_ZN3aaa9GG3333323D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF332E;
extern VTBL_ENTRY _ZTIN3aaa5FF332E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF332E[];
static Base_Class bases__ZN3aaa9GG3333323E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF332E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333323E[];
extern void _ZN3aaa9GG33333233fooEv();
extern void _ZN3aaa9GG33333233barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33333233fooEv,_ZThn8_N3aaa9GG33333233fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33333233barEv,_ZThn8_N3aaa9GG33333233barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333233fooEv,_ZThn20_N3aaa9GG33333233fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333233barEv,_ZThn20_N3aaa9GG33333233barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33333233fooEv,_ZThn28_N3aaa9GG33333233fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33333233barEv,_ZThn28_N3aaa9GG33333233barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333323E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333323E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33333233fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33333233barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333233fooEv,_ZThn8_N3aaa9GG33333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333233barEv,_ZThn8_N3aaa9GG33333233barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333233fooEv,_ZThn20_N3aaa9GG33333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333233barEv,_ZThn20_N3aaa9GG33333233barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333323E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333233fooEv,_ZThn28_N3aaa9GG33333233fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333233barEv,_ZThn28_N3aaa9GG33333233barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333323E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333323E[];
Class_Descriptor cd__ZN3aaa9GG3333323E = {  "_ZN3aaa9GG3333323E", // class name
  bases__ZN3aaa9GG3333323E, 6,
  &(vtc__ZN3aaa9GG3333323E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333323E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333323E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333331  : ::aaa::EE333 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33333313fooEv
  ~GG3333331(); // tgen
  GG3333331(); // tgen
};
//SIG(1 _ZN3aaa9GG3333331E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v3 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333331 ::foo(){vfunc_called(this, "_ZN3aaa9GG33333313fooEv");}
aaa::GG3333331 ::~GG3333331(){ note_dtor("_ZN3aaa9GG3333331E", this);} // tgen
aaa::GG3333331 ::GG3333331(){ note_ctor("_ZN3aaa9GG3333331E", this);} // tgen
}
static void Test__ZN3aaa9GG3333331E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333331E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333331E, buf);
    ::aaa::GG3333331 *dp, &lv = *(dp=new (buf) ::aaa::GG3333331());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333331E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333331E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333331E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333331E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3333331E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3333331E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3333331E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333331E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333331E);
    dp->::aaa::GG3333331::~GG3333331();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333331E(Test__ZN3aaa9GG3333331E, "_ZN3aaa9GG3333331E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333331C1Ev();
extern void _ZN3aaa9GG3333331D1Ev();
Name_Map name_map__ZN3aaa9GG3333331E[] = {
  NSPAIR(_ZN3aaa9GG3333331C1Ev),
  NSPAIR(_ZN3aaa9GG3333331D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3333331E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333331E[];
extern void _ZN3aaa9GG33333313fooEv();
extern void _ZN3aaa5EE3333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33333313fooEv,_ZThn8_N3aaa9GG33333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333313fooEv,_ZThn20_N3aaa9GG33333313fooEv)();
extern void _ZN3aaa5FF3333barEv();
extern void ABISELECT(_ZThn48_N3aaa9GG33333313fooEv,_ZThn28_N3aaa9GG33333313fooEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333331E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333331E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33333313fooEv,
  (VTBL_ENTRY)&_ZN3aaa5EE3333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333313fooEv,_ZThn8_N3aaa9GG33333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333barEv,_ZThn8_N3aaa5EE3333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333313fooEv,_ZThn20_N3aaa9GG33333313fooEv),
  (VTBL_ENTRY)&_ZN3aaa5FF3333barEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333331E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333313fooEv,_ZThn28_N3aaa9GG33333313fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333barEv,_ZThn8_N3aaa5FF3333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333331E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333331E[];
Class_Descriptor cd__ZN3aaa9GG3333331E = {  "_ZN3aaa9GG3333331E", // class name
  bases__ZN3aaa9GG3333331E, 6,
  &(vtc__ZN3aaa9GG3333331E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333331E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333331E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333332  : ::aaa::EE333 , ::aaa::FF333 {
  int pg;
  virtual void  bar(); // _ZN3aaa9GG33333323barEv
  ~GG3333332(); // tgen
  GG3333332(); // tgen
};
//SIG(1 _ZN3aaa9GG3333332E) C1{ BC2{ BC3{ v2 v1 Fi} BC4{ v2 v1 Fi} v2 v1 Fi} BC5{ BC3 BC4 v3 v1 Fi} v1 Fi}
}
namespace aaa { 
void  aaa::GG3333332 ::bar(){vfunc_called(this, "_ZN3aaa9GG33333323barEv");}
aaa::GG3333332 ::~GG3333332(){ note_dtor("_ZN3aaa9GG3333332E", this);} // tgen
aaa::GG3333332 ::GG3333332(){ note_ctor("_ZN3aaa9GG3333332E", this);} // tgen
}
static void Test__ZN3aaa9GG3333332E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333332E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333332E, buf);
    ::aaa::GG3333332 *dp, &lv = *(dp=new (buf) ::aaa::GG3333332());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333332E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333332E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333332E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333332E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3333332E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3333332E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3333332E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333332E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333332E);
    dp->::aaa::GG3333332::~GG3333332();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333332E(Test__ZN3aaa9GG3333332E, "_ZN3aaa9GG3333332E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333332C1Ev();
extern void _ZN3aaa9GG3333332D1Ev();
Name_Map name_map__ZN3aaa9GG3333332E[] = {
  NSPAIR(_ZN3aaa9GG3333332C1Ev),
  NSPAIR(_ZN3aaa9GG3333332D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3333332E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333332E[];
extern void _ZN3aaa5EE3333fooEv();
extern void _ZN3aaa9GG33333323barEv();
extern void ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33333323barEv,_ZThn8_N3aaa9GG33333323barEv)();
extern void _ZN3aaa5FF3333fooEv();
extern void ABISELECT(_ZThn32_N3aaa9GG33333323barEv,_ZThn20_N3aaa9GG33333323barEv)();
extern void ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33333323barEv,_ZThn28_N3aaa9GG33333323barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333332E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5EE3333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33333323barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5EE3333fooEv,_ZThn8_N3aaa5EE3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333323barEv,_ZThn8_N3aaa9GG33333323barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333332E[0]),
  (VTBL_ENTRY)&_ZN3aaa5FF3333fooEv,
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333323barEv,_ZThn20_N3aaa9GG33333323barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333332E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa5FF3333fooEv,_ZThn8_N3aaa5FF3333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333323barEv,_ZThn28_N3aaa9GG33333323barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333332E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333332E[];
Class_Descriptor cd__ZN3aaa9GG3333332E = {  "_ZN3aaa9GG3333332E", // class name
  bases__ZN3aaa9GG3333332E, 6,
  &(vtc__ZN3aaa9GG3333332E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333332E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333332E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus
namespace aaa { 
struct  GG3333333  : ::aaa::EE333 , ::aaa::FF333 {
  int pg;
  virtual void  foo(); // _ZN3aaa9GG33333333fooEv
  virtual void  bar(); // _ZN3aaa9GG33333333barEv
  ~GG3333333(); // tgen
  GG3333333(); // tgen
};
//SIG(1 _ZN3aaa9GG3333333E) C1{ BC2{ BC3{ v1 v2 Fi} BC4{ v1 v2 Fi} v1 v2 Fi} BC5{ BC3 BC4 v1 v2 Fi} v1 v2 Fi}
}
namespace aaa { 
void  aaa::GG3333333 ::foo(){vfunc_called(this, "_ZN3aaa9GG33333333fooEv");}
void  aaa::GG3333333 ::bar(){vfunc_called(this, "_ZN3aaa9GG33333333barEv");}
aaa::GG3333333 ::~GG3333333(){ note_dtor("_ZN3aaa9GG3333333E", this);} // tgen
aaa::GG3333333 ::GG3333333(){ note_ctor("_ZN3aaa9GG3333333E", this);} // tgen
}
static void Test__ZN3aaa9GG3333333E()
{
  extern Class_Descriptor cd__ZN3aaa9GG3333333E;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd__ZN3aaa9GG3333333E, buf);
    ::aaa::GG3333333 *dp, &lv = *(dp=new (buf) ::aaa::GG3333333());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(_ZN3aaa9GG3333333E)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(_ZN3aaa9GG3333333E)");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::EE333*), 0, "_ZN3aaa9GG3333333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::EE333*), ABISELECT(16,8), "_ZN3aaa9GG3333333E");
    check_base_class_offset(lv, (::aaa::EE333*), 0, "_ZN3aaa9GG3333333E");
    check_base_class_offset(lv, (::aaa::AA3*)(::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3333333E");
    check_base_class_offset(lv, (::aaa::BB3*)(::aaa::FF333*), ABISELECT(48,28), "_ZN3aaa9GG3333333E");
    check_base_class_offset(lv, (::aaa::FF333*), ABISELECT(32,20), "_ZN3aaa9GG3333333E");
    check_field_offset(lv, pg, ABISELECT(64,40), "_ZN3aaa9GG3333333E.pg");
    test_class_info(&lv, &cd__ZN3aaa9GG3333333E);
    dp->::aaa::GG3333333::~GG3333333();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me v_ZN3aaa9GG3333333E(Test__ZN3aaa9GG3333333E, "_ZN3aaa9GG3333333E", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN3aaa9GG3333333C1Ev();
extern void _ZN3aaa9GG3333333D1Ev();
Name_Map name_map__ZN3aaa9GG3333333E[] = {
  NSPAIR(_ZN3aaa9GG3333333C1Ev),
  NSPAIR(_ZN3aaa9GG3333333D1Ev),
  {0,0}
};
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5EE333E;
extern VTBL_ENTRY _ZTIN3aaa5EE333E[];
extern  VTBL_ENTRY _ZTVN3aaa5EE333E[];
extern Class_Descriptor cd__ZN3aaa3AA3E;
extern VTBL_ENTRY _ZTIN3aaa3AA3E[];
extern  VTBL_ENTRY _ZTVN3aaa3AA3E[];
extern Class_Descriptor cd__ZN3aaa3BB3E;
extern VTBL_ENTRY _ZTIN3aaa3BB3E[];
extern  VTBL_ENTRY _ZTVN3aaa3BB3E[];
extern Class_Descriptor cd__ZN3aaa5FF333E;
extern VTBL_ENTRY _ZTIN3aaa5FF333E[];
extern  VTBL_ENTRY _ZTVN3aaa5FF333E[];
static Base_Class bases__ZN3aaa9GG3333333E[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd__ZN3aaa3AA3E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5EE333E,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd__ZN3aaa3AA3E,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa3BB3E,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    5, //immediately_derived
  0, 0},
  {&cd__ZN3aaa5FF333E,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    6, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTIN3aaa9GG3333333E[];
extern void _ZN3aaa9GG33333333fooEv();
extern void _ZN3aaa9GG33333333barEv();
extern void ABISELECT(_ZThn16_N3aaa9GG33333333fooEv,_ZThn8_N3aaa9GG33333333fooEv)();
extern void ABISELECT(_ZThn16_N3aaa9GG33333333barEv,_ZThn8_N3aaa9GG33333333barEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333333fooEv,_ZThn20_N3aaa9GG33333333fooEv)();
extern void ABISELECT(_ZThn32_N3aaa9GG33333333barEv,_ZThn20_N3aaa9GG33333333barEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33333333fooEv,_ZThn28_N3aaa9GG33333333fooEv)();
extern void ABISELECT(_ZThn48_N3aaa9GG33333333barEv,_ZThn28_N3aaa9GG33333333barEv)();
static  VTBL_ENTRY vtc__ZN3aaa9GG3333333E[] = {
  0,
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333333E[0]),
  (VTBL_ENTRY)&_ZN3aaa9GG33333333fooEv,
  (VTBL_ENTRY)&_ZN3aaa9GG33333333barEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333333fooEv,_ZThn8_N3aaa9GG33333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3aaa9GG33333333barEv,_ZThn8_N3aaa9GG33333333barEv),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333333fooEv,_ZThn20_N3aaa9GG33333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn32_N3aaa9GG33333333barEv,_ZThn20_N3aaa9GG33333333barEv),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTIN3aaa9GG3333333E[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333333fooEv,_ZThn28_N3aaa9GG33333333fooEv),
  (VTBL_ENTRY)&ABISELECT(_ZThn48_N3aaa9GG33333333barEv,_ZThn28_N3aaa9GG33333333barEv),
};
extern VTBL_ENTRY _ZTIN3aaa9GG3333333E[];
extern  VTBL_ENTRY _ZTVN3aaa9GG3333333E[];
Class_Descriptor cd__ZN3aaa9GG3333333E = {  "_ZN3aaa9GG3333333E", // class name
  bases__ZN3aaa9GG3333333E, 6,
  &(vtc__ZN3aaa9GG3333333E[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTIN3aaa9GG3333333E),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTVN3aaa9GG3333333E),16, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  6, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

